Spork: Pig on Spark实现分析
介绍
Spark Launcher
那么在这一次物理运行计划中,相应到Spark可能是多次任务。
public interface POConverter<IN, OUT, T extends PhysicalOperator> { RDD<OUT> convert(List<RDD<IN>> rdd, T physicalOperator) throws IOException; }
抽象类POConvertor提供了convert方法,输入參数中的List<RDD>是本次物理操作的前驱们产生的RDDs,能够觉得是会依赖的父RDDs。
Load/Store
走的都是NewHadoopRDD路线。
Load方面是通过POLoad获得文件路径,pigContext获得必要配置信息,然后交由SparkContext调用newAPIHadoopFile来获得NewHadoopRDD,最后把Tuple2<Text, Tuple>的RDD map成仅仅剩value的RDD<Tuple>。
Store方面是先把近期的前驱rdd转会成Key为空Text的Tuple2<Text, Tuple>。然后映射为PairRDDFunctions。借助pigContext生成POStore操作,最后调用RDD的saveAsNewAPIHadoopFile存到HDFS上。
Foreach、Filter、Limit
ForEach里实现一个Iterator[T] => Iterator[T]的方法,把foreach转化为rdd.mapPartitions()方法。
Iterator[T]=> Iterator[T]方法的实现。会依赖原本的POForEach来获得nextTuple和进行一些别的操作,来实现一个新的Iterator。
对于hadoop backend的executionengine里的抽象类PhysicalOperator来说。
setInput()和attachInput()方法是放入带处理的tuple数据。
getNextTuple()的时候触发processTuple()。处理对象就是内部的Input Tuple。
所以ForEach操作实现Iterator的时候。在readNext()方法里掺入了以上设置Input数据的操作,在返回前调用getNextTuple()返回处理后的结果。
POFilter也是通过setInput()和attachInput()以及getNextTuple()来返回处理结果。
所以在实现为RDD操作的时候。把以上步骤包装成一个FilterFunction,传入rdd.filter(Function)处理。
POLimit同POFilter是全然一样的。
Distinct
如今RDD已经直接具备distinct(numPartitions: Int)方法了。
这里的distinct实现同rdd里的distinct逻辑是全然一样的。
第一步:把类型为Tuple的rdd映射成为Tuple2<Tuple, Object>。当中value部分是null的;
第二步:进行rdd.reduceByKey(merge_function, parallelism)操作,merge_function对两个value部分的Object不做不论什么处理。也就是按key reduce且不正确value部分处理;
第三步:对第二步的结果进行rdd.map(function, ClassTag)处理,function为得到Tuple2<Tuple, Object>里的._1,即key值:Tuple。
Union
Union是一次求并过程,直接new UnionRDD<Tuple>返回。
因为UnionRDD处理的是Seq<RDD>。所以使用JavaConversions.asScalaBuffer(List<RDD<Tuple>>)进行一下转换再传入。
Sort
Sort过程:
第一步:把Tuple类型的RDD转成Tuple2<Tuple, Object>类型。Object为空
第二步:依据第一步结果。new OrderedRDDFunctions<Tuple, Object,Tuple2<Tuple, Object>>
,其sortByKey方法产出一个排过序的RDD<Tuple2<Tuple, Object>>。OrderedRDDFunctions里的Key类型必须是可排序的,比較器复用的是POSort的mComparator。sortByKey结果返回的是ShuffleRDD。其Partitioner是RangePartitioner,排序之后,每一个Partition里存放的都是一个范围内的排过序的值。
第三步:调用rdd.mapPartition(function, xx, xx),function作用为把Iterator<Tuple2<Tuple,Object>>吐成Iterator<Tuple>。即再次取回Key值,此时已有序。
Split
POSplit的处理是直接返回第一个祖先RDD。
LocalRearrange
LocalRearrange -> Global Rearrange -> Package是一同出现的。
Local rearrange直接依赖
physicalOperator.setInputs(null);
physicalOperator.attachInput(t);
result = physicalOperator.getNextTuple();
三步得到result。返回的Tuple格式为(index, key, value)。
依赖POLocalRearrange本身内部对input tuple的处理。
GlobalRearrange
待处理的Tuple格式是(index, key, value)。最后结果为(key, { values })
假设父RDD仅仅有一个:
先进行按key进行一次groupBy。得到结果是Tuple2<Object, Seq<Tuple>>
然后做一次map操作,得到(key, { values })形态的RDD,即Tuple<Object, Iterator>
假设父RDD有多个:
让通过rdd的map操作先将Tuple从(index, key, value)转成(key, value)形态,然后把这个rdd集合new成CoGroupRDD,包括一次(Seq) JavaConversions.asScalaBuffer(rddPairs)转化。最后调用CoGroupRDD的map方法,把Tuple2<Object,Seq<Seq<Tuple>>>转化成Tuple<Object, Iterator>,即(key, { values })形态。实际上。CoGroupRDD的map方法内部做的事情。是针对每一个Key里的Iterator集合,进行了Iterator之间的合并操作。
Package
Package须要把global rearrange处理后的key, Seq<Tuple>进行group。
详细的待处理Tuple结构是这种:(key, Seq<Tuple>:{(index,key, value without key)})
tuple.get(0)是keyTuple,tuple.get(1)是Iterator<Tuple>。最后返回(key, {values})。即Tuple<Object, Iterator>
Spork: Pig on Spark实现分析的更多相关文章
- flare-spork: 自己维护的Pig on Spark项目
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/zbf8441372/article/details/24726501 关于flare-spork 非 ...
- Spark源代码分析之六:Task调度(二)
话说在<Spark源代码分析之五:Task调度(一)>一文中,我们对Task调度分析到了DriverEndpoint的makeOffers()方法.这种方法针对接收到的ReviveOffe ...
- Spark原理分析目录
1 Spark原理分析 -- RDD的Partitioner原理分析 2 Spark原理分析 -- RDD的shuffle简介 3 Spark原理分析 -- RDD的shuffle框架的实现概要分析 ...
- 从0到1进行Spark history分析
一.总体思路 以上是我在平时工作中分析spark程序报错以及性能问题时的一般步骤.当然,首先说明一下,以上分析步骤是基于企业级大数据平台,该平台会抹平很多开发难度,比如会有调度日志(spark-sub ...
- 大数据分析处理框架——离线分析(hive,pig,spark)、近似实时分析(Impala)和实时分析(storm、spark streaming)
大数据分析处理架构图 数据源: 除该种方法之外,还可以分为离线数据.近似实时数据和实时数据.按照图中的分类其实就是说明了数据存储的结构,而特别要说的是流数据,它的核心就是数据的连续性和快速分析性: 计 ...
- Spark网络通信分析
之前分析过spark RPC的基本流程(spark RPC详解),其实无论是RPC还是Spark内部的数据(Block)传输,都依赖更底层的网络通信,本文将对spark的网络通信做一下剖析. 1,概要 ...
- hive Spark SQL分析窗口函数
Spark1.4发布,支持了窗口分析函数(window functions).在离线平台中,90%以上的离线分析任务都是使用Hive实现,其中必然会使用很多窗口分析函数,如果SparkSQL支持窗口分 ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- Spark源代码分析之中的一个:Job提交执行总流程概述
Spark是一个基于内存的分布式计算框架.执行在其上的应用程序,依照Action被划分为一个个Job.而Job提交执行的总流程.大致分为两个阶段: 1.Stage划分与提交 (1)Job依照RDD之间 ...
随机推荐
- this关键字和super关键字
一.this Java中为了解决变量的命名冲突和不确定性问题,引入了关键字this.this代表当前类的一个实例,它经常出现在方法和构造方法中,具体使用情况有以下三种: 1,返回调用当前方法的对象的引 ...
- [luogu普及] ---P1032 字串变换
目的 刷完100AC (最近很不舒服,写博客耗时啊 记录第一个字符串的题目 参考 https://www.luogu.org/blog/user20197/solution-p1032 代码 #inc ...
- Linux Shell Scripting Cookbook 读书笔记 3
patch, tree, head ,tail 1. 创建不可修改文件 chattr +i file chattr -i file 移除不可修改属性 2. 能够启动闪存或硬盘的混合ISO isohyb ...
- pip换源简易方法
安装pqi >>> pip install pqi 列出pip源 >>> pqi ls 使用pip源 >>> pqi use <name&g ...
- Python3.6 import源文件与编译文件的关系
小结: 在Python3.6中 源文件存在时,import会比较源文件与__pycache__里相应文件的时间戳,来决定是否重新生成缓存编译文件 源文件不存在时,import会导入相应的.pyc文件 ...
- P1284 三角形牧场
题目描述 和所有人一样,奶牛喜欢变化.它们正在设想新造型的牧场.奶牛建筑师Hei想建造围有漂亮白色栅栏的三角形牧场.她拥有N(3≤N≤40)块木板,每块的长度Li(1≤Li≤40)都是整数,她想用所有 ...
- 关于react-router-dom入门配置
react-router-dom入门配置 配置 参考:github https://reacttraining.com/react-router/web/api/BrowserRouter 1. 导入 ...
- 【Oracle】使用logmnr挖掘日志
使用Logmnr挖掘日志的详细步骤如下: 1. 查看日志状态及位置 col member for a45 select group#,status from v$log; select group#, ...
- 【技术累积】【点】【java】【6】时间戳
闲聊 加班多诶,写博客诶. 基本 时间戳,直观理解就是时间上面盖个戳罢了,在时间这个轴上面记录个点: unix时间戳表示从开始的时间点开始,经过了多少秒: 可以简单的看做是一个计时器: 基本定义可以直 ...
- 脚本自动化部署varnish源码包
#!bin/bash#功能:自动化部署 varnish 源码包软件,运行脚本前,需提前下载 varnish-5.0.0.tar.gz#作者:liusingbonyum -y install gcc r ...