Java本地测试
2017/11/13
1.先放出代码中各类注释
(由于初次学习,为方便以后复习或查阅,注释较多。为避免代码太“冗余”故将部分注释分出来。)
注释i )、
- 每个Spark应用程序都由一个驱动器程序(驱动器节点产生的,驱动器节点通俗的讲,可以视为hadoop中的namenode)来发起集群上的各种并行操作,驱动器程序(shell中的驱动器程序是Spark shell)可执行应用程序中的main方法,驱动器通过一个SparkContext对象访问Spark——这个对象代表对集群的一个连接(shell启动时已经自动创建了一个SparkContext对象)。【参考:参考资源1中P12】
- 在Spark中,SparkContext是Spark所有功能的一个入口,无论是用java、scala、还是python编写都必须要有一个SparkContext,它的主要作用,包括初始化Spark应用程序所需的一些核心组件、调度器(DAGScheduler、TaskScheduler),到Spark Master节点上进行注册,等等。
但是在Spark中,编写不同类型的Spark应用程序,使用的SparkContext是不同的,如果使用scala,使用的就是原生的SparkContext对象
但是如果使用Java,那么就是JavaSparkContext对象
如果是开发Spark SQL程序,那么就是SQLContext、HiveContext
如果是开发Spark Streaming程序,那么就是它独有的SparkContext
以此类推【参考:北风网相关课程】
注释ii)、
RDD支持两种类型的操作,一种是转化(transformation)操作,一种是行动(action)操作。行动操作会对RDD计算出一个结果,并把结果返回到驱动器程序中,或者把结果存储到如HDFS这样的外部存储系统。但是要注意的是,RDD的行动操作是“懒惰”型的,它只会在你第一次真正使用它是进行相应计算操作(对于大数据环境,这是个很有必要的特点,也正因如此,我们不应该把RDD看做存放着特定数据的数据集,而应该看做是一个存放着计算步骤的指令列表),并且在默认情况下,即使是同一个行动操作,每一次调用,它都会重新计算(如果需要频繁用到某个操作产生的结果,可以将结果缓存,使用方法RDD.persist()——但是我认为对于数据量大的结果,这个方法还是不管用吧?)。【参考:参考资源1中P22、P27】
如果转换操作比较简单,则创建指定Function的匿名内部类;但是如果function比较复杂,则会单独创建一个类,作为实现这个function接口的类
注释iii )、
写一堆匿名内部类调用方法,感觉代码太“繁杂”,于是换用函数式编程的lambda替代,lambda实现的上方所注释的,就是对应的“繁杂”版。
TODO:lambda在“背后”具体是怎么转换代码的
2.代码以及源码地址:
https://github.com/AtTops/Practice-Item/tree/master/SparkScala/main/scala/per/wanghai
创建maven项目,最低依赖仅需Spark的core包
部分代码有普通java与lambda两种写法
package per.wanghai.spark.core;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.FlatMapFunction;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.api.java.function.VoidFunction;
import scala.Tuple2;
import java.util.Arrays;
import java.util.Iterator;
/**
* @author 王海[https://github.com/AtTops]
* @package per.wanghai.spark.core
* @description Java 本地版Spark的单词计数程序
* @Date 2017/11/13 19:55
* @Version V1.0
*/
public class WordCountLocal {
private static final String OUTPUTFILEPATH = "./dataout";
public static