专栏首页李德鑫的专栏大数据框架学习:从 Hadoop 到 Spark
原创

大数据框架学习:从 Hadoop 到 Spark

Hadoop

1. Hadoop是什么

Hadoop软件库是一个利用简单的编程模型在大量计算机集群上对大型数据集进行分布式处理的框架。

特点:部署成本低、扩展方便、编程模型简单。

Hadoop 实现了在行业标准的服务器上进行可靠、可缩放的分布式计算,让你能够以较低的预算跟踪数 PB 以上的数据,而不必需要超级计算机和其他昂贵的专门硬件。

Hadoop 还能够从单台服务器扩展到数千台计算机,检测和处理应用程序层上的故障,从而提高可靠性。

2. Hadoop的组成部分 (Hadoop 2.0)

1、Hadoop Common: The common utilities that support the other Hadoop modules.

2、Hadoop Distributed File System (HDFS:tm:): A distributed file system that provides high-throughput access to application data.

3、Hadoop YARN: A framework for job scheduling and cluster resource management.

4、Hadoop MapReduce: A YARN-based system for parallel processing of large data sets.

我们平常接触比较多的也是 HDFS、YARN、MapReduce;

具体的场景,HDFS,比如通过客户端访问集群, YARN,MapReduce,我们看提交的任务的执行情况。

3. Hadoop架构

Hadoop的发展 Hadoop1.0 vs Hadoop 2.0

在 Hadoop 1.0 时代,Hadoop 的两大核心组件 HDFS NameNode 和 JobTracker都存在着单点问题,这其中以NameNode的单点问题尤为严重。因为NameNode保存了整个HDFS的元数据信息,一旦NameNode挂掉,整个HDFS就无法访问,同时Hadoop生态系统中依赖于HDFS的各个组件,包括MapReduce、Hive、Pig以及HBase等也都无法正常工作,并且重新启动NameNode和进行数据恢复的过程也会比较耗时。这些问题在给Hadoop的使用者带来困扰的同时,也极大地限制了Hadoop的使用场景,使得Hadoop在很长的时间内仅能用作离线存储和离线计算,无法应用到对可用性和数据一致性要求很高的在线应用场景中。 Hadoop1.0HDFS由一个NameNode和多个DataNode 组成, MapReduce的执行过程由一个JobTracker和多个TaskTracker 组成。

Hadoop2.0针对Hadoop1.0中的单NameNode制约HDFS的扩展性问题,提出了HDFSFederation(联盟),它让多个NameNode分管不同的目录进而实现访问隔离和横向扩展,同时它彻底解决了NameNode单点故障问题。它将JobTracker中的资源管理和作业控制功能分开,分别由组件ResourceManager和ApplicationMaster实现,其中,ResourceManager负责所有应用程序的资源分配,而ApplicationMaster仅负责管理一个应用程序,进而诞生了全新的通用资源管理框架YARN。基于YARN,用户可以运行各种类型的应用程序(不再像1.0那样仅局限于MapReduce一类应用),从离线计算的MapReduce到在线计算(流式处理)的Storm等YARN不仅限于MapReduce一种框架使用,也可以供其他框架使用,比如Tez、Spark、Storm。

图 HDFS1.0

图 HDFS2.0

Hadoop 1.0

Hadoop 2.0

这个图里面有Hadoop的构成,以及Hadoop相关项目的一些构成,比如Hive、Pig,Spark。它们都是依赖于MapReduce之上的,比如Hive Sql 会转换成 MapReduce程序去执行。

4. MapReduce原理及过程

传统的分布式程序设计(如MPI)非常复杂,用户需要关注的细节非常多,比如数据分片、数据传输、节点间通信等,因而设计分布式程序的门槛非常高。

Hadoop的一个重要设计目标便是简化分布式程序设计,将所有并行程序均需要关注的设计细节抽象成公共模块并交由系统实现,而用户只需专注于自己的应用程序逻辑实现,这样简化了分布式程序设计且提高了开发效率。

Map Task 先将对应的 split 迭代解析成一个个 key/value 对,依次调用用户自定义的map()函数进行处理,最终将临时结果存放到本地磁盘上,其中临时数据被分成若干个partition,每个 partition 将被一个 Reduce Task 处理。

Reduce Task 执行过程如图2-8所示。该过程分为三个阶段①从远程节点上读取MapTask中间结果(称为“Shuffle阶段”);②按照 key 对key/value对进行排序(称为“Sort阶段”);③依次读取 <key, valuelist>,调用用户自定义的 reduce() 函数处理,并将最终结果存到HDFS上(称为“Reduce 阶段”)。

一般的场景是需要多个MapReduce进行迭代计算(如HiveSQL),Map Reduce过程都会有写磁盘的操作,而且两个MapReduce之间还需要访问HDFS。

任务提交

Hadoop 1.0

Yarn

5. Hive HQL 原理

大家因为相互选择走到了一起,然后成就了彼此。但不是天生就是为了彼此。

HiveQL通过CLI/webUI或者thrift、odbc或jdbc接口的外部接口提交,经过complier编译器,运用Metastore中的云数据进行类型检测和语法分析,生成一个逻辑方案(logicalplan),然后通过简单的优化处理,产生一个以有向无环图DAG数据结构形式展现的map-reduce任务

整个编译过程分为六个阶段:

1、Antlr定义SQL的语法规则,完成SQL词法,语法解析,将SQL转化为抽象语法树AST Tree;

2、遍历AST Tree,抽象出查询的基本组成单元QueryBlock;

3、遍历QueryBlock,翻译为执行操作树OperatorTree;

4、逻辑层优化器进行OperatorTree变换,合并不必要的ReduceSinkOperator,减少shuffle数据量;

5、遍历OperatorTree,翻译为MapReduce任务;

6、物理层优化器进行MapReduce任务的变换,生成最终的执行计划。

TDW Hive 转换为 MapReduce举例:

TDW Hive Sql 转化为 MapReduce,可以在IDE里先看下SQL的执行计划,每个Stage都是由一个MapReduce组成,当然,一个Stage也可能没有Reduce。 两个Stage之间,上一个reduce的数据会写到HDFS上。

6、DAG计算框架 Tez

对于需要多个MapReduce作业迭代计算的场景,因为每个MapReduce都要读写HDFS会造成磁盘和网络IO的浪费,而Tez作为一个DAG框架,可以将多个有依赖的MapReduce作业转化为一个作业,从而提高性能。

Spark 基于内存的计算框架

1、核心概念 RDD

RDD 弹性分布式数据集(RDD,Resilient Distributed Datasets),是一个容错的、并行的数据结构,可以让用户显式地将数据存储到磁盘和内存中,并能控制数据的分区。RDD还提供了一组丰富的操作来操作这些数据。Spark对于数据的处理,都是围绕着RDD进行的。

RDD只能通过在稳定的存储器或其他RDD的数据上的确定性操作来创建。

val hdfsURL="hdfs://**/**/**/**/ds=20170101/*gz"
val hdfsRdd = sparkSession.sparkContext.textFile(hdfsURL)

2、RDD的操作:RDD转换和动作

Transformation 操作是延迟计算的,也就是说从一个RDD 转换生成另一个 RDD 的转换操作不是马上执行,需要等到有 Action 操作的时候才会真正触发运算。

Action 行动算子:这类算子会触发 SparkContext 提交 Job 作业。

3、执行过程

宽窄依赖

窄依赖允许在一个集群节点上以流水线的方式(pipeline)计算所有父分区。例如,逐个元素地执行map、然后filter操作;而宽依赖则需要首先计算好所有父分区数据,然后在节点之间进行Shuffle,这与MapReduce类似。第二,窄依赖能够更有效地进行失效节点的恢复,即只需重新计算丢失RDD分区的父分区,而且不同节点之间可以并行计算;而对于一个宽依赖关系的Lineage图,单个节点失效可能导致这个RDD的所有祖先丢失部分分区,因而需要整体重新计算。

4、 与MapReduce对比,提升效率的地方

MapReduce是一个Map和一个Reduce组成一个stage,当然也有没有reduce的stage,(如简单的不涉及到reduce的查询)

Spark也类似,每一个宽依赖(需要shuffle,类似Reduce)的地方就是两个Stage的分界线。

可以看到 Spark的stage思想跟 Tez的很像,不像MapReduce那样必须成对的MapReduce一起出现,可以在map阶段做很多事情,减少不必要的网络IO和写HDFS的时间。同时一个Stage内,数据的处理也是基于内存的,减少了本地磁盘的IO。

5、 DataSet 结构化的RDD

在Spark中,DataFrame是一种以RDD为基础的分布式数据集,类似于传统数据库中的二维表格。DataFrame与RDD的主要区别在于,前者带有schema元信息,即DataFrame所表示的二维表数据集的每一列都带有名称和类型。这使得Spark SQL得以洞察更多的结构信息,从而对藏于DataFrame背后的数据源以及作用于DataFrame之上的变换进行了针对性的优化,最终达到大幅提升运行时效率的目标。反观RDD,由于无从得知所存数据元素的具体内部结构,SparkCore只能在stage层面进行简单、通用的流水线优化。

6、Spark 使用

SparkSQL的前身是Shark,而Shark的前身是Hadoop中的hive。

受限于络子,目前好像只能用Scala开发。

Python Sql的任务,如果SQL支持Spark SQL的语法,会使用Spark引擎执行任务。

参考资料

Gaia 项目介绍

Hadoop2.0架构

Hadoop 2.0 (YARN) Framework - The Gateway to Easier Programming for Hadoop Users

Hive的基本原理

Hive SQL的编译过程-美团

Spark 基本架构及原理

简单之美 | RDD:基于内存的集群计算容错抽象

Spark RDD、DataFrame和DataSet的区别

DatasetAPI

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spark SQL 数据统计 Scala 开发小结

    Dataset API 属于用于处理结构化数据的 Spark SQL 模块,通过比 RDD 多的数据的结构信息,Spark SQL 在计算的时候可以进行额外的...

    李德鑫
  • 【学习】应该在什么时候使用Hadoop?

    有人问我,“你在大数据和Hadoop方面有多少经验?”我告诉他们,我一直在使用Hadoop,但是我处理的数据集很少有大于几个TB的。 他们又问我,“你能使用Ha...

    小莹莹
  • 想学习大数据却搞不懂Hadoop?腾讯工程师带你三步解读Hadoop!

    Google发表了两篇论文:描述如何以分布式方式存储海量数据的Google文件系统和描述如何处理大规模分布式数据的MapReduce:大型集群上的简化数据处理。...

    大数据风风
  • 使用python时注意的内存、缓存问题

    1. 在使用python时,常常会出现Memory Error,主要是由于python不会自动回收内存,造成内存一直占用,可以采取手动释放内存的方法,详见htt...

    py3study
  • 【多目标跟踪】开源 | 中科大&百度--在线MOTS算法框架PointTrack,效果超过MOTSFusion、MOTSA!

    论文地址: https://arxiv.org/pdf/2007.01550.pdf

    CNNer
  • 无电池摄像头如何实现高清晰度视频编码?

    大家好,我是来自日本法政大学理工学院的副教授周金佳,本次分享的主题是应用于监控系统中的高清晰度低功耗视频采集和编码算法,内容主要是关于日本学术认证机构的pres...

    LiveVideoStack
  • 【POJ 2485】Highways(Prim最小生成树)

    Prim算法:任选一个点,加入集合,找出和它最近的点,加入集合,然后用加入集合的点去更新其它点的最近距离......这题求最小生成树最大的边,于是每次更新一下最...

    饶文津
  • 渗透测试服务讲解汇总 对甲方网站信息的搜集工作

    在对客户网站以及APP进行渗透测试服务前,很重要的前期工作就是对网站,APP的信息进行全面的收集,知彼知己,才能更好的去渗透,前段时间我们SINE安全公司收到某...

    技术分享达人
  • 象牙塔之旅

    又是一年暑假季,八月的炎热比起七月要温和点,只是每每到了夜晚,隔三两天就会暴雨如注,清晨起来,一夜好梦。 不知不觉毕业快两个月了,偶尔恍惚还以为自己才大四,前...

    仇诺伊
  • 基于光芯片的内存内计算(memory-in computing)

    这篇笔记介绍一篇牛津大学在光子计算领域的最新进展,该文章发表于最新一期的Science Advances,标题为“In-memory computing on ...

    光学小豆芽

扫码关注云+社区

领取腾讯云代金券