• Spark基础与Java Api介绍


    原创文章,转载请注明: 转载自http://www.cnblogs.com/tovin/p/3832405.html 

    一、Spark简介

      1、什么是Spark

        发源于AMPLab实验室的分布式内存计算平台,它克服了MapReduce在迭代式计算和交互式计算方面的不足。

        相比于MapReduce,Spark能充分利用内存资源提高计算效率。

      2、Spark计算框架

        Driver程序启动很多workers,然后workers在(分布式)文件系统中读取数据后转化为RDD(弹性分布式数据集),最后对RDD在内存中进行缓存和计算

      

            

      3、为什么Spark计算速度快
        (1)内存计算

        (2)优化执行计划

       4、Spark Api语言支持

        (1)Scala

        (2)Java

        (3)Python

      5、怎么运行Spark

        Local本地模式、Spark独立集群、Mesos、Yarn-Standalone、Yarn-Client

     

    二、编程模型

      1、RDD(弹性分布式数据集)是什么

        只读的、分块的数据记录集合

        可以通过读取来不同存储类型的数据进行创建、或者通过RDD操作生成(map、filter操作等)

        使用者只能控制RDD的缓存或者分区方式

        RDD的数据可以有多种类型存储方式(可(序列化)存在内存或硬盘中) 

      2、RDD 存储类型 

        RDD可以设置不同类型存储方式,只存硬盘、只存内存等。

        

      3、RDD操作

        Transformation:根据已有RDD创建新的RDD数据集build

        Action:在RDD数据集运行计算后,返回一个值或者将结果写入外部存储
        
     
     4、RDD如何创建
        
       首先创建JavaSparkContext对象实例sc

            JavaSparkContext  sc = new JavaSparkContext("local","SparkTest");

        接受2个参数:

          第一个参数表示运行方式(local、yarn-client、yarn-standalone等)

          第二个参数表示应用名字
     
      直接从集合转化 sc.parallelize(List(1,2,3,4,5,6,7,8,9,10))
      从HDFS文件转化 sc.textFile("hdfs://")
      从本地文件转化 sc.textFile("file:/")
      下面例子中list2就是根据data2List生成的一个RDD
        
      
      根据文件或者集合生成RDD后,接着就可以通过RDD的Transformation操作来完成对数据的各种转化操作
      常用的map、flatMap、filter操作都是对单元素的操作
      常用的groupByKey、join都是对(key、value)类型元素操作
     
      5、RDD操作例子Java Api
      (1)map
        map操作对数据集每行数据执行函数里面操作
        list1数据集("a,b,c,d,e"),("1,2,3,4,5"); 
          

        执行结果:对list1数据集每行数据用","进行切分

          
       (2)flatMap
          flatMap相比于map操作,它对每行数据操作后会生成多行数据,而map操作只会生成一行。
          

          执行结果:对list1数据集每行数据用","进行切分

           

        (3)filter

         filter对每行数据执行过滤操作,返回true则保留,返回false则过滤该行数据

           

           执行结果:过滤list1数据集中包含‘a’字符的行

           

        (4)union

          union操作对两个RDD数据进行合并。与SQL中的union一样

          list2数据集("11,22,33,44,55"),("aa,bb,cc,dd,ee"); 
            
          执行结果:合并list1与list2数据集
            
        (5)groupByKey
          groupByKey对pair中的key进行group by操作
          pair1RDD数据集("a,1"),("b,2"),("a,3"),("b,4")

            

          执行结果:对pair1RDD数据集按key进行group by

           

        (6)reduceByKey

          reduceByKey对pair中的key先进行group by操作,然后根据函数对聚合数据后的数据操作

          

          执行结果:先group by操作后进行concat

            

        (7)mapValues

          mapValues操作对pair中的value部分执行函数里面的操作

            

          执行结果:对pair1RDD中value部分加上test字符串

            

        (8)join

          join与sql中join含义一致,将两个RDD中key一致的进行join连接操作

          pair2RDD数据集("a,11"),("b,22"),("a,13"),("c,4")
          

          执行结果:对pair1RDD与pair2RDD按key进行join

          

        (9)cogroup

          cogroup对两个RDD数据集按key进行group by,并对每个RDD的value进行单独group by

           

           执行结果:对pair1RDD与pair2RDD按key进行cogroup

            

      6、RDD数据如何输出

        使用RDD的Transformation对数据操作后,需要再使用Action操作才能将结果数据输出
        可以分别使用count、collect、save等操作来输出或统计RDD结果
      
      7、RDD Action实例
        
        执行结果:

          count:统计输出数据行数

          

          collect:输出所有输出数据

          

                 save:保存输出数据至外部存储

          

      7、WordCount实例                                                                  

      

         执行结果:

        

      8、广播变量& 累加器

        Broadcast variables(广播变量) 

          广播变量,类似于hadoop中的distribute cache,将同一份数据分发至每台机器。

        Accumulators(累加器)

          类似于MapReduce中的counter,用于计数
     
     

    三、调度机制

      1、DAG Scheduler

        为每个job分割stage,同时会决定最佳路径,并且DAG Scheduler会记录哪个RDD或者stage的数据被checkpoint,从而找到最优调度方案                                         (transformations是延迟执行的原因)

        

      2、DAG Scheduler优化

        单个Stage内Pipeline执行

        基于分区选择合适的join算法最小化shuffle
        重用已经cache过的数据

      3、窄依赖& 宽依赖

        窄依赖:每个子分区只依赖有限数目的父分区 

        宽依赖:每个子分区只依赖所有的父分区

          

      4、Stage

        调度器会在产生宽依赖的地方形成一个stage,同一个stage内的RDD操作会流式执行,不会发生数据迁移。

        

        rdd join操作属于宽依赖,从spark产生的日志可以看出需要分3个stage执行

          

            rdd flatMap、Map操作属于窄依赖,从spark产生的日志可以看出需要分1个stage执行

          

      5、Shuffle

        每个RDD都可以选择Partitioner进行shuffle操作

        任何在两个RDD上的shuffle操作,将选择其中一个RDD的Partitioner作为标准。如果两个RDD都没有设置Partitioner的话,就使用默认的HashPartitioner

        shuffle需要在node之间移动数据,会影响spark执行效率,应该尽量避免RDD操作中发生shuffle。

      

    原创文章,转载请注明: 转载自http://www.cnblogs.com/tovin/p/3832405.html 

  • 相关阅读:
    LG5283 异或粽子
    LG2216 理想的正方形
    LG1484 种树
    洛谷3721 HNOI2017单旋(LCT+set+思维)
    洛谷3348 大森林 (LCT + 虚点 + 树上差分)
    CF1082E Increasing Frequency (multiset+乱搞+贪心)
    CF1082G Petya and Graph(最小割,最大权闭合子图)
    cf1082D Maximum Diameter Graph(构造+模拟+细节)
    洛谷3320 SDOI2015寻宝游戏(set+dfs序)(反向迭代器的注意事项!)
    CF613D Kingdom and its Cities(虚树+贪心)
  • 原文地址:https://www.cnblogs.com/tovin/p/3832405.html
Copyright © 2020-2023  润新知