zoukankan      html  css  js  c++  java
  • Spark编程环境搭建(基于Intellij IDEA的Ultimate版本)(包含Java和Scala版的WordCount)(博主强烈推荐)

    福利 => 每天都推送 

    欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑         Java全栈大联盟
     
         每天都有大量的学习视频资料和精彩技术文章推送... 人生不易,唯有努力。
     
         百家号 :九月哥快讯               快手号:  jiuyuege
     
     
     
     
     
     

      为什么,我要在这里提出要用Ultimate版本。

    IDEA Community(社区版)再谈之无奈之下还是去安装旗舰版

    IntelliJ IDEA的黑白色背景切换(Ultimate和Community版本皆通用)

    使用 IntelliJ IDEA 导入 Spark 最新源码及编译 Spark 源代码

    IDEA里如何多种方式打jar包,然后上传到集群

    IntelliJ IDEA(Community版本)的下载、安装和WordCount的初步使用(本地模式和集群模式)

    IntelliJ IDEA(Ultimate版本)的下载、安装和WordCount的初步使用(本地模式和集群模式)

    基于Intellij IDEA搭建Spark开发环境搭——参考文档

        参考文档http://spark.apache.org/docs/latest/programming-guide.html

    操作步骤

      a)创建maven 项目

      b)引入依赖(Spark 依赖、打包插件等等)

    基于Intellij IDEA搭建Spark开发环境—maven vs sbt

      a)哪个熟悉用哪个

      b)Maven也可以构建scala项目

    基于Intellij IDEA搭建Spark开发环境搭—maven构建scala项目

      参考文档http://docs.scala-lang.org/tutorials/scala-with-maven.html

    操作步骤

      a) 用maven构建scala项目(基于net.alchim31.maven:scala-archetype-simple)

    GroupId:zhouls.bigdata
    ArtifactId:mySpark
    Version:1.0-SNAPSHOT

    mySpark
    
    E:CodeIntelliJIDEAUltimateVersionCodemySpark

     

       因为,我本地的scala版本是2.10.5

      选中,delete就好。

     

      其实,这个就是windows里的cmd终端,只是IDEA它把这个cmd终端集成到这了。

    mvn clean package

      这只是做个测试而已。

     b)pom.xml引入依赖(spark依赖、打包插件等等)

      注意:scala与java版本的兼容性

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>zhouls.bigdata</groupId>
        <artifactId>mySpark</artifactId>
        <version>1.0-SNAPSHOT</version>
        <name>mySpark</name>
        <inceptionYear>2008</inceptionYear>
        <properties>
            <scala.version>2.10.5</scala.version>
            <spark.version>1.6.1</spark.version>
        </properties>
    
        <repositories>
            <repository>
                <id>scala-tools.org</id>
                <name>Scala-Tools Maven2 Repository</name>
                <url>http://scala-tools.org/repo-releases</url>
            </repository>
        </repositories>
    
        <pluginRepositories>
            <pluginRepository>
                <id>scala-tools.org</id>
                <name>Scala-Tools Maven2 Repository</name>
                <url>http://scala-tools.org/repo-releases</url>
            </pluginRepository>
        </pluginRepositories>
    
        <dependencies>
            <dependency>
                <groupId>org.scala-lang</groupId>
                <artifactId>scala-library</artifactId>
                <version>${scala.version}</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.4</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.specs</groupId>
                <artifactId>specs</artifactId>
                <version>1.2.5</version>
                <scope>test</scope>
            </dependency>
            <!--spark -->
            <dependency>
                <groupId>org.apache.spark</groupId>
                <artifactId>spark-core_2.10</artifactId>
                <version>${spark.version}</version>
                <scope>provided</scope>
            </dependency>
        </dependencies>
    
        <build>
            <!--
            <sourceDirectory>src/main/scala</sourceDirectory>
            <testSourceDirectory>src/test/scala</testSourceDirectory>
            -->
            <plugins>
                <plugin>
                    <groupId>org.scala-tools</groupId>
                    <artifactId>maven-scala-plugin</artifactId>
                    <executions>
                        <execution>
                            <goals>
                                <goal>compile</goal>
                                <goal>testCompile</goal>
                            </goals>
                        </execution>
                    </executions>
                    <configuration>
                        <scalaVersion>${scala.version}</scalaVersion>
                        <args>
                            <arg>-target:jvm-1.5</arg>
                        </args>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-eclipse-plugin</artifactId>
                    <configuration>
                        <downloadSources>true</downloadSources>
                        <buildcommands>
                            <buildcommand>ch.epfl.lamp.sdt.core.scalabuilder</buildcommand>
                        </buildcommands>
                        <additionalProjectnatures>
                            <projectnature>ch.epfl.lamp.sdt.core.scalanature</projectnature>
                        </additionalProjectnatures>
                        <classpathContainers>
                            <classpathContainer>org.eclipse.jdt.launching.JRE_CONTAINER</classpathContainer>
                            <classpathContainer>ch.epfl.lamp.sdt.launching.SCALA_CONTAINER</classpathContainer>
                        </classpathContainers>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-shade-plugin</artifactId>
                    <version>2.4.1</version>
                    <executions>
                        <!-- Run shade goal on package phase -->
                        <execution>
                            <phase>package</phase>
                            <goals>
                                <goal>shade</goal>
                            </goals>
                            <configuration>
                                <transformers>
                                    <!-- add Main-Class to manifest file -->
                                    <transformer
                                            implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                        <!--<mainClass>com.dajiang.MyDriver</mainClass>-->
                                    </transformer>
                                </transformers>
                                <createDependencyReducedPom>false</createDependencyReducedPom>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
        <reporting>
            <plugins>
                <plugin>
                    <groupId>org.scala-tools</groupId>
                    <artifactId>maven-scala-plugin</artifactId>
                    <configuration>
                        <scalaVersion>${scala.version}</scalaVersion>
                    </configuration>
                </plugin>
            </plugins>
        </reporting>
    </project>

     

       为了养成,开发规范。

      默认,创建是没有生效的,比如做如下,才能生效。

       同样,对于下面的单元测试,也是一样

      默认,也是没有生效的。

      必须做如下的动作,才能生效。

     

     

       

    开发第一个Spark程序

    在IDEA中新建的maven项目,无法创建.scala文件

    scala入门-01-IDEA安装scala插件

     

      a) 第一个Scala版本的spark程序

    package zhouls.bigdata
    import org.apache.spark.{SparkConf, SparkContext}
    
    /**
      * Created by zhouls on 2016-6-19.
      */
    object MyScalaWordCount {
      def main(args: Array[String]): Unit = {
        //参数检查
        if (args.length < 2) {
          System.err.println("Usage: MyScalaWordCout <input> <output> ")
          System.exit(1)
        }
        //获取参数
        val input=args(0)
        val output=args(1)
        //创建scala版本的SparkContext
        val conf=new SparkConf().setAppName("MyScalaWordCout ")
        val sc=new SparkContext(conf)
        //读取数据
        val lines=sc.textFile(input)
        //进行相关计算
        val resultRdd=lines.flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_)
        //保存结果
        resultRdd.saveAsTextFile(output)
        sc.stop()
      }
    }

      b) 第一个Java版本的spark程序

    package zhouls.bigdata;
    
    import org.apache.spark.SparkConf;
    import org.apache.spark.api.java.JavaPairRDD;
    import org.apache.spark.api.java.JavaRDD;
    import org.apache.spark.api.java.JavaSparkContext;
    import org.apache.spark.api.java.function.FlatMapFunction;
    import org.apache.spark.api.java.function.Function2;
    import org.apache.spark.api.java.function.PairFunction;
    import scala.Tuple2;
    
    import java.util.Arrays;
    
    /**
     * Created by zhouls on 2016-6-19.
     */
    public class MyJavaWordCount {
        public static void main(String[] args) {
            //参数检查
            if(args.length<2){
                System.err.println("Usage: MyJavaWordCount <input> <output> ");
                System.exit(1);
            }
            //获取参数
            String input=args[0];
            String output=args[1];
    
            //创建java版本的SparkContext
            SparkConf conf=new SparkConf().setAppName("MyJavaWordCount");
            JavaSparkContext sc=new JavaSparkContext(conf);
            //读取数据
            JavaRDD inputRdd=sc.textFile(input);
            //进行相关计算
            JavaRDD words=inputRdd.flatMap(new FlatMapFunction() {
                public Iterable call(String line) throws Exception {
                    return Arrays.asList(line.split(" "));
                }
            });
    
            JavaPairRDD result=words.mapToPair(new PairFunction() {
                public Tuple2 call(String word) throws Exception {
                    return new Tuple2(word,1);
                }
            }).reduceByKey(new Function2() {
                public Integer call(Integer x, Integer y) throws Exception {
                    return x+y;
                }
            });
            //保存结果
            result.saveAsTextFile(output);
            //关闭sc
            sc.stop();
        }
    }

      或者

    package zhouls.bigdata;
    
    /**
     *Created by zhouls on 2016-6-19.
     */
    
    import org.apache.spark.SparkConf;
    import org.apache.spark.api.java.JavaPairRDD;
    import org.apache.spark.api.java.JavaRDD;
    import org.apache.spark.api.java.JavaSparkContext;
    import org.apache.spark.api.java.function.FlatMapFunction;
    import org.apache.spark.api.java.function.Function2;
    import org.apache.spark.api.java.function.PairFunction;
    import scala.Tuple2;
    
    import java.util.Arrays;
    import java.util.List;
    import java.util.regex.Pattern;
    
    public final class MyJavaWordCount {
        private static final Pattern SPACE = Pattern.compile(" ");
    
        public static void main(String[] args) throws Exception {
    
            if (args.length < 1) {
                System.err.println("Usage: MyJavaWordCount <file>");
                System.exit(1);
            }
    
            SparkConf sparkConf = new SparkConf().setAppName("MyJavaWordCount ");
            JavaSparkContext ctx = new JavaSparkContext(sparkConf);
            JavaRDD<String> lines = ctx.textFile(args[0], 1);
    
            JavaRDD<String> words = lines.flatMap(new FlatMapFunction<String, String>() {
                public Iterable<String> call(String s) {
                    return Arrays.asList(SPACE.split(s));
                }
            });
    
            JavaPairRDD<String, Integer> ones = words.mapToPair(new PairFunction<String, String, Integer>() {
                public Tuple2<String, Integer> call(String s) {
                    return new Tuple2<String, Integer>(s, 1);
                }
            });
    
            JavaPairRDD<String, Integer> counts = ones.reduceByKey(new Function2<Integer, Integer, Integer>() {
                public Integer call(Integer i1, Integer i2) {
                    return i1 + i2;
                }
            });
    
            List<Tuple2<String, Integer>> output = counts.collect();
            for (Tuple2<?, ?> tuple : output) {
                System.out.println(tuple._1() + ": " + tuple._2());
            }
            ctx.stop();
        }
    }

    运行自己开发第一个Spark程序

      Spark maven 项目打包

    IDEA里如何多种方式打jar包,然后上传到集群

      推荐下面这种方式

      1、先切换到此工程路径下

     

      默认,会到E:CodeIntelliJIDEAUltimateVersionCodemySpark>

    mvn clean package

    mvn package
     









      为了,更好的学习,其实,我们可以将它拷贝到桌面,去看看,是否真正打包进入。因为这里,是需要包括MyJavaWordCount.java和MyScalaWordCout.scala

     

    准备好数据

    [spark@sparksinglenode wordcount]$ pwd
    /home/spark/testspark/inputData/wordcount
    [spark@sparksinglenode wordcount]$ ll
    total 4
    -rw-rw-r-- 1 spark spark 92 Mar 24 18:45 wc.txt
    [spark@sparksinglenode wordcount]$ cat wc.txt 
    hadoop    spark
    storm    zookeeper
    scala    java
    hive    hbase
    mapreduce    hive
    hadoop    hbase
    spark    hadoop
    [spark@sparksinglenode wordcount]$ 

    上传好刚之前打好的jar包

     

    提交Spark 集群运行

      a) 提交Scala版本的Wordcount

      到$SPARK_HOME安装目录下,去执行如下命令。

    [spark@sparksinglenode spark-1.6.1-bin-hadoop2.6]$ $HADOOP_HOME/bin/hadoop fs -mkdir -p hdfs://sparksinglenode:9000/testspark/inputData/wordcount

     

     

    [spark@sparksinglenode spark-1.6.1-bin-hadoop2.6]$ $HADOOP_HOME/bin/hadoop fs -copyFromLocal /home/spark/testspark/inputData/wordcount/wc.txt  hdfs://sparksinglenode:9000/testspark/inputData/wordcount/

     

     

    [spark@sparksinglenode spark-1.6.1-bin-hadoop2.6]$ bin/spark-submit --class zhouls.bigdata.MyScalaWordCount /home/spark/testspark/mySpark-1.0-SNAPSHOT.jar hdfs://sparksinglenode:9000/testspark/inputData/wordcount/wc.txt hdfs://sparksinglenode:9000/testspark/outData/MyScalaWordCount

       注意,以上,是输入路径和输出都要在集群里。因为我这里的程序打包里,制定是在集群里(即hdfs)。所以只能用这种方法。

      成功!

     

    [spark@sparksinglenode spark-1.6.1-bin-hadoop2.6]$ $HADOOP_HOME/bin/hadoop fs -cat hdfs://sparksinglenode:9000/testspark/outData/MyScalaWordCount/part-*
    17/03/27 20:12:55 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
    (storm    zookeeper,1)
    (hadoop    spark,1)
    (spark    hadoop,1)
    (mapreduce    hive,1)
    (scala    java,1)
    (hive    hbase,1)
    (hadoop    hbase,1)
    [spark@sparksinglenode spark-1.6.1-bin-hadoop2.6]$ 

       注意:若想要在本地(即windows里或linux里能运行的话。则只需在程序代码里。注明是local就好,这个很简单。不多赘述,再打包。再运行就可以了。

    [spark@sparksinglenode spark-1.6.1-bin-hadoop2.6]$ bin/spark-submit --class zhouls.bigdata.MyScalaWordCount /home/spark/testspark/mySpark-1.0-SNAPSHOT.jar /home/spark/testspark/inputData/wordcount/wc.txt /home/spark/testspark/outData/MyScalaWordCount

      b) 提交Java版本的Wordcount

    [spark@sparksinglenode spark-1.6.1-bin-hadoop2.6]$ bin/spark-submit --class zhouls.bigdata.MyJavaWordCount /home/spark/testspark/mySpark-1.0-SNAPSHOT.jar hdfs://sparksinglenode:9000/testspark/inputData/wordcount/wc.txt hdfs://sparksinglenode:9000/testspark/outData/MyJavaWordCount

    storm    zookeeper: 1
    hadoop    spark: 1
    spark    hadoop: 1
    mapreduce    hive: 1
    scala    java: 1
    hive    hbase: 1
    hadoop    hbase: 1

     注意若想要在本地(即windows里或linux里能运行的话。则只需在程序代码里。注明是local就好,这个很简单。不多赘述,再打包。再运行就可以了。

    bin/spark-submit --class com.zhouls.test.MyJavaWordCount /home/spark/testspark/mySpark-1.0.SNAPSHOT.jar /home/spark/testspark/inputData/wordcount/wc.txt /home/spark/testspark/outData/MyJavaWordCount

       成功!

      关于对pom.xml的进一步深入,见

    对于maven创建spark项目的pom.xml配置文件(图文详解)

      推荐博客

    Scala IDEA for Eclipse里用maven来创建scala和java项目代码环境(图文详解)

    用maven来创建scala和java项目代码环境(图文详解)(Intellij IDEA(Ultimate版本)、Intellij IDEA(Community版本)和Scala IDEA for Eclipse皆适用)(博主推荐)

    欢迎大家,加入我的4个微信公众号:    大数据躺过的坑     Java从入门到架构师    人工智能躺过的坑     Java全栈大联盟    
     
     
     

    同时,大家可以关注我的个人博客

       http://www.cnblogs.com/zlslch/   和     http://www.cnblogs.com/lchzls/      http://www.cnblogs.com/sunnyDream/   

       详情请见:http://www.cnblogs.com/zlslch/p/7473861.html

      人生苦短,我愿分享。本公众号将秉持活到老学到老学习无休止的交流分享开源精神,汇聚于互联网和个人学习工作的精华干货知识,一切来于互联网,反馈回互联网。
      目前研究领域:大数据、机器学习、深度学习、人工智能、数据挖掘、数据分析。 语言涉及:Java、Scala、Python、Shell、Linux等 。同时还涉及平常所使用的手机、电脑和互联网上的使用技巧、问题和实用软件。 只要你一直关注和呆在群里,每天必须有收获

          对应本平台的讨论和答疑QQ群:大数据和人工智能躺过的坑(总群)(161156071) 

     

     

     

         打开百度App,扫码,精彩文章每天更新!欢迎关注我的百家号: 九月哥快讯

  • 相关阅读:
    成家撑家 不要妄自菲薄
    [文字20091204]佛说贪、嗔、痴、妒、慢、疑
    [文摘20091116]一生必看的88本书
    [文摘201009]演讲录全文:美国世界帝国战略与中国的危机 戴旭
    由 图标 加 文字 实现 按钮功能 的 图标按钮用户控件
    javascript Array扩展
    javascript Number对象
    纯CSS多级菜单2
    纯CSS相册2
    纯CSS多级菜单
  • 原文地址:https://www.cnblogs.com/zlslch/p/6607599.html
Copyright © 2011-2022 走看看