Hadoop基础知识
----------------分界线:本博客2020年4月1日进行了一次修正---------------
目录:
- Hadoop与Spark大数据栈基本架构
- 数据收集层(Sqoop/Canal、Flume、Kafka)
- 数据存储层(HDFS、HBase、Kudu)
- 资源管理与服务协调(YARN、ZooKeeper)
- 计算引擎层(MapReduce/Tez、Spark、Impala/Presto、Storm/Spark Streaming)
- 数据分析层(Hive/Pig/SparkSQL、Mahout/MLib、Apache Beam/Cascading)
1、Hadoop与Spark大数据栈基本架构:
2、数据收集层(Sqoop/Canal、Flume、Kafka):
- 数据源特点:
- 分布式:数据源分布在不同机器或设备上
- 异构性:数据源包括任何能够产生数据的系统
- 多样化:数据格式多样,包括关系型数据和非关系型数据
- 流式产生:数据源源不断产生,需要实时或近实时将数据发送到后端
- Sqoop/Canal:关系型数据收集和导入工具。Sqoop可将关系型数据库数据全量收集和导入Hadoop,Canal可将数据增量导入。
- Flume:非关系型数据收集。主要是流式日志数据,可近实时收集,经过滤、聚集后加载到HDFS等存储系统。
- Kafka:分布式消息队列。采用分布式高容错设计,允许多个数据消费者订阅并获取感兴趣的内容。
3、数据存储层(HDFS、HBase、Kudu):
- 数据存储特点:
- 可支持存储容量扩展
- 可支持容错
- 可支持多种数据模型
- HDFS(Hadoop Distributed File System):Hadoop分布式文件系统,Google GFS的开源实现。
- 将文件分成等大的数据块(默认为128MB),并以数据块为单位存储到不同节点上。
- 各组件功能:
- NameNode:HDFS集群管理者,负责管理文件系统元信息和所有DataNode。
- Active NameNode:一个HDFS集群中只存在一个对外服务的NameNode,该NameNode则称为Active NameNode。
- Standby NameNode:存在备用NameNode
- 主/备NameNode通过第三方的共享存储系统来保证状态一致。主NameNode将修改日志写入共享是存储系统,备用NameNode从共享存储系统中读取这些修改日志,并重新执行这些操作,以保证与主NameNode的内存信息一致。
- DataNode:存储实际的数据块,并周期性通过心跳向NameNode汇报状态信息。
- Client:用户通过Client与NameNode和DataNode交互,完成HDFS管理和数据读写等操作。
- NameNode:HDFS集群管理者,负责管理文件系统元信息和所有DataNode。
- 关键技术:
- 容错策略:
- NameNode故障:Standby NameNode
- Standby NameNode可防止单个NameNode宕机后导致元信息丢失和整个集群不可访问。
- DataNode故障:心跳机制
- DataNode通过心跳机制向NameNode汇报状态信息,当某个DataNode宕机时,NameNode可以在其他节点上重构该DataNode上的数据块,以保证每个文件的副本数在正常水平线上。
- 数据块损坏:校验码机制。
- DataNode存储数据块时,会同时生成一个校验码。当存取数据块时,如果发现校验码不一致,则认为该数据块已损坏,NameNode会通过其他节点上的正常副本重构受损的数据块。
- NameNode故障:Standby NameNode
- 副本放置策略:三副本放置策略(默认)
- 客户端与DataNode同节点:
- 第一个副本写到同节点的DataNode上
- 另外两个副本写到另一个相同机架的不同DataNode上
- 客户端与DataNode不同节点:
- 第一个副本随机写到一个DataNode
- 另外两个副本写到另一个相同机架的不用DataNode
- 客户端与DataNode同节点:
- 异构介质存储:
- ARCHIVE:高存储密度但消耗较少的存储介质,通常用来存储冷数据。
- DISK:磁盘介质,这是HDFS默认的存储介质。
- SSD:固态硬盘。
- RAM_DISK:数据被写入内存中,同时会往该存储介质中再异步写一份。
- 集中式缓存处理:
- 将一部分目录或文件缓存在off-heap内存中,以加速对这些数据的访问效率。
- 容错策略:
- HBase:构建在HDFS之上的分布式数据库,Google BigTable的开源实现。
- Kudu:分布式列式存储数据库,允许用户存储结构化数据,支持行无限扩展以及数据随机查找与更新。
4、资源管理与服务协调(YARN、ZooKeeper):
- 统一管理优势:
- 资源利通率高,共享资源,使得集群中的资源充分利用
- 运维成本低
- 共享数据和硬件资源,减少数据移动带来的成本
- 统一服务协调组件,避免leader选举、服务命名、分布式队列、分布式锁、发布订阅功能等的重复开发
- YARN:统一资源管理与调度系统
- ZooKeeper:基于简化的Paxos协议实现的服务协调系统,提供类似文件系统的数据模型,允许用户通过简单的API实现leader选举、服务命名、分布式队列与分布式锁等复杂的分布式通用模块。
5、计算引擎层(MapReduce/Tez、Spark、Impala/Presto、Storm/Spark Streaming):
- 应用场景:
- 批处理:处理时间为分钟-小时级别,甚至天级别。吞吐率高。搜索引擎构建索引、批量数据分析、机器学习等
- 交互式处理:处理时间为秒级别。需要人机交互。数据查询、参数式报表生成、OLAP等
- 实时处理:处理延迟为秒级以内。广告系统、舆情监测等
- MapReduce/Tez:
- MapReduce是Google MapReduce的开源实现。Tez是基于MapReduce开发的通用DAG(Directed Acyclic Graph,有向无环图)计算引擎,能够更加高效地实现复杂的数据处理逻辑,目前被应用在Hive、Pig等数据分析系统中。
- MapReduce On YARN工作流程:
- ResourceManager启动MRAppMaster
- 用户向YARN集群提交应用程序。
- ResourceManager为该应用程序分配第一个Container,并与对应的NodeManager通信,要求它在这个Container中启动应用程序的MRAppMaster。
- MRAppMaster创建应用程序,申请资源,监控运行过程
- MRAppMaster启动,首先向ResourceManager注册,用户则可以直接通过ResourceManager查看应用程序的运行状态,然后为内部Map Task和Reduce Task申请资源并运行它们,期间监控它们的运行状态,直到所有任务运行结束。
- MRAppMaster轮询,通过RPC协议向ResourceManager申请和领取资源。
- 一旦MRAppMaster申请到(部分)资源后,则通过一定的调度算法将资源分配给内部的任务,之后与对应的NodeManager通信,要求它启动这些任务。
- NodeManager为任务准备运行环境,并将任务执行命令写到一个脚本里,并通过运行该脚本启动任务。
- 启动的Map Task或Reduce Task通过RPC协议向MRAppMaster汇报自己的状态和进度,从而让MRAppMaster随时掌握各个任务的运行状态,则可以在任务失败时触发相应的容错机制。
- ResourceManager启动MRAppMaster
- MapReduce编程组件:
- Mapper
- Reducer
- InputFormatter
- OutputFormatter
- Spark:通用的DAG计算引擎,提供基于RDD的数据抽象表示,允许用户充分利用内存进行快速的数据挖掘和分析。
- Impala/Presto:允许用户使用标准SQL处理存储在Hadoop中的数据。采用了并行数据库架构,内置了查询优化器,查询下推,代码生成等优化机制。
- Storm/Spark Streaming:分布式流式实时计算引擎,具有良好的容错性与扩展性,能够高效地处理流式数据,它允许用户用过简单的API完成实时应用程序的开发工作。
6、数据分析层(Hive/Pig/SparkSQL、Mahout/MLib、Apache Beam/Cascading):
- 典型使用模式:
- 批处理框架对原始海量数据进行分析,产生较小规模的数据集
- 交互式处理工具对该数据集进行快速查询,获得最终结果
- Hive/Pig/SparkSQL:在计算引擎上构建的支持SQL或脚本语言的分析系统,大大降低了用户进行大数据分析的门槛。
- Hive:基于MapReduce/Tez实现的SQL引擎
- Pig:基于MapReduce/Tez实现的工作流引擎
- SparkSQL:基于Spark实现的SQL引擎
- Mahout/MLib:在计算引擎上构建的机器学习库,实现常用的机器学习和数据挖掘算法。
- Mahout最初基于MapReduce实现,目前正逐步迁移到Spark引擎上
- MLib是基于Spark实现的
7、常见大数据应用场景:
- 互联网领域:
- 搜索引擎
- 推荐系统
- 广告系统
- 电信领域:
- 网络管理和优化(基础设施建设优化、网络运营管理和优化)
- 市场与精准营销(客户画像、关系链研究、精准营销、个性化推荐)
- 客户关系管理(客服中心优化、客户声明周期管理)
- 企业运营管理(业务运营监控、客户声明周期管理)
- 数据商业化(数据对外商业化、单独盈利)
- 医疗领域:
- 临床数据对比
- 药品研发
- 实时统计分析
- 基本药物临床应用分析
- 远程病人数据分析
- 人口统计学分析
- 新农合基金数据分析
- 就诊行为分析
- 新的服务模式
- 金融领域:
- 客户画像应用
- 精准营销
- 风险管控
- 运营优化
8、MapReduce:
依赖磁盘IO的批处理计算模型,通过一个JobTracker主节点和多个TaskTracker从节点,分Map阶段和Reduce阶段执行任务。
HDFS:
①Hadoop Distributed File System,分布式文件系统,提供高吞吐量的应用程序数据访问,负责数据的分布式存储。
②HDFS结构是基于一组特定的节点构建的,包括一个在HDFS内部提供元数据服务的NameNode主节点和多个提供存储块的DataNode从节点。
附注:
分布式存储:数据分散在很多的机器上进行存储。
分布式计算:数据分散在很多的机器上进行计算。
Yarn:
①资源管理平台,负责作业调度与集群的管理,只有一个ResourceManager主节点和多个NodeManager从节点。
②ResourceManager负责集群资源的分配与调度,MapReduce、Storm、Spark等应用,必须实现ApplicationMaster接口,才能被RM管理。
③NodeManager负责单节点资源的管理。
Pig:
Pig是一个并行计算的高级的数据流语言和执行框架,是在MapReduce上构建的一种高级查询语言,轻量级脚本语言,使用shell命令方式来输入数据处理、数据分析的命令,然后系统会自动将这些命令转换为Map和Reduce的形式,进行MapReduce的工作,然后把结果返回给用户。相当于用户和MapReduce之间的转换器。
Hive:
相当于Sql语言到MapReduce的映射器。将Sql转换为MapReduce分布式任务,在各节点运行,再将结果返回给用户。
Hbase:
面向数据分析,基于列式存储模型,支持大量结构化数据存储的数据库,提高响应速度,减少IO量。
ZooKeeper:
负责服务器节点以及进程之间的通讯,通讯的协调工具。提供配置维护、名字服务、分布式同步、组服务等功能。
Chukwa:
管理大型分布式系统的数据采集系统。
Mahout:
可扩展的机器学习和数据挖掘的library库。
9、分布式文件系统:
(1)使用场景:
①文件非常大,比如TB级的文件。
②文件极少更新,而只是作为某些计算的数据读入,并且不时有额外的数据追加到文件尾部。
(2)在DFS中,文件被分成文件块(chunk),文件块的大小通常为64MB。文件块会被复制多个副本放在多个不同的计算节点上。另外,存放同一文件块不同副本的节点应分布在不同机架上,这样在某个机架发生故障时就不至于丢失所有副本。通常来讲,文件块的大小和复制的次数可以由用户指定。
(3)主节点(master node)和名称节点(name node):
为寻找某个文件的文件块,使用主节点或名称节点为该文件所用。主节点本身可以有多个副本,文件系统的总目录可以用于寻找主节点的副本,总目录本身也可以有多个副本,所有使用DFS的用户都知道这些目录副本所在的位置。
10、数据存储扩容方案:
- 纵向扩容:利用现有的存储系统,通过不断增加存储容量来满足数据增长的需求。
- 横向扩容(通常采用):以网络互连的结点为单位扩大存储容量(集群)。
11、HDFS分布式文件系统的体系:
(1)NameNode:名称节点
①接收用户请求,是用户操作的入口;
②是HDFS的守护程序,是它的核心程序,起到分布式系统的总控的作用;
③维护文件系统的目录结构,记录所有的元数据,记录文件是如何分割成数据块的,以及这些数据块被存储到哪些节点上;
④对内存和I/O进行集中管理
⑤是个单点,发生故障将使集群崩溃。
(2)Secondary NameNode:辅助名称节点
①监控HDFS状态的辅助后台程序;
②每个集群都有一个;
③作为NameNode的后备,可以把NameNode里面的元数据信息再重新保存多一份副本,NameNode会自动跟名称辅助节点通讯,不断把名称辅助节点中的元数据往里面放;
④当NameNode故障可以作为备用NameNode使用;
⑤也是个单点。
(3)DataNode:数据节点
①每台从服务器都运行一个;
②负责把HDFS数据块读写到本地文件系统,用于存储文件。
图3.1 分布式文件系统体系
如图所示,Hadoop集群是部署在真正的服务器上的,服务器是放在机架(Rack)上面的,每一个机架都有一个交换机(Switch),然后这些交换机通过一个大的交换机连接起来,用户是直接通过交换机来进行请求的。
12、Hadoop1.0 MapReduce框架基本架构:
(1)JobTracker:
- 主要功能:
- 资源管理
- 作业控制
- 运行在主节点上的后台进程,起到对MapReduce体系的总调度作用。
- 主要作用:
- 用于处理用户提交后的作业;
- 决定有哪些文件参与作业处理,然后把Job切割为一个个小Task,并把这些Task分配到DataNode中,Hadoop的原则是就近运行,就是程序要和数据在同一个物理节点里面;
- 监控Task,重启失败的Task,释放它所占用的资源;
- 每个集群只有唯一一个JobTracker,和NameNode一样,是个单点,位于Master节点。
(2)TaskTracker:
- 位于Slave节点上,与DataNode结合(代码与数据一起的原则);
- 主要作用:
- 管理各自节点上的Task(由JobTracker分配);
- 每个节点只有一个TaskTracker,但一个TaskTracker可以启动多个JVM,用于并行执行Map或Reduce任务;
- 与JobTracker交互。
13、Master和Slave:
(1)Master:NameNode、Secondary NameNode、JobTracker的节点的机器。
(2)Slave:TaskTracker、DataNode的机器
(3)Master不是唯一的。通常把NameNode和JobTracker放在同一台机器,把Secondary NameNode放在另一台机器。
参考文献:
[1]Jure Leskovec,Anand Rajaraman,Jeffrey David Ullman. 大数据互联网大规模数据挖掘与分布式处理(第2版) [M]北京:人民邮电出版社,2015.7;
[2]董西成. 大数据技术体系详解原理、架构与实践 [M]北京:机械工业出版社,2018.11;