赞
踩
Hadoop简介
Hadoop是一个用java编写的Apache开源框架,它允许使用简单的编程模型跨计算机集群分布式处理大型数据集。Hadoop框架应用程序在一个跨计算机集群提供分布式存储和计算的环境中工作。Hadoop旨在从单个服务器扩展到数千台计算机,每台计算机都提供本地计算和存储。
Hadoop的起源是2003年10月发布的谷歌文件系统论文。这篇论文催生了谷歌的另一篇论文– “MapReduce: Simplified Data Processing on Large Clusters“。
Apache基金会根据谷歌的论文开发了开源的Hadoop项目,Hadoop来自于项目联合创始人Doug Cutting儿子的玩具大象。因此这个黄色的大象也成了Hadoop的标志性Logo。
2
Hadoop分布式存储HDFS
Hadoop拥有自己的分布式存储文件系统HDFS (Hadoop Distributed File System)。分布式文件系统HDFS是运行在Linux文件系统之上的一个文件系统,他的文件权限及查看命令与Linux非常相似。不同的文件以文件块(Data Block)的形式存储在不同的节点中,每个文件块默认为64MB。
HDFS角色分类:
NameNode: HDFS只包含一个NameNode,我们将其称为主节点,存储文件块实际的存储位置。相当于分布式文件系统的目录,当用户查询一个文件时会向NameNode中获取该文件的分块的位置。HDFS可以跟踪文件,管理文件系统并具有元数据和整个数据。特定名称节点包含块数的详细信息,数据存储在哪个数据节点的位置以及存储复制的位置以及其他详细信息。
DataNode: 数据节点将数据作为块存储在其中。这也称为从节点,它将实际数据存储到HDFS中,HDFS从而进行客户端的读写。
SecondaryNameNode: 作为主节点的辅助节点,会记录主节点元数据的Checkpoints。
HDFS具有主/从架构。HDFS集群由单个NameNode,一个管理文件系统命名空间的主服务器和管理客户端对文件的访问组成。此外,还有许多DataNode,通常是群集中每个节点一个,用于管理连接到它们运行的节点的存储。HDFS公开文件系统命名空间,并允许用户数据存储在文件中。在内部,文件被分成一个或多个块,这些块存储在一组DataNode中。NameNode执行文件系统命名空间操作,如打开,关闭和重命名文件和目录。它还确定了块到DataNode的映射。DataNode负责提供来自文件系统客户端的读写请求。
HDFS的可用性:
在一个Hadoop集群中可能会同时包括几十到上千台服务器组成的集群,因此个别机器出现宕机是很有可能发生的,宕机机器上的数据块不可读之后会导致整个大文件不可读。因此HDFS在进行数据的分布式存储的时候需要对数据块(Data Block)进行复制,以实现容错。
NameNode做出有关块复制的所有决定。它定期从群集中的每个DataNode接收Heartbeat和Blockreport。收到心跳意味着DataNode正常运行。Blockreport包含DataNode上所有块的列表。
3
分布式计算MapReduce
我们以一个简单的词频统计的任务来看一下MapReduce分布式计算的过程。
Input:这里我们有一个RecordReader,它可以转换输入文件中的每个记录,并以键值对的形式将解析后的数据发送到映射器。
Map:是一个用户定义的函数,它接受一系列键值对并处理它们中的每一个以生成零个或多个键值对。这里在不同的DataNode节点中计算当前本身服务器中存储的Data Block,并计算出对应的结果。
Shuffle:它将分组的键值对下载到运行Map的本地计算机上。各个键值对按键排序为更大的数据列表。数据列表将等效键组合在一起,以便可以在Reducer任务中轻松迭代它们的值。
Reducer:将分组的键值配对数据作为输入,并在每个数据上运行Reducer功能。这里,数据可以以多种方式聚合,过滤和组合,并且需要广泛的处理。执行结束后,它会为最后一步提供零个或多个键值对。在Reducer中计算出不同的单词总共的结果。
Output:在输出阶段,我们有一个输出格式化程序,它从Reducer函数转换最终的键值对,并使用记录编写器将它们写入文件。最终的词频统计结果将以raw文件的形式存储在HDFS某个路径中。
4
Hadoop生态环境
目前很少会在实际业务中直接在任务代码中去实现MapReduce中的每一步。一般会使用Hadoop生态环境中的组件作为用户访问,开发及运维的入口。
我们可以将平时经常会遇到的组件进行一个分类。
1. 结构化数据存储及使用高级语言实现MapReduce/Tez
Hive
HBase
SparkSQL
Hive是使用传统关系型数据库对数据进行存储,只不过底层的数据库raw文件是以分布式的方式存储在HDFS中。当进行SQL语句进行数据库查询时,使用MapReduce/Tez进行计算增加查询速度。
Hive会对外提供10000的JDBC端口供非本机用户连接数据库,就类似于MySQL的3306或者Oracle的1521端口。
HBase类似于一个NoSQL的数据库。SparkSQL底层基于Spark的存储及计算的关系型数据库。
2. 使用脚本语言实现MapReduce/Tez
Pig
Spark
包含用于表达数据分析程序的高级语言,以及用于评估这些程序的基础结构。Pig程序的显着特性是它们的结构适合于大量的并行化,这反过来使它们能够处理非常大的数据集。
目前,Pig的基础设施层由一个编译器组成,该编译器生成Map-Reduce程序序列,已经存在大规模并行实现(例如,Hadoop子项目)。Pig的语言层目前由一个名为Pig Latin的文本语言组成,它具有以下关键属性:
易于编程:实现简单,“令人尴尬的并行”数据分析任务的并行执行是微不足道的。由多个相互关联的数据转换组成的复杂任务被明确编码为数据流序列,使其易于编写,理解和维护。
优化机会:任务编码的方式允许系统自动优化其执行,允许用户专注于语义而不是效率。
可扩展性:用户可以创建自己的功能来进行专用处理。
3. 工作流及任务安排
Oozie
Azkaban
Oozie是一个用于管理Apache Hadoop作业的工作流程调度程序系统。Oozie Workflow作业是动作的定向非循环图(DAG)。Oozie Coordinator工作是由时间(频率)和数据可用性触发的经常性的Oozie Workflow工作。
Oozie与Hadoop堆栈的其余部分集成,支持多种类型的Hadoop作业(例如Java map-reduce,Streaming map-reduce,Pig,Hive,Sqoop和Distcp)以及系统特定的工作(例如Java程序和shell脚本)。
Oozie是一个可扩展,可靠和可扩展的系统。
4. 源数据导入
Sqoop
Informatica
Sqoop往往和Hive或者HBase搭配使用,Sqoop可以连接已有的关系型数据库,并将表一一导入Hive。
5. Hadoop安全组件
Kerberos
Ranger
Sentry
Knox
Kerberos是MIT开发的单点登录服务,Kerberos是Hadoop安全的基石,Hadoop几乎所有的服务及组件都可以使用Kerberos作为单点认证。在不启用Kerberos的前提下,所有的访问控制规则都可以被绕过,因为任意用户都可以伪造自己的身份,这个将在下一篇文章展开叙述。
Ranger和Sentry都是设定访问控制的工具,同时可以对用户行为进行审计及数据的脱敏。用户可以在Ranger和Sentry中配置不同的用户组,不同的用户组可以访问哪些Hive中的表,可以对表做哪些操作等。使用Ranger和Sentry需要提前启用Kerberos来鉴别用户身份。
Apache Kno网关是一个应用程序网关,用于与Apache Hadoop部署的REST API和UI进行交互。Knox可以作为整个集群的入口,结合Kerberos 认证可以控制不同的用户接触到集群。
5
Hadoop服务集成
由于Hadoop本身组件及服务非常复杂,因此几家公司开发了打包的虚拟机或者Docker方便开发人员部署。主要最大的三家是Cloudera, Hortonworks及MapR。
三家公司同时开发了集群的图形化入口,方便用户对服务进行管理,服务的起停,日志查看等。Cloudera的管理端口叫做Cloudera Manager,还提供了供用户进行简单的SQL语句查询的Hue界面。Hortonworks的产品的入口叫做Ambari。
参考链接
https://hadoop.apache.org/
https://hadoop.apache.org/docs/r1.2.1/hdfs_design.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。