zoukankan      html  css  js  c++  java
  • 用SBT编译Spark的WordCount程序

    问题导读:
    1.什么是sbt?
    2.sbt项目环境如何建立?
    3.如何使用sbt编译打包scala?

     sbt介绍
    sbt是一个代码编译工具,是scala界的mvn,可以编译scala,java等,需要java1.6以上。

    sbt项目环境建立
    sbt编译需要固定的目录格式,并且需要联网,sbt会将依赖的jar包下载到用户home的.ivy2下面,目录结构如下:

        |--build.sbt
        |--lib
        |--project
        |--src
        |   |--main
        |   |    |--scala
        |   |--test
        |         |--scala
        |--sbt
        |--target

    以上建立目录如下:

        mkdir -p ~/spark_wordcount/lib
        mkdir -p ~/spark_wordcount/project
        mkdir -p ~/spark_wordcount/src/main/scala
        mkdir -p ~/spark_wordcount/src/test/scala
        mkdir -p ~/spark_wordcount/target

    然后拷贝spark安装目录的sbt目录的 sbt脚本和sbt的jar包

    cp /path/to/spark/sbt/sbt* ~/spark_wordcount/

    由于spark的sbt脚本默认查找./sbt目录,修改如下

        JAR=sbt/sbt-launch-${SBT_VERSION}.jar
        to
        JAR=sbt-launch-${SBT_VERSION}.jar

    拷贝spark的jar包到,sbt的lib目录

        cp /path/to/spark/assembly/target/scala-2.10/spark-assembly_2.10-0.9.0-incubating-hadoop2.2.0.jar 
        > ~/spark_wordcount/lib/ 

    建立build.sbt配置文件,各行需要有一个空行分割

    1     name := "WordCount"
    2     [this is bank line]
    3     version := "1.0.0"
    4     [this is bank line]
    5     scalaVersion := "2.10.3"

    由于spark的sbt脚本需要到project的build.properties文件找sbt的版本号,我们建立该文件,增加如下内容:

    sbt.version=0.12.4

    Spark WordCount程序编写及编译
    建立WordCount.scala源文件,假设需要包为spark.example

        mkdir -p ~/spark_wordcount/src/main/scala/spark/example
        vi -p ~/spark_wordcount/src/main/scala/spark/example/WordCount.scala

    添加具体的程序代码,并保存

     1     package spark.example
     2 
     3     import org.apache.spark._
     4     import SparkContext._
     5 
     6     object WordCount {
     7       def main(args: Array[String]) {
     8         //命令行参数个数检查
     9         if (args.length == 0) {
    10           System.err.println("Usage: spark.example.WordCount <input> <output>")
    11           System.exit(1)
    12         }
    13         //使用hdfs文件系统
    14         val hdfsPathRoot = "hdfshost:9000"
    15         //实例化spark的上下文环境
    16         val spark = new SparkContext(args(0), "WordCount",
    17           System.getenv("SPARK_HOME"),SparkContext.jarOfClass(this.getClass))
    18         //读取输入文件
    19         val inputFile = spark.textFile(hdfsPathRoot + args(1))
    20         //执行WordCount计数
    21         //读取inputFile执行方法flatMap,将每行通过空格分词
    22         //然后将该词输出该词和计数的一个元组,并初始化计数
    23         //为 1,然后执行reduceByKey方法,对相同的词计数累
    24         //
    25         val countResult = inputFile.flatMap(line => line.split(" "))
    26                           .map(word => (word, 1))
    27                           .reduceByKey(_ + _)
    28         //输出WordCount结果到指定目录
    29         countResult.saveAsTextFile(hdfsPathRoot + args(2))
    30       }
    31     }

    到spark_wordcount目录,执行编译:

        cd ~/spark_wordcount/
        ./sbt compile

    打成jar包

    ./sbt package

    编译过程,sbt需要上网下载依赖工具包,jna,scala等。编译完成后可以在target/scala-2.10/目录找到打包好的jar

        [root@bd001 scala-2.10]# pwd
        /usr/local/hadoop/spark_wordcount/target/scala-2.10
        [root@bd001 scala-2.10]# ls
        cache  classes  wordcount_2.10-1.0.0.jar

    WordCount执行
    可以参考Spark分布式运行于hadoop的yarn上的方法,写一个执行脚本

     1     #!/usr/bin/env bash
     2 
     3     SPARK_JAR=./assembly/target/scala-2.10/spark-assembly_2.10-0.9.0-incubating-hadoop2.2.0.jar 
     4         ./bin/spark-class org.apache.spark.deploy.yarn.Client 
     5           --jar ~/spark_wordcount/target/scala-2.10/wordcount_2.10-1.0.0.jar 
     6           --class  spark.example.WordCount 
     7           --args yarn-standalone 
     8           --args /testWordCount.txt 
     9           --args /resultWordCount 
    10           --num-workers 3 
    11           --master-memory 4g 
    12           --worker-memory 2g 
    13           --worker-cores 2

    然后,拷贝一个名为testWordCount.txt的文件进hdfs

    hdfs dfs -copyFromLocal ./testWordCount.txt /testWordCount.txt

    执行脚本,过一会就可以看到结果了

  • 相关阅读:
    YaCy is a free search engine
    html css js dom树到底是什么关系
    清华的搜索课程
    Gentle中的O/R映射Attributes
    PHP headers_sent() 函数
    阿里云服务器怎么设置能让网站发邮件
    关于PHP 开启zlib gzip配置
    thinkphp无法加载控制器:Admin
    阿里云邮件服务器怎么设置才能在QQ邮箱访问,互发邮件?
    linux下配置apachenutch 笨笨熊
  • 原文地址:https://www.cnblogs.com/gaopeng527/p/4398225.html
Copyright © 2011-2022 走看看