作者:过往记忆 | 新浪微博:左手牵右手TEL |
可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明
推酷网禁止转载本博客文章
博客地址:http://www.iteblog.com/
文章标题:《Spark在Yarn上运行Wordcount程序》
本文链接:http://www.iteblog.com/archives/1028
Hadoop、Hive、Hbase、Flume等QQ交流群:138615359(已满),请加入新群:149892483
本博客的微信公共帐号为:iteblog_hadoop,欢迎大家关注。
如果你觉得本文对你有帮助,不妨分享一次,你的每次支持,都是对我最大的鼓励
如果本文的内容对您的学习和工作有所帮助,不妨支付宝赞助(wyphao.2007@163.com)一下
本博客最近经常出现无法访问情况说明
我们在接触Hadoop的时候,第一个列子一般是运行Wordcount程序,在Spark我们可以用Java代码写一个Wordcount程序并部署在Yarn上运行。我们知道,在Spark源码中就存在一个用Java编写好的JavaWordCount程序,源码如下:
01 | package org.apache.spark.examples; |
03 | import org.apache.spark.api.java.JavaPairRDD; |
04 | import org.apache.spark.api.java.JavaRDD; |
05 | import org.apache.spark.api.java.Java<span class = "wp_keywordlink_affiliate" ><a title= "" href= "http://www.iteblog.com/archives/tag/spark" target= "_blank" data-original-title= "View all posts in Spark" >Spark</a></span>Context; |
06 | import org.apache.spark.api.java.function.FlatMapFunction; |
07 | import org.apache.spark.api.java.function.Function2; |
08 | import org.apache.spark.api.java.function.PairFunction; |
11 | import java.util.Arrays; |
13 | import java.util.regex.Pattern; |
15 | public final class JavaWordCount { |
16 | private static final Pattern SPACE = Pattern.compile( " " ); |
18 | public static void main(String[] args) throws Exception { |
19 | if (args.length < 2 ) { |
20 | System.err.println( "Usage: JavaWordCount <master> <file>" ); |
24 | JavaSparkContext ctx = new JavaSparkContext(args[ 0 ], |
26 | System.getenv( "SPARK_HOME" ), |
27 | JavaSparkContext.jarOfClass(JavaWordCount. class )); |
28 | JavaRDD<String> lines = ctx.textFile(args[ 1 ], 1 ); |
30 | JavaRDD<String> words = lines.flatMap( |
31 | new FlatMapFunction<String, String>() { |
33 | public Iterable<String> call(String s) { |
34 | return Arrays.asList(SPACE.split(s)); |
38 | JavaPairRDD<String, Integer> ones = words.map( |
39 | new PairFunction<String, String, Integer>() { |
41 | public Tuple2<String, Integer> call(String s) { |
42 | return new Tuple2<String, Integer>(s, 1 ); |
46 | JavaPairRDD<String, Integer> counts = ones.reduceByKey( |
47 | new Function2<Integer, Integer, Integer>() { |
49 | public Integer call(Integer i1, Integer i2) { |
54 | List<Tuple2<String, Integer>> output = counts.collect(); |
55 | for (Tuple2<?, ?> tuple : output) { |
56 | System.out.println(tuple._1() + ": " + tuple._2()); |
这里有必要介绍一下这里用到的几个函数。首先是map函数,它根据现有的数据集返回一个新的分布式数据集,由每个原元素经过func函数转换后组成,这个过程一般叫做转换(transformation);flatMap函数类似于map函数,但是每一个输入元素,会被映射为0到多个输出元素,因此,func函数的返回值是一个Seq,而不是单一元素,可以从上面的代码中看出;reduceByKey函数在一个(K,V)对的数据集上使用,返回一个(K,V)对的数据集,key相同的值,都被使用指定的reduce函数聚合到一起。
运行上面的代码之前你得先编译好(话说我好几次用Maven编译老是不成功啊,不过大家可以用./sbt/sbt assembly进行编译)。编译好之后可以用下面的命令进行运行:
2 | org.apache.spark.deploy.yarn.Client \ |
3 | --jar ./jars/spark-examples-assembly- 0.9 . 1 .jar \ |
4 | -- class org.apache.spark.examples.JavaWordCount \ |
5 | --args yarn-standalone \ |
6 | --args /home/wyp/cite75_99.txt \ |
org.apache.spark.examples.JavaWordCount类接收两个参数,第一个参数指定你程序运行的master;第二个参数指定你需要计算Wordcount文件的绝对路径,这个文件需要在HDFS上。程序运行的过程中我们可以在Hadoop的WEB UI上进行查看,程序运行完的时候,可以在logs里面看到运行的结果,类似下面:
当然,程序默认的输出直接输到logs里面去了,我们可以将结果输出到文本里面,修改如下:
1 | counts.saveAsTextFile( "/home/wyp/result" ); |
5 | counts.saveAsHadoopFile( "/home/wyp/result" , |
8 | TextOutputFormat. class ); |
上面的两行代码都可以将计算的结果存储到HDFS上的/home/wyp/result文件夹里面,但是两者输出来的结果内容格式是有区别的,第一种输出内容格式如下:
格式是(key, value)的;第二种输出内容格式如下:
格式是key value。我们可以根据自己的需要定义一个自己的输出格式,而且我们在输出的时候如果文件比较大,还可以指定输出文件的压缩方式。