• [转] 用SBT编译Spark的WordCount程序


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


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

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

    1. |--build.sbt
    2. |--lib
    3. |--project
    4. |--src
    5. |   |--main
    6. |   |    |--scala
    7. |   |--test
    8. |         |--scala
    9. |--sbt
    10. |--target
    复制代码

    以上建立目录如下:

    1. mkdir -p ~/spark_wordcount/lib
    2. mkdir -p ~/spark_wordcount/project
    3. mkdir -p ~/spark_wordcount/src/main/scala
    4. mkdir -p ~/spark_wordcount/src/test/scala
    5. mkdir -p ~/spark_wordcount/target

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

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

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

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

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

    1. cp /path/to/spark/assembly/target/scala-2.10/spark-assembly_2.10-0.9.0-incubating-hadoop2.2.0.jar
    2. > ~/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的版本号,我们建立该文件,增加如下内容:

    1. sbt.version=0.12.4


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

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


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

    1. package spark.example

    2. import org.apache.spark._
    3. import SparkContext._

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

    到spark_wordcount目录,执行编译:

    1. cd ~/spark_wordcount/
    2. ./sbt compile

    打成jar包

    1. ./sbt package

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

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


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

    1. #!/usr/bin/env bash

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

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

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



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

  • 相关阅读:
    互联网: 让网站强制使用https
    非常好用的原型设计软件Balsamiq Mockups
    11.Mapreduce实例——MapReduce自定义输出格式
    01.Mapreduce实例——去重
    08.Mapreduce实例——倒排索引
    06.Mapreduce实例——Reduce端join
    05.Mapreduce实例——Map端join
    07.Mapreduce实例——二次排序
    02.Mapreduce实例——求平均值
    10.Mapreduce实例——MapReduce自定义输入格式小
  • 原文地址:https://www.cnblogs.com/qiangxia/p/4953250.html
Copyright © 2020-2023  润新知