Hadoop Ecosystem介绍
什么是Hadoop
- Hadoop是Apache基金会下的一个开源分布式计算平台,以Hadoop分布式文件系统(Hadoop distributed file system, HDFS)和MapReduce分布式计算框架为核心,为用户提供了底层细节透明的分布式基础设施。 
- 经过几年的快速发展,Hadoop现在已经发展成为包含多个相关项目的软件生态系统。侠义的Hadoop核心: - Hadoop Common:0.20+版本中,从core更名为common,提供一些常用的工具,包括系统配置工具Configuration、远程过程调用RPC、序列化机制和Hadoop抽象文件系统FileSystem等。 
- Hadoop HDFS:是一个高度容错的系统、能检测和应对硬件故障,用于在低成本的通用硬件上运行。HDFS简化了文件的一致性模型,通过流式数据访问,提供高吞吐量应用程序数据访问功能,适合带有大型数据集的应用程序。 
- Hadoop MapReduce:是一种编程模型,用以进行大数据量的计算。将应用划分为Map和Reduce两个步骤,其中Map对数据集上的独立元素进行指定的操作,生成键-值对形式中间结果,Reduce对中间结果中相同的“键”的所有“值”进行规约,得到最终结果。 
 
Hadoop生态系统
- Sqoop - 是SQL-to-Hadoop的缩写,是Hadoop的周边工具,主要作用是在结构化数据存储与Hadoop之间进行数据交换。 
- Sqoop可以将一个关系型数据库(Mysql、Oracle等)中的数据导入Hadoop的HDFS、Hive中,也可逆向导入。 
 
- Mahout - 主要目标是创建一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序。 
- Mahout现在已经包含了聚类、分类、推荐引擎(协同过滤)和频繁集挖掘等使用的数据挖掘方法。 
- 除了算法,还包含数据的输入和输出工具、与其他存储系统集成(数据库、MongoDB) 
 
- ZooKeeper - 作为一个分布式的服务框架,解决分布式计算中的一致性问题。 
- 如统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。常作为组件使用。 
- 主要用于协调各个组件之间的一致性。 
 
- Hive - 最早由FaceBook设计,是建立在Hadoop基础上的数据仓库架构。 
- 数据仓库的管理,包括了数据ETL(抽取、转换和加载)工具、数据存储管理和大型数据集的查询和分析能力。 
- Hive提供的是一种结构化数据机制,Hive QL,通过该查询语言,数据分析人员可以很方便地运行数据分析业务。 
 
- Pig - 运行在Hadoop之上,是对大型数据集进行分析和评估的平台。 
- 简化使用Hadoop进行数据分析的要求,提供一个高层次的、面向领域的抽象语言Pig Latin。 
- 通过Pig Latin,可以将复杂且相互关联的数据分析任务编码为Pig操作上的数据流脚本,通过将脚本转换为MapReduce任务链。和Hive一样,Pig降低了对大型数据集进行分析和评估的门槛。 
 
- HBase - 继Google的BigTable系统论文,开源社区在HDFS上构建HBase。 
- 是一个针对结构化数据的可伸缩、高可靠、高性能、分布式和面向列的动态模式数据库。 
- 和传统的关系数据库不同,HBase采用了BigTable的数据模型:增强的稀疏排序映射表(Key/Value),其中,键由行关键字、列关键字和时间戳构成。提供对大规模数据的随机、实时读写访问。 
- HBase中保存的数据可以使用MapReduce来处理,将数据存储和并行计算完美结合。 
 
Hadoop的Master和Slave
Namenode 和 Datanode
- HDFS采用master/slave架构。一个HDFS集群是由一个Namenode和一定数目的Datanodes组成。 
- Namenode是一个中心服务器,负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。Namenode执行文件系统的名字空间操作,比如打开、关闭、重命名文件或目录。它也负责确定数据块到具体Datanode节点的映射。 
- 集群中的Datanode一般是一个节点一个,负责管理它所在节点上的存储。HDFS暴露了文件系统的名字空间,用户能够以文件的形式在上面存储数据。从内部看,一个文件其实被分成一个或多个数据块,这些块存储在一组Datanode上。 
- Datanode负责处理文件系统客户端的读写请求。在Namenode的统一调度下进行数据块的创建、删除和复制。 
JobTracker和TaskTracker
- Hadoop MapReduce采用Master/Slave结构 - Master:是整个集群的唯一的全局管理者,功能包括:作业管理、状态监控和任务调度等,即MapReduce中的JobTracker 
- Slave:负责任务的执行和任务状态的汇报,即MapReduce中的TaskTracker。 
 
- JobTracker - JobTracker是一个后台服务进程,启动之后,会一直监听并接收来自各个TaskTracker发送的心跳信息,包括资源使用情况和任务运行情况等信息。 
- 作业控制:在hadoop中每个应用程序被表示成一个作业,每个作业又被分成多个任务,JobTracker的作业控制模块则负责作业的分解和状态监控。 
- 资源管理 
 
- TaskTracker - TaskTracker是JobTracker和Task之间的桥梁:一方面,从JobTracker接收并执行各种命令:运行任务、提交任务、杀死任务等;另一方面,将本地节点上各个任务的状态通过心跳周期性汇报给JobTracker。TaskTracker与JobTracker和Task之间采用了RPC协议进行通信 
- 汇报心跳:Tracker周期性将所有节点上各种信息通过心跳机制汇报给JobTracker。这些信息包括两部分: - 机器级别信息:节点健康情况、资源使用情况等 
- 任务级别信息:任务执行进度、任务运行状态等 
 
- 执行命令:JobTracker会给TaskTracker下达各种命令. 
 
Hadoop集群配置
- Hadoop现在的最新版本2.5.1,主要包括三个核心组件: - Common 
- HDFS 
- YARN(0.23.0 +,新Hadoop MapReduce框架MapReduceV2 或者叫 Yarn) 
 
- 配置前提 - 平台:Unbuntu Linux 
- 软件要求:JDK(与hadoop版本对应)、SSH 
- 下载Hadoop最新稳定版hadoop-2.5.1.tar.gz 
- 解压hadoop-2.5.1.tar.gz,编辑 - etc/hadoop/hadoop-env.sh文件- 1 
 2
 3
 4
 5- # set to the root of your Java installation 
 export JAVA_HOME=/usr/java/latest
 # Assuming your installation directory is /usr/local/hadoop
 export HADOOP_PREFIX=/usr/local/hadoop
- 执行 - $ bin/hadoop指令
 
- 开启hadoop集群有三种模式 - 本地(单例)模式 - 1 
 2
 3
 4- $ mkdir input 
 $ cp etc/hadoop/*.xml input
 $ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.1.jar grep input output 'dfs[a-z.]+'
 $ cat output/*
- 伪分布式模式 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15- <!--编辑 etc/hadoop/core-site.xml--> 
 <configuration>
 <property>
 <name>fs.defaultFS</name>
 <value>hdfs://localhost:9000</value>
 </property>
 </configuration>
 <!--编辑 etc/hadoop/hdfs-site.xml:-->
 <configuration>
 <property>
 <name>dfs.replication</name>
 <value>1</value>
 </property>
 </configuration>- 1 
 2
 3
 4
 5- # 开启ssh 
 $ ssh localhost
 # 如果启动不了,执行以下操作
 $ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
 $ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys- 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29- # 下面就可以在本地运行map reduce程序了 
 # 首先格式化文件系统
 $ bin/hdfs namenode -format
 # 第二步,开启namenode和datanode后台守护进程。同时产生的日志将会写到$HADOOP_LOG_DIR目录中,默认为 $HADOOP_HOME/logs
 $ sbin/start-dfs.sh
 # 第三步,浏览namenode的web界面,默认的地址是NameNode - http://localhost:50070/
 # 第四步,设定mapreduce 程序运行要求的工作目录
 $ bin/hdfs dfs -mkdir /user
 $ bin/hdfs dfs -mkdir /user/<username>
 # 第五步,将输入文件拷贝到hadoop的分布式文件系统中
 $ bin/hdfs dfs -put etc/hadoop input
 # 第六步,运行hadoop中自带的一些例子程序
 $ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.1.jar grep input output 'dfs[a-z.]+'
 # 第七步,查看输出的结果
 # 可以将结果文件从分布式文件系统中拷贝到本地文件系统中查看
 $ bin/hdfs dfs -get output output
 $ cat output/*
 # 也可以直接在分布式文件系统中查看
 $ bin/hdfs dfs -cat output/*
 # 第八步,完成任务后,关闭后台守护进程
 $ sbin/stop-dfs.sh- 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17- <!--如果想要在YARN上来运行map reduce程序,需要配置一些参数--> 
 <!--从第五-八步有所区别-->
 <!--编辑etc/hadoop/mapred-site.xml-->
 <configuration>
 <property>
 <name>mapreduce.framework.name</name>
 <value>yarn</value>
 </property>
 </configuration>
 <!--编辑etc/hadoop/yarn-site.xml:-->
 <configuration>
 <property>
 <name>yarn.nodemanager.aux-services</name>
 <value>mapreduce_shuffle</value>
 </property>
 </configuration>- 1 
 2
 3
 4
 5
 6- # 开启ResourceManager daemon和NodeManager daemon 
 $ sbin/start-yarn.sh
 # 浏览ResourceManage的web界面,默认地址为ResourceManager - http://localhost:8088/
 # 运行MapReduce job
 # 执行完成,关闭daemon
 $ sbin/stop-yarn.sh
- 完全分布式模式 - 涉及到的主要配置文件 - 只读默认配置:core-default.xml, hdfs-default.xml, yarn-default.xml and mapred-default.xml. 
- 特定配置:conf/core-site.xml, conf/hdfs-site.xml, conf/yarn-site.xml and conf/mapred-site.xml. 
- Hadoop Daemon运行环境配置 - conf/hadoop-env.sh和conf/yarn-env.sh
 
 
- 参考文档:http://hadoop.apache.org/docs/r2.5.1/hadoop-project-dist/hadoop-common/ClusterSetup.html