大数据学习——java调用spark常用接口函数

一、准备:

1.1 引入依赖包:

   
       
        org.apache.spark
        spark-core_2.10
        1.2.0
   

spark版本在不断迭代更新,也许这个版本已经过时,不同的版本之间java接口并不是完全兼容的,如果为了快速了解学习,请在maven中配置和我一样的spark依赖版本,这样下面的java接口调用代码是可以直接使用的,否则要自行处理版本更新导致的接口标准变化。比如你可能立即发现Iterator和Iterable的问题。

1.2 使用jdk1.8:

spark中的核心计算需要用户传递函数,简单的map操作可能就只有一行代码,这个时候lambda表达式就很好用了。不过要升到jdk1.8才能用。


       
           
                org.apache.maven.plugins
                maven-compiler-plugin
               
                    8
                    8
               

           

       

   

二、java初始化sc(JavaSparkConText)

            System.setProperty("hadoop.home.dir","C:\\hadoop\\hadoop-2.7.1");
            SparkConf conf = new SparkConf().setMaster("local").setAppName("TestQF");
            JavaSparkContext sc = new JavaSparkContext(conf);

conf的setMaster定义hadoop的链接,local会指向本地,setAppName会方便找到spark进程。

三、创建RDD

spark的存储单元就是RDD,数据定义和操作都是基于RDD的。整个spark过程就是定义RDD集合并针对RDD集合进行操作的过程。创建RDD有两种方法, 一个是从外部读取,一个是拿现有的集合。

2.1 从外部读取集合数据,创建RDD

JavaRDD inputRDD = sc.textFile("file_path"); //指定读取的文件,sc会一行一行读取,存储到一个RDD集合。

2.2 拿现有的集合

JavaRDD inRDD = sc.parallelize(Arrays.asList("hello word" , "hey"));//用一个list把数据灌给RDD

四、操作RDD

RDD的操作分为转化操作和行动操作。转化操作返回一个新的RDD集合,行动操作会反馈需要的数据类型。

spark是惰性求值的,只有行动操作运行时才会真正开始计算。前面的转化操作只是让spark框架了解运行过程的定义,并不会立即执行。

留意,spark分driver端和executor端,对RDD的操作一般在executor端分布式执行,从driver端到executor端需要网络传输序列化数据,executor进行反序列化之后开始执行。因此参数需要支持序列化才能进行传输!!!

4.1 转化操作:

4.1.1 过滤 filter()

4.1.2 合并 union()

4.1.3 映射 map()、flatMapp()、mapToPair()

4.2 行动操作:

4.2.1 计数 count()、countByValue()

4.2.2 取数 take()

4.2.3 取集合 collect() 单节点存的下才能collect

4.2.4 排序 sortByKey()

4.2.5 聚合 combineByKey() 

五、持久化RDD

RDD惰性求值的计算方式使其在最后的行动操作时才会真正运行,这可以使编译器可以提前优化运行减少不必要的计算和存储开销,但多次对RDD进行求值计算时会重头运行,而无法利用中间运算结果,对于迭代运算代价过高。

5.1 persist(StorageLevel.MEMORY_ONLY()) 

使用persist函数在行动操作之前对RDD定义持久化策略,这样可以在内存中缓存中间结果或直接向外部输出运算结果。

六、分区和分区器

分区partition是spark将数据按照规则划分的子集,通过子集可以优化数据匹配算法,尤其可加快join操作的匹配效率

分区器partitioner是spark的工具类,分区器负责管理数据分区。

分区器有哈希分区和范围分区两种。哈希分区快速但容易产生数据倾斜;范围分区数据相对均衡,但采样运算导致效率较低。

七、共享变量:

7.1 累加器:Accumulator a = sparkContext.accumulator()   .add()累加  .value()取值。惰性计算,只有行动操作之后才能获取真正的值,在分布式执行转换操作时无法调用value获取值,因为还没有完成汇总。

foreach()这样的行动操作中使用add()累加器可以获得可靠的结果,如果在转换操作中使用add()累加器可能由于任务重算的原因导致累加器重复发送结果到驱动器中,进而得到不正确的结果。

只要满足交互率和结合律,可以通过扩展AccumulatorParam的方式自定义累加器。

7.2 广播变量:Broadcast a = sparkContext.broadcast()  变量在分布式计算中只分发一次,应作为只读数据处理,修改操作不会影响其他节点副本。

 

 

 

 

你可能感兴趣的:(大数据学习——java调用spark常用接口函数)