Hadoop的整体介绍及安装

Posted 简心大数据技术

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hadoop的整体介绍及安装相关的知识,希望对你有一定的参考价值。

什么是Hadoop

Hadoop项目主要包括以下四个模块:

  • Hadoop Common 为其他Hadoop模块提供基础设施

  • Hadoop HDFS 一个高可靠,高吞吐量的分布式文件系统

  • Hadoop MapReduce 一个分布式离线并行计算框架

  • Hadoop Yarn 一个新的MapReduce 框架,任务调度与资源处理

Hadoop体系结构

HDFS和MapReduce是Hadoop的核心,Hadoop就是靠HDFS来实现分布式存储的支持,通过MapReduce来进行并行计算处理。

HDFS体系结构

HDFS采用了主从结构模型即采用Master-Slaver模式,HDFS集群是有一个NameNode和多个DataNode组成的。 NameNode中心服务器(Master):维护文件系统树、以及整棵树内的文件目录、负责整个数据集群的管理。

DataNode分布在不同的机架上(Slaver):在客户端或者NameNode的调度下,存储并检索数据块,并且定期向NameNode发送所存储的数据块的列表。

机架:HDFS集群,由分布在多个机架上的大量DataNode组成,不同机架之间节点通过交换机通信,HDFS通过机架感知策略,使NameNode能够确定每个DataNode所属的机架ID,使用副本存放策略,来改进数据的可靠性、可用性和网络带宽的利用率。

数据块(block):HDFS最基本的存储单元,默认为64M,用户可以自行设置大小。

元数据:指HDFS文件系统中,文件和目录的属性信息。HDFS实现时,采用了 镜像文件(Fsimage) + 日志文件(EditLog)的备份机制。文件的镜像文件中内容包括:修改时间、访问时间、数据块大小、组成文件的数据块的存储位置信息。目录的镜像文件内容包括:修改时间、访问控制权限等信息。日志文件记录的是:HDFS的更新操作。

NameNode启动的时候,会将镜像文件和日志文件的内容在内存中合并。把内存中的元数据更新到最新状态。

用户数据:HDFS存储的大部分都是用户数据,以数据块的形式存放在DataNode上。

在HDFS中,NameNode 和 DataNode之间使用TCP协议进行通信。DataNode每3s向NameNode发送一个心跳。每10次心跳后,向NameNode发送一个数据块报告自己的信息,通过这些信息,NameNode能够重建元数据,并确保每个数据块有足够的副本。




Reduce的体系结构

  • 分布式编程架构


  • 以数据为中心,更看重吞吐率


  • 分而治之(把对大规模数据集的操作,分发给一个主节点管理下的各个分节点共同完成,然后整合各个节点的中间结果得到最终的输出)


  • Map把一个任务分解成多个子任务


  • Reduce将分解后的多任务分别处理,并将结果汇总为最终的结果


也采用了Master-Slaver结构。

4个实体:

  • Client


  • JobTraker


  • TaskTraker(任务节点)


  • HDFS(输入、输出数据、配置信息等) 作业(Job):在Hadoop内部,用Job来表示运行的MapReduce程序所需要用到的所有jar文件和类的集合,这些文件最终都被整合到一个jar文件中,将此jar文件提交给JobTraker,MapReduce程序就会执行。


任务(Task):MapTask和ReduceTask

键值对(key/value pair)

Map()、Reduce()函数的输入、输出都是 的形式

HDFS存储的输入数据经过解析后,以键值对的形式,输入到MapReduce()函数中进行处理,输出一系列键值对作为中间结果,在Reduce阶段,对拥有同样Key值的中间数据进行合并形成最后结果。 生命周期: 1.提交作业

-在作业提交之前,需要对作业进行配置;

-程序代码,主要是自己编写的MapReduce程序;

-配置输入输出路径、输出是否压缩;

-配置完成后,通过JobClient来提交;

作业调度算法:

FIFO调度器(默认)、公平调度器、容量调度器

2.任务分配

-TaskTracker和JobTracker之间的通信与任务的分配是通过心跳机制完成的;

-TaskTracker会主动向JobTracker询问是否有作业要做,如果自己可以做,那么就会申请到作业任务,这个任务 可以使Map也可能是Reduce任务;

3.任务执行

-TaskTraker将代码和配置信息到本地;

-分别为每一个Task启动JVM运行任务

4.状态更新

-任务在运行过程中,首先会将自己的状态汇报给TaskTracker,然后由TaskTracker汇总告之JobTracker;

-任务进度是通过计数器来实现的;

-JobTracker是在接受到最后一个任务运行完成后,才会将作业标志为成功。

借鉴https://blog.csdn.net/u013063153/article/details/53114989

MapReduce数据流图

用户自定义map函数接收一个输入的key/value,然后产生一个集合,MapReduce把所有相同的key的值的value组成一个集合。reduce合并这些value值。通常我们通过一个迭代器把value值提供给reduce,这样就可以处理无法全部放入内存的大量数据。

HDFS服务功能

  • NameNode是主节点,存储文件的元数据,包括文件名,文件目录结构,文件属性(生成时间,文件属性,文件权限)以及每个文件的块列表和块所在的DataNode

  • DataNode 在本地文件系统存储文件块数据,以及块数据的校验和。

  • Secondary NameNode 用来监控HDFS状态的辅助后台程序,每隔一段时间获取HDFS元数据的快照。

YARN 服务功能

  • ResourceManager

    1. 处理客户端请求

    2. 启动和监控ApplicationMaster

    3. 监控NodeManager

    4. 资源分配与调度

  • ApplicationMaster

    1. 数据切分

    2. 为程序申请资源并且分配给内部任务

    3. 任务监控与容错

  • NodeManager

    1. 单个节点上的资源管理

    2. 处理来自ResourceManager 的命令

    3. 处理来自ApplicationMaster的命令

  • Container

    1. 对任务运行环境的抽象,封装了CPU,内存等多维资源以及环境变量,启动命令等任务运行相关的星系

离线计算框架MapReduce

  • 将计算分为两个阶段,Map和Reduce阶段

    1. Map阶段并行处理输入数据

    2. Reduce阶段对Map结果进行处理

  • Shuffle连接Map和Reduce两个阶段

    1. Map Task将数据写入到磁盘

    2. Reduce Task从每个Map Task读取一部分数据

  • 仅仅适合离线批处理
    1.具有很好的容错性和扩展性 2.适合简单的批处理任务

  • 缺点
    1.启动开销大 2.过多使用磁盘导致磁盘效率低下

卸载linux系统自带的环境安装包

 
   
   
 
  1. rpm -qa|grep java #查询安装的java环境

  2. rpm -e --nodeps + 包名 #卸载相应的安装包,多个包名以空格隔开

安装java的jdk

 
   
   
 
  1. chmod u+x ./* #为安装文件夹设置可执行权限

  2. tar -zxvf jdk-7u67-linux-x64.tar.gz -C /opt/modules/

  3. #-C 指定解压的位置,默认是当前文件夹

  4. cd /opt/modules/jdk1.7.0_67/

  5. vi /etc/profile #编辑环境变量

  6. export JAVA_HOME=/opt/modules/jdk1.7.0_67/

  7. export PATH=$PATH:$JAVA_HOME/bin

  8. source /etc/profile #使环境变量生效

  9. #退出后重新登录

  10. java -version

  11. #bash: /opt/modules/jdk1.7.0_67/bin/java: cannot execute binary file

  12. #赋值了权限以后还出现这样的问题就是linux版本出现了出现了问题> > 这里输入引用文本

安装hadoop

 
   
   
 
  1. tar -zxvf hadoop-2.5.0.tar.gz -C /opt/modules/

  2. cd /opt/modules/hadoop-2.5.0/etc/hadoop

  3. echo $JAVA_HOME #输出java环境变量

  4. vi hadoop-env.sh

  5. #查找 JAVA_HOME的位置

  6. export JAVA_HOME=${JAVA_HOME}替换为JAVA_HOME=/opt/modules/jdk1.7.0_67

  7. cd /opt/modules/hadoop-2.5.0

  8. mkdir input

  9. cp etc/hadoop/*.xml input/

  10. #-rw-r--r--. 1 root root 3589 Mar 17 21:57 capacity-scheduler.xml

  11. #-rw-r--r--. 1 root root  774 Mar 17 21:57 core-site.xml

  12. #-rw-r--r--. 1 root root 9201 Mar 17 21:57 hadoop-policy.xml

  13. #-rw-r--r--. 1 root root  775 Mar 17 21:57 hdfs-site.xml

  14. #-rw-r--r--. 1 root root  620 Mar 17 21:57 httpfs-site.xml

  15. #-rw-r--r--. 1 root root  690 Mar 17 21:57 yarn-site.xml

hadoop 环境变量设置

 
   
   
 
  1. mkdir input

  2. cp etc/hadoop/*.xml input

 
   
   
 
  1. vi etc/hadoop/hadoop-env.sh

  2. <!-- 找到java_home 设置java环境变量 -->

  3. export JAVA_HOME=/opt/modules/jdk1.7.0_67

 
   
   
 
  1. vi etc/hadoop/core-site.xml

 
   
   
 
  1. <configuration>

  2.     <!-- NameNode -->

  3.     <property>

  4.        <name>fs.defaultFS</name>

  5.        <value>hdfs://hadoop.lilang.com:9000</value>

  6.     </property>

  7.     <!-- 临时文件夹 -->

  8.     <property>

  9.        <name>hadoop.tmp.dir</name>

  10.        <value>/opt/modules/hadoop-2.5.0/data/tmp</value>

  11.     </property>

  12.     <!--垃圾处理时间一周 -->

  13.     <property>

  14.        <name>fs.trash.interval</name>

  15.        <value>604800</value>

  16.    </property>

  17. </configuration>

 
   
   
 
  1. vi etc/hadoop/hdfs-site.xml

 
   
   
 
  1. <configuration>

  2.    <property>

  3.        <name>dfs.replication</name>

  4.        <value>1</value>

  5.    </property>

  6.    <!-- SecondaryNameNode-->

  7.    <property>

  8.        <name>dfs.namenode.secondary.http-address</name>

  9.        <value>hadoop.jianxin.com:50090</value>

  10.    </property>

  11. </configuration>

 
   
   
 
  1. vi etc/hadoop/mapred-env.xml

 
   
   
 
  1. export JAVA_HOME=/opt/modules/jdk1.7.0_67

 
   
   
 
  1. vi etc/hadoop/mapred-site.xml

 
   
   
 
  1. <configuration>

  2.    <property>

  3.        <name>mapreduce.framework.name</name>

  4.        <value>yarn</value>

  5.    </property>

  6.    <property>

  7.        <name>mapreduce.jobhistory.address</name>

  8.        <value>hadoop.jianxin.com:10020</value>

  9.    </property>

  10.    <property>

  11.        <name>mapreduce.jobhistory.webapp.address</name>

  12.        <value>hadoop.jianxin.com:19888</value>

  13.    </property>

  14. </configuration>

 
   
   
 
  1. #配置yarn的环境变量

  2. vi etc/hadoop/yarn-env.sh

 
   
   
 
  1. export JAVA_HOME=/opt/modules/jdk1.7.0_67/

 
   
   
 
  1. vi etc/hadoop/yarn-site.xml

 
   
   
 
  1. <property>

  2.    <name>yarn.resourcemanager.hostname</name>

  3.    <value>hadoop.jianxin.com</value>

  4. </property>

  5. <property>

  6.    <name>yarn.nodemanager.aux-services</name>

  7.    <value>mapreduce_shuffle</value>

  8. </property>

  9. <!-- NodeManager Resouce -->

  10. <property>

  11.    <name>yarn.nodemanager.resource.memory-mb</name>

  12.    <value>4096</value>

  13.    <description>Amount of physical memory, in MB, that can be allocated

  14.    for containers.</description>

  15. </property>

  16. <property>

  17.    <name>yarn.nodemanager.resource.cpu-vcores</name>

  18.    <value>4</value>

  19.    <description>Number of CPU cores that can be allocated

  20.    for containers.</description>

  21. </property>

  22. <!-- 日志聚集功能配置 -->

  23. <property>

  24.    <name>yarn.log-aggregation-enable</name>

  25.    <value>true</value>

  26. </property>

  27. <property>

  28.    <name>yarn.log-aggregation.retain-seconds</name>

  29.    <value>640800</value>

  30. </property>

 
   
   
 
  1. vi etc/hadoop/slaves

启动方式

jps查看启动了哪些服务

 
   
   
 
  1. bin/hdfs namenode -format #格式化文件系统,如果启动失败Cannot remove currentdirectory一般是没有用管理员权限登录  

  • 全部启动
    需要配置ssh免密登录,因为链接节点的时候用的是ssh协议

 
   
   
 
  1. cd ~

  2. cd .ssh

  3. ssh-keygen -t rsa #指定加密算法

  4. ssh-copy-id hadoop.jianxin.com #拷贝公钥到authorized_keys

  5. sbin/start-all.sh            #/opt/modules/hadoop-2.5.0

  6. #默认情况下历史服务器是没有启动的

  7. [root@hadoop hadoop-2.5.0]# jps

  8. 5993 Jps

  9. 5676 NodeManager

  10. 5180 NameNode

  11. 5583 ResourceManager

  12. 5440 SecondaryNameNode

  13. #单独启动历史服务器

  14. sbin/mr-jobhistory-daemon.sh start historyserver

[root@hadoop hadoop-2.5.0]# jps
6038 JobHistoryServer
5676 NodeManager
5180 NameNode
6137 Jps
5583 ResourceManager
5440 SecondaryNameNode
这是失败的,因为datanode没有启动起来

 
   
   
 
  1. java.io.IOException: Incompatible clusterIDs in /opt/modules/hadoop-2.5.0/data/tmp/dfs/data: namenode clusterID = CID-e0ceb89a-d6ce-4c97-888c-32f68887d925; datanode clusterID = CID-a1ab5bc9-d4fc-4e4e-a4f6-e53da68f905a

  2.    at org.apache.hadoop.hdfs.server.datanode.DataStorage.doTransition(DataStorage.java:477)

  3.    at org.apache.hadoop.hdfs.server.datanode.DataStorage.recoverTransitionRead(DataStorage.java:226)

  4.    at org.apache.hadoop.hdfs.server.datanode.DataStorage.recoverTransitionRead(DataStorage.java:254)

  5.    at org.apache.hadoop.hdfs.server.datanode.DataNode.initStorage(DataNode.java:975)

  6.    at org.apache.hadoop.hdfs.server.datanode.DataNode.initBlockPool(DataNode.java:946)

  7.    at org.apache.hadoop.hdfs.server.datanode.BPOfferService.verifyAndSetNamespaceInfo(BPOfferService.java:278)

  8.    at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.connectToNNAndHandshake(BPServiceActor.java:220)

  9.    at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.run(BPServiceActor.java:812)

  10.    at java.lang.Thread.run(Thread.java:745)

每次namenode format会重新创建一个namenodeId,而data目录包含了上次format时的id,namenode format清空了namenode下的数据,但是没有清空datanode下的数据,导致启动时失败,所要做的就是每次fotmat前,清空data下的所有目录。 或者是先停掉集群,然后将datanode节点目录/dfs/data/current/VERSION中的clusterID修改为与dfs/name/current/VERSION中的clusterID 一致即可。 /opt/modules/hadoop-2.5.0/data/tmp/dfs

  • 分模块启动

 
   
   
 
  1. sbin/start-dfs.sh  

  2. sbin/start-yarn.sh

  3. sbin/mr-jobhistory-daemon.sh start historyserver

关闭服务的时候都有相应的关闭模块,即start变为stop

  • 各个服务组件逐一启动

 
   
   
 
  1. # 各个服务组件逐一启动

  2. # hdfs

  3. sbin/hadoop-daemon.sh start|stop namenode|datanode|secondarynamenode

  4. # yarn

  5. sbin/yarn-daemon.sh start|stop resourcemanager|nodemanager

  6. # mapreduce

  7. sbin/mr-historyserver-daemon.sh start|stop historyserver        

HDFS架构(分布式文件系统)

  • 易于扩展的分布式文件系统

  • 运行在大量的普通廉价机器上 提供容错机制

  • 为大量用户提供性能不错的文件存取服务

NameNode

  • NameNode是一个中心服务器,单一节点,负责管理文件系统的名字空间,以及客户端对文件的访问。

  • 文件操作 NameNode负责文件元数据的操作,DataNode负责处理文件的内容读写请求,跟文件相关的东西不会经过NameNode,只会询问它和哪个DataNode有联系。

  • 副本存放在哪些DataNode上由NameNode决定,读取文件的时候NameNode尽量让用户先读取最近的副本,降低块的消耗和读取延迟。

  • NameNode全权管理数据块的复制,周期性的接收从集群的每个DataNode传递过来的心跳信号和块状态报告。块状态报告包含了改DataNode上的所有的数据块的列表。

DataNode

  • 一个数据块在DataNode以文件的存储在磁盘上 ,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和以及时间戳。

  • DataNode启动后向NameNode注册,通过后周期性的向NameNode上报所有的块信息。

  • DataNode是每三秒心跳一次,心跳结果带有NameNode给DataNode的命令,如果超过十分钟NameNode没有收到DataNode的心跳,则认为该节点不可用。

  • 集群运行中可以安全的加入或者退出一些机器。

  • 文件大小
    文件被切分为块,默认大小为128M,以块为单位,每个块有多个副本存储在不同的机器上,副本数可在文件生成时指定。
    可以创建,删除,移动或者重命名文件,当文件的创建,写入,关闭之后不能修改文件中的内容了。

数据损坏处理

当DataNode读取block的时候,会计算checksum,如果计算后的checksum和创建block的时候不一样,说明该block已经损坏。客户端就会读取其他块上的数据,NameNode标记该块已经损坏,删除坏的块,然后复制其他好的block达到预期设置的文件的备份数,DataNode在其文件创建三周以后验证其checknum。

NameNode启动方式

NameNode

  • 内存

  • 本地磁盘

    • fsimage

    • edits 格式化HDFS,目的就是生成fsimage
      0-> format
      1-> fsimage
      2-> Start NameNode

    • read fsimage
      3-> Start DataNode

    • 注册

    • block report 4-> create dir /user/beifeng/tmp -> write [edits]
      5-> put files /user/beifeg/tmp(*-site.xml) -> write [edits]
      6-> delete file /user/beifeng/tmp/core-site.xml -> write [edits]

Namenode保存文件系统元数据镜像,namenode在内存及磁盘(fsimage和editslog)上分别存在一份元数据镜像文件,内存中元数据镜像保证了hdfs文件系统文件访问效率,磁盘上的元数据镜像保证了hdfs文件系统的安全性。

namenode在磁盘上的两类文件组成:

fsimage文件:保存文件系统至上次checkpoint为止目录和文件元数据。

edits文件:保存文件系统从上次checkpoint起对hdfs的所有操作记录日志信息。

  • 首此启动hdfs过程:

首次安装格式化(format)主要作用是在本地文件系统生成fsimage文件 启动namenode:

读取fsimage生成内存中元数据镜像。

启动datanode:

向namenode注册;

向namenode发送blockreport。

启动成功后,client可以对HDFS进行目录创建、文件上传、下载、查看、重命名等操作,更改namespace的操作将被记录在edits文件中。

  • 之后启动HDFS文件系统过程 启动namenode:

读取fsimage元数据镜像文件,加载到内存中。

读取editlog日志文件,加载到内存中,使当前内存中元数据信息与上次关闭系统时保持一致。然后在磁盘上生成一份同内存中元数据镜像相同的fsimage文件,同时生成一个新的的editlog文件用于记录以后的hdfs文件系统的更改。

启动datanode:

向namenode注册;

向namenode发送blockreport。

启动成功后,client可以对HDFS进行目录创建、文件上传、下载、查看、重命名等操作,更改namespace的操作将被记录在editlog文件中。

SecondaryNameNode

SecondaryNameNode的主要作用是用于合并fsimage和editlog文件。在没有SecondaryNameNode守护进程的情况下,从namenode启动开始至namenode关闭期间所有的HDFS更改操作都将记录到editlog文件,这样会造成巨大的editlog文件,所带来的直接危害就是下次启动namenode过程会非常漫长。

在启动SecondaryNameNode守护进程后,每当满足一定的触发条件(每3600s、文件数量增加100w等),SecondaryNameNode都会拷贝namenode的fsimage和editlog文件到自己的目录下,首先将fsimage加载到内存中,然后加载editlog文件到内存中合并fsimage和editlog文件为一个新的fsimage文件,然后将新的fsimage文件拷贝回namenode目录下。并且生成新的editlog文件用于记录DFS的更改。

  • 工作流程 Secondary namenode工作流程:

1)secondary通知namenode切换edits文件

2)secondary通过http请求从namenode获得fsimage和edits文件

3)secondary将fsimage载入内存,然后开始合并edits

4)secondary将新的fsimage发回给namenode

5)namenode用新的fsimage替换旧的fsimage

安全模式

在启动namenode至所有datanode启动完成前的阶段成为安全模式。在安全模式下,client只能读取部分HDFS文件信息,不允许client对HDFS的任何更改操作,比如创建目录、上传文件、删除文件、重命名文件等。

bin/hdfs dfsadmin -safemode


以上是关于Hadoop的整体介绍及安装的主要内容,如果未能解决你的问题,请参考以下文章

Hadoop 综合揭秘——MapReduce 编程实例(详细介绍 CombinePartitionerWritableComparableWritableComparator 使用方式)

Storm介绍及安装部署

Hadoop整体介绍

Hadoop——安装以及整体了解

Hadoop分布式集群安装

Hadoop学习之hadoop安装JDK安装集群启动(完全分布式)