用java实现spark wordcount
步骤
1.初始化spark conf, 设置app name
SparkConf conf = new SparkConf(); conf.setAppName("JavaSparkWordCount-4-job011");
2.//构建java spark context
JavaSparkContext jsc =new JavaSparkContext(conf);
3.定义输入文件,本地或是hdfs等均可
if (args == null || args.length != 1) { System.err.println("传参有误 ,请检查!!!"); System.exit(-1); } String localFilePath = args[0];
4.构建file rdd=line rdd
JavaRDD<String> fileRDD = jsc.textFile(localFilePath);
5.lines rdd -> word rdd
JavaRDD<String> wordRDD = fileRDD.flatMap(new FlatMapFunction<String, String>() { @Override public Iterator<String> call(String line) throws Exception { return Arrays.asList(line.split("\\s+")).iterator(); } });
6.word rdd -> (word,1)的rdd
JavaPairRDD<String, Integer> kvPairRDD = wordRDD.mapToPair(new PairFunction<String, String, Integer>() { @Override public Tuple2<String, Integer> call(String word)throws Exception { return new Tuple2<String, Integer>(word, 1); } });
7.(word,1)的rdd ->(word,freq)的rdd
JavaPairRDD<String, Integer> wcPairRDD = kvPairRDD.reduceByKey(new Function2<Integer, Integer, Integer>() { @Override public Integer call(Integer v1, Integer v2)throws Exception { return v1 + v2; } });
8.将(word,freq) rdd -> collect 落地形成本地对象
List<Tuple2<String, Integer>> pairList = wcPairRDD.collect();
9.将对象数据打印出来
for (Tuple2<String, Integer> tuple2 : pairList) { System.out.println(tuple2); }
10.关闭上下文环境
jsc.stop();
三.在linux生产环境
#! /bin/sh
# 配置成hadoop配置文件存放目录
export HADOOP_CONF_DIR=/usr/hdp/3.1.0.0-78/hadoop/conf/ spark-submit \
--class com.tl.job014.spark.SparkWordCount4Java \
--master local[2] \
--driver-memory 512m \
--executor-memory 512m \
--num-executors 2 \ jar包所在的路径 文件所在的路径
注意事项:
yarn-client与yarn-cluster的区别
联系
两者都是通过yarn集群工作,都不可以访问本地的工作文件
区别
yarn-client 是在入口机上工作的,所以记过会打印在入口机上
yarn-cluster是在yarn的工作节点上的工作的,所以在入口机上看不见结果,得在yarn的集群上查看
在末端拼接的时候不可以在中间插入
filtermap 和map的区别
filtermap,是用来处理一行里有多个字段的,进行打散的操作
map,他只读,不