提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
-
- 一、提出任务
- 二、完成任务
-
- (一)新建Maven项目
- (二)添加相关依赖和构建插件
- (三)创建日志属性文件
- (四)创建词频统计单例对象
- (五)本地运行程序,查看结果
一、提出任务
-
单词计数是学习分布式计算的入门程序,有很多种实现方式,例如MapReduce;使用Spark提供的RDD算子可以更加轻松地实现单词计数。
-
在IntelliJ IDEA中新建Maven管理的Spark项目,并在该项目中使用Scala语言编写Spark的WordCount程序,最后将项目打包提交到Spark集群(Standalone模式)中运行。
-
预备工作:启动集群的HDFS与Spark
- HDFS上的单词文件 – words.txt
二、完成任务
(一)新建Maven项目
- 新建Maven项目,基于JDK1.8
- 设置项目信息(项目名称、保存位置、组编号以及项目编号)
单击【Finish】按钮
- 将java目录改成scala目录
(二)添加相关依赖和构建插件
- 在pom.xml文件里添加依赖与Maven构建插件
4.0.0 net.Lee.rdd sparkRDDWordCount 1.0-SNAPSHOT org.scala-lang scala-library 2.11.12 org.apache.spark spark-core_2.11 2.1.1 src/main/scala org.apache.maven.plugins maven-assembly-plugin 3.3.0 jar-with-dependencies make-assembly package single net.alchim31.maven scala-maven-plugin 3.3.2 scala-compile-first process-resources add-source compile scala-test-compile process-test-resources testCompile
-由于源程序目录改成了scala,在元素里必须添加子元素,指定目录src/main/scala
(三)创建日志属性文件
- 在资源文件夹里创建日指数型文件 – log4j.properties
log4j.rootLogger=ERROR, stdout, logfile log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n log4j.appender.logfile=org.apache.log4j.FileAppender log4j.appender.logfile.File=target/spark.log log4j.appender.logfile.layout=org.apache.log4j.PatternLayout log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
(四)创建词频统计单例对象
- 在net.lj.rdd包里创建WordCount单例对象
package net.lj.rdd import org.apache.spark.{SparkConf, SparkContext} object WordCount { def main(args: Array[String]): Unit = { System.setProperty("HADOOP_USER_NAME","root") //创建Spark配置对象 val conf = new SparkConf() .setAppName("SparkRDDWordCount") //设置应用名称 .setMaster("local[*]") //设置主节点位置 //基于Spark配置对象创建Spark容器 val sc = new SparkContext(conf); //判断命令行参数个数 var inputPath = ""; var outputPath = ""; if (args.length == 0) { inputPath = "hdfs://192.168.23.10:9000/input/word.txt"; outputPath = "hdfs://192.168.23.10:9000/WC_result"; } else if (args.length == 1) { inputPath = args(0); //用户指定 outputPath = "hdfs://192.168.23.10:9000/WC_result"; } else if (args.length == 2) { inputPath = args(0); outputPath = args(1); } else { println() } //进行词频统计 val wc = sc.textFile(inputPath) //读取文件,得到rdd .flatMap(_.split(" ")) //扁平化映射,得到单词数组 .map((_, 1)) // 针对单词得到二元组(word,1) .reduceByKey(_ + _) //按键进行组合(key相同,value就累加) .sortBy(_._2, false) //按照单词个数降序排列 // .saveAsTextFile(outputPath); //词频统计结果保存到指定位置 //输出词频统计 wc.collect.foreach(println) //词频统计结果保存到指定位置 wc.saveAsTextFile(outputPath); //停止Spark容器,结束任务 sc.stop() } }
(五)本地运行程序,查看结果
- 首先看控制台输出结果
- 查看HDFS上的结果文件内容
- 有两个结果文件,我们可以分别查看其内容
- 创建文本文件 – word.txt
上传到HDFS的/input目录
- 给程序设置命令行参数(注意两个参数之间必须有空格)
hdfs://192.168.23.10:9000/input/word.txt hdfs://192.168.23.10:9000/word_result
- 运行程序,查看控制台输出结果
- 查看HDFS上的结果文件内容