BingoInsight基于Spark高效通用的大规模数据处理引擎小编的话“品高云公开课”系列文章意在分享技术牛人的知识干货,和大家一起交流学习云知识,每期主题都不一样哟!期待各位读者在文后发表留言,来一场技术上的交流和思想上的碰撞!2016年4月22日本期品高云公开课由张启明带来“BingoInsight基于Spark高效通用的大规模数据处理引擎”的分享。分享嘉宾朱锦勇品高云旗下企业大数据平台BingoInsight开发团队成员。主要工作负责写Java代码。分享正文Hi,大家好,我是BingoInsight的研发工程师张启明,非常荣幸和大家一起学习和交流。今天分享主要的内容包括:1、Spark是什么,Spark的简介。2、如何利用Spark构建BingoInsight的数据处理能力。Spark简介这块为了控制时间和范围,暂时只涉及RDD方面及其Shuffle简介,调度实现先略过,大家有什么疑问的话,随时可在交流过程一起讨论哦Spark是什么呢?从最开始我们在单台机子做数据分析,为了加快分析的速度,通常是将单个任务拆分为多任务,多线程利用cpu多核并行多跑任务,以达到并行计算加快分析的速度。但是单机处理能力毕竟太小,而且单机计算资源纵向扩展费用昂贵且有限制,在容错性方面也不太好。后来MapReduce思想开始流传,在大量普通机子集群上面做分布式的任务分解与结果汇总。MR思想衍生出很多的实现,如Apache下Hadoop的MapReduce。MapReduce广泛应用,慢慢地其缺点也逐渐暴露,如:1、map和reduce两个操作难以表达复杂作业,难以编程,衍生出hive/pig等之类解决框架2、复杂job难以控制,高延时迭代,中间结果写HDFS,衍生出Tez之类的DAG调度框架3、从v1版的计算模型和执行调度资源框架混合,到v2的计算模型和资源管理分离衍生的yarnSpark的出现实际弥补了MR的不足,最初的设计目标是为了扩展MapReduce模型灵活支持迭代算法和交互操作,同时增强易编程性。实现方面主要借鉴了微软的DryadLINQ,但是其抽象模型RDD(弹性分布式数据集-In-Memory)具有更丰富的表达能力而且具备MapReduce模型优秀特性如Faulttolerance,datalocality,scalability。Spark整体看起来是怎么样呢?spark主要由Master、Worker、Executor、Driver几个组件构成,常见中心化的master/slave结构,主要用于接收Driver端(spark的client,可运行在集群内外任意机器上),Executor主要用于执行计算任务。那么Spark的抽象——RDD是什么?如果类比MapReduce的话,RDD就是Spark的编程模型。我们快速地来看一下RDD的特性及其操作。RDD是不可变、每个分区可并行处理的弹性分布式数据集,主要特性有:1、partitions:分区集合;2、partitioncomputing:分区计算函数;3、dependencies:依赖,依赖是与MR最大不同,其定义为RDD之间lineage(血缘链关系),是job/stage划分依据;4、partitioner:分区函数,key-values结构的RDD才有(hash-partitioned);5、preferredlocations:分区的最优计算位置,例如HDFS的block,可选对应函数。RDD的产生主要有两种方式:1、从已经存在collections中并行化;2、从外部数据源加载,如HDFSetc.RDD的操作主要有两种:1、Transformations:转换,产生新的RDD,lazy方式,如map/filter/sample/etc.2、Actions:提交转换操作,将计算结果返回Driver端,如reduce/collect/etc.另外RDD的Persisting/Caching是迭代算法和快速迭代的关键,可以选择性将数据缓存在内存那么对于分布式计算中,常见异常失败(宕机等),RDD如何做容错呢?有两个办法:1、Lineage,利用RDD的依赖关系链重新进行计算,某个过程或者某个计算分片数据丢失后,可以从最原始数据重新执行一系列的transform操作,也就是计算链的重演。2、Checkpoint,保存点,避免computechain过长时引起耗时使用分布式计算框架最核心的问题Shuffle,RDD是如何解决呢,Spark如何实现呢,简单介绍一下:以前MapReduce模型Shuffle过程是怎么样的?一般地,Map端的输出数据输入至Reduce端的过程叫Shuffle,如下图,Map端主要包括collect、Sort、Spill、Merge几个过程Reduce端主要包括Fetch、Merge。Spark在1.2.0之前,现实的Shuffle算法是HashBasedShuffle,主要是因为快捷逻辑简单,但是面临很多问题,如输出文件过多等等。1.2.0+之后实现了SortBasedShuffle作为默认的Shuffle算法,这个算法和MapReduce的Shuffle基本类似的。1.4.0后因为Tungsten工程的开展,UnsafeShuffleorTungstenSort也可以作为了一种选择好,上面介绍了RDD这块一些相关的东西,那么来看一下与Hadoop生态体系其它计算框架对比RDD高度抽象,丰富而简洁的表达能力,简洁易用的API,filter/map/reduce/group等,计算链可在单个job完成。高效迭代,中间结果放在内存,不同于MapReduce写入hdfs,及难以表达复杂的计算,同时需要很精巧的控制job的逻辑统一的数据处理平台,丰富的组件:交互式的SparkSQL,流式的SparkStreaming,机器学习方面的SparkMLib,图学习方面的SparkGraphX适应不同的场景。那么BingoInsight如何利用Spark进行数据分析?BingoInsight基础框架上,无论使用传统关系型数据库,或者是hive这些hadoop高延时批处理性质的数据仓库,又或者是Spark这个低延时的计算框架。BingoInsight为用户提供统一抽象的数据访问接口,一致的数据管理功能体验。着力于结构化可元描述的数据处理。如何合理的利用Spark,让BingoInsight高效利用分式计算的处理能力呢?答案是1.0后的SparkSQL,分布式SQL查询引擎。从先前手写RDD的翻译到利用SparkSQL的DataFrame进行自优化的查询计划,以及后续Roadmapv2.0版本中将要到来类似Flink的DataSet,流式和批处理的进一步抽象。我们需要的只是SQL。BingoInsight按照SparkSQL语法,实现了SparkSQLAST,自由的将元数据进行渲染翻译为sparksql语法,利用Thrift-serverjdbc发送到集群进行执行。同时提供查询控制,job作业监控,数据集群管理。对应复杂的数据质量低下的数据集,可以小巧的ETL工具进行处理,提供完整的结构化数据。BingoInsight自助化的大数据分析处理,解决了海量关系型数据的统计效率,支持面向海量数据的交互式查询,让用户便利地享受分布式计算的好处。完整的监控运维体系,让用户随时掌控集群的情况。欢迎大家一起来交流!