月度归档:2016年01月

Spark编译与打包

编译打包

  Spark支持Maven与SBT两种编译工具,这里使用了Maven进行编译打包;
  在执行make-distribution脚本时它会检查本地是否已经存在Maven还有当前Spark所依赖的Scala版本,如果不存在它会自动帮你下载到build目录中并解压使用;Maven源最好配置成OSChina的中央库,这下载依赖包比较快;
耐心等待,我编译过多次所以没有下载依赖包,大概半个小时左右编译完成;注意:如果使用的是Java 1.8需要给JVM配置堆与非堆内存,如:export MAVEN_OPTS=”-Xmx1.5g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m”;

  进入Spark根目录下,执行:

./make-distribution.sh --tgz

 --tgz 参数是指编译后生成tgz包  
 - PHadoop 支持Hadoop
 -Pyarn :支持yarn
 -Phive :支持hive
 --with-tachyon:支持tachyon内存文件系统
 -name:与--tgz一起用时,name代替Hadoop版本号

 ./make-distribution.sh --tgz --name 2.6.0 -Pyarn -Phadoop-2.6 -Phive 

   开始编译检查本地环境,如不存在合适的Scala与Maven就在后台下载;

开始编译,检查本地环境中

编译中:
编译中

编译完成并打包生成tgz:

编译完成   

编译完成后把生成的文件拷贝到当前Spark的dist目录中并且打包生成spark-1.5.3-SNAPSHOT-bin-2.2.0.tgz文件;

spark目录

Spark核心——RDD

  Spark中最核心的概念为RDD(Resilient Distributed DataSets)中文为:弹性分布式数据集,RDD为对分布式内存对象的 抽象它表示一个被分区不可变且能并行操作的数据集;RDD为可序列化的、可缓存到内存对RDD进行操作过后还可以存到内存中,下次操作直接把内存中RDD作为输入,避免了Hadoop MapReduce的大IO操作;

RDD生成

  Spark所要处理的任何数据都是存储在RDD之中,目前两种方式可以生成一个RDD:
  1、从RDD进行转换操作
  2、使用外部存储系统创建,如:HDFS;

RDD操作

  RDD支持两种操作:
    转换(transformation operation)
    转换操作将一个RDD经过操作后返回一个全新的RDD,转换操是lazy(惰性)的这期间不会产生任何数据的计算;
    转换函数有:distinct、filter、map、flatMap、union、groupByKey等;
    行动(action operation)
    每一个行动操作都会触发Spark Job进行计算并返回最终的结果,行动操作有这么几类:返回标量,count返回元素的个数;返回Scala集合,task(n)返回0到n-1组成的集合;写入外部存储,saveAsHadoopFile(path)存储到HDFS;
    行动函数有:count、top、task、saveAsHadoopFile等;
  RDD为不可变的数据集,可以使用转换操作“修改”一个RDD,但这操作过后返回的是一个全新的RDD 原本RDD并没有改变;

转换图
          RDD状态转换图

Lineage

  Spark RDD只支持粗粒度的操作,对一个RDD的操作都会被作用于该RDD的所有数据;为了保证RDD的高可用性RDD通过使用Lineage(血统)记录了RDD演变流程(从其他RDD到当前RDD所做的操作) 当RDD分区数据丢失时可以通过Lineage的信息重新计算与恢复分区数据,或进行RDD的重建;
  RDD的依赖关系(dependencies)
  由于对RDD的操作都是粗粒度的一个转换操作过后都会产生一个新的RDD,RDD之间会形成一个前后依赖关系;Spark中存在两种依赖:窄依赖(Narrow Dependencies)、宽依赖(Wide Dependencies);
  窄依赖(Narrow Dependencies):一个父RDD的分区只能被一个子RDD的一个分区使用;
  宽依赖(Wide Dependencies):多个子RDD的分区依赖于一个父RDD的同一个分区;
  窄依赖的节点(RDD)关系如果流水一般,所以当节点失败后只需重新计算父节点的分区即可,宽依赖需要重新计算父节点的多个分区代价是非常昂贵的;

窄依赖
          窄依赖Narrow

宽依赖
          宽依赖Wide

参考资料:
http://www.cs.berkeley.edu/~matei/papers/2012/nsdi_spark.pdf
http://spark.apache.org/docs/latest/programming-guide.html