Spark在Yarn上运行Wordcount程序

公告: 关于禁止推酷网站收录本博客文章    Hadoop、Hive、Hbase、Flume等交流群:138615359(定期清人)、群149892483 (定期清人)
  1. 文章总数:276
  2. 浏览总数:1,157,002
  3. 评论:8196
  4. 分类目录:31 个
  5. 注册用户数:4785
  6. 最后更新:2014年11月30日

欢迎关注微信公共帐号:
iteblog_hadoop

Spark在Yarn上运行Wordcount程序

Spark w397090770 2014-05-04 16:26:58  刚刚 4480℃ 0评论

作者:过往记忆 | 新浪微博:左手牵右手TEL |
可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明
推酷网禁止转载本博客文章
博客地址:
文章标题:
本文链接:
Hadoop、Hive、Hbase、Flume等QQ交流群:138615359(已满),请加入新群:149892483

本博客的微信公共帐号为:iteblog_hadoop,欢迎大家关注。
如果你觉得本文对你有帮助,不妨分享一次,你的每次支持,都是对我最大的鼓励

如果本文的内容对您的学习和工作有所帮助,不妨支付宝赞助(wyphao.2007@163.com)一下


本博客最近经常出现无法访问情况说明

  我们在接触Hadoop的时候,第一个列子一般是运行Wordcount程序,在Spark我们可以用Java代码写一个Wordcount程序并部署在Yarn上运行。我们知道,在Spark源码中就存在一个用Java编写好的JavaWordCount程序,源码如下:

01package org.apache.spark.examples;
02 
03import org.apache.spark.api.java.JavaPairRDD;
04import org.apache.spark.api.java.JavaRDD;
05import 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;
06import org.apache.spark.api.java.function.FlatMapFunction;
07import org.apache.spark.api.java.function.Function2;
08import org.apache.spark.api.java.function.PairFunction;
09import scala.Tuple2;
10 
11import java.util.Arrays;
12import java.util.List;
13import java.util.regex.Pattern;
14 
15public final class JavaWordCount {
16    private static final Pattern SPACE = Pattern.compile(" ");
17 
18    public static void main(String[] args) throws Exception {
19        if (args.length < 2) {
20            System.err.println("Usage: JavaWordCount <master> <file>");
21            System.exit(1);
22        }
23 
24        JavaSparkContext ctx = new JavaSparkContext(args[0],
25                "JavaWordCount",
26                System.getenv("SPARK_HOME"),
27                JavaSparkContext.jarOfClass(JavaWordCount.class));
28        JavaRDD<String> lines = ctx.textFile(args[1], 1);
29 
30        JavaRDD<String> words = lines.flatMap(
31                new FlatMapFunction<String, String>() {
32                    @Override
33                    public Iterable<String> call(String s) {
34                        return Arrays.asList(SPACE.split(s));
35                    }
36                });
37 
38        JavaPairRDD<String, Integer> ones = words.map(
39                new PairFunction<String, String, Integer>() {
40                    @Override
41                    public Tuple2<String, Integer> call(String s) {
42                        return new Tuple2<String, Integer>(s, 1);
43                    }
44                });
45 
46        JavaPairRDD<String, Integer> counts = ones.reduceByKey(
47                new Function2<Integer, Integer, Integer>() {
48                    @Override
49                    public Integer call(Integer i1, Integer i2) {
50                        return i1 + i2;
51                    }
52                });
53 
54        List<Tuple2<String, Integer>> output = counts.collect();
55        for (Tuple2<?, ?> tuple : output) {
56            System.out.println(tuple._1() + ": " + tuple._2());
57        }
58        System.exit(0);
59    }
60}

  这里有必要介绍一下这里用到的几个函数。首先是map函数,它根据现有的数据集返回一个新的分布式数据集,由每个原元素经过func函数转换后组成,这个过程一般叫做转换(transformation);flatMap函数类似于map函数,但是每一个输入元素,会被映射为0到多个输出元素,因此,func函数的返回值是一个Seq,而不是单一元素,可以从上面的代码中看出;reduceByKey函数在一个(K,V)对的数据集上使用,返回一个(K,V)对的数据集,key相同的值,都被使用指定的reduce函数聚合到一起。
  运行上面的代码之前你得先编译好(话说我好几次用Maven编译老是不成功啊,不过大家可以用./sbt/sbt assembly进行编译)。编译好之后可以用下面的命令进行运行:

1./bin/spark-class                                 \
2org.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里面看到运行的结果,类似下面:

01submitting: 1
02find: 1
03versions: 4
04Regression: 1
05via: 2
06tests: 2
07open: 2
08./bin/spark-shell: 1
09When: 1
10All: 1
11download: 1
12requires: 2
13SPARK_YARN=true: 3
14Testing: 1
15take: 1
16project: 4
17no: 1
18systems.: 1
19file: 1
20Or,: 1
21About: 1
22project's: 3
23programs: 2
24given.: 1
25obtained: 1
26sbt/sbt: 5
27artifact: 1
28SBT: 1
29local[2]: 1
30not: 1
31runs.: 1
32you: 5
33building: 1

当然,程序默认的输出直接输到logs里面去了,我们可以将结果输出到文本里面,修改如下:

1counts.saveAsTextFile("/home/wyp/result");
2 
3或者:
4 
5counts.saveAsHadoopFile("/home/wyp/result",
6                                Text.class,
7                         IntWritable.class,
8                   TextOutputFormat.class);

上面的两行代码都可以将计算的结果存储到HDFS上的/home/wyp/result文件夹里面,但是两者输出来的结果内容格式是有区别的,第一种输出内容格式如下:

01(5,5)
02(1,1)
03(15,1)
04(7,6)
05(11,5)
06(14,2)
07(3,3)
08(8,6)
09(6,6)
10(12,4)
11(4,4)
12(10,6)
13(13,3)
14(2,2)
15(9,6)

格式是(key, value)的;第二种输出内容格式如下:

015   5
021   1
0315  1
047   6
0511  5
0614  2
073   3
088   6
096   6
1012  4
114   4
1210  6
1313  3
142   2
159   6

格式是key    value。我们可以根据自己的需要定义一个自己的输出格式,而且我们在输出的时候如果文件比较大,还可以指定输出文件的压缩方式。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值