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.0Hadoop 1.0Hadoop 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 执行过程。该过程分为三个阶段①从远程节点上读取MapTask中间结果(称为“Shuffle阶段”);②按照 key 对key/value对进行排序(称为“Sort阶段”);③依次读取,调用用户自定义的 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引擎执行任务。