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
处理客户端请求
启动和监控ApplicationMaster
监控NodeManager
资源分配与调度
ApplicationMaster
数据切分
为程序申请资源并且分配给内部任务
任务监控与容错
NodeManager
单个节点上的资源管理
处理来自ResourceManager 的命令
处理来自ApplicationMaster的命令
Container
对任务运行环境的抽象,封装了CPU,内存等多维资源以及环境变量,启动命令等任务运行相关的星系
离线计算框架MapReduce
将计算分为两个阶段,Map和Reduce阶段
Map阶段并行处理输入数据
Reduce阶段对Map结果进行处理
Shuffle连接Map和Reduce两个阶段
Map Task将数据写入到磁盘
Reduce Task从每个Map Task读取一部分数据
仅仅适合离线批处理
1.具有很好的容错性和扩展性 2.适合简单的批处理任务缺点
1.启动开销大 2.过多使用磁盘导致磁盘效率低下
卸载linux系统自带的环境安装包
rpm -qa|grep java #查询安装的java环境
rpm -e --nodeps + 包名 #卸载相应的安装包,多个包名以空格隔开
安装java的jdk
chmod u+x ./* #为安装文件夹设置可执行权限
tar -zxvf jdk-7u67-linux-x64.tar.gz -C /opt/modules/
#-C 指定解压的位置,默认是当前文件夹
cd /opt/modules/jdk1.7.0_67/
vi /etc/profile #编辑环境变量
export JAVA_HOME=/opt/modules/jdk1.7.0_67/
export PATH=$PATH:$JAVA_HOME/bin
source /etc/profile #使环境变量生效
#退出后重新登录
java -version
#bash: /opt/modules/jdk1.7.0_67/bin/java: cannot execute binary file
#赋值了权限以后还出现这样的问题就是linux版本出现了出现了问题> > 这里输入引用文本
安装hadoop
tar -zxvf hadoop-2.5.0.tar.gz -C /opt/modules/
cd /opt/modules/hadoop-2.5.0/etc/hadoop
echo $JAVA_HOME #输出java环境变量
vi hadoop-env.sh
#查找 JAVA_HOME的位置
export JAVA_HOME=${JAVA_HOME}替换为JAVA_HOME=/opt/modules/jdk1.7.0_67
cd /opt/modules/hadoop-2.5.0
mkdir input
cp etc/hadoop/*.xml input/
#-rw-r--r--. 1 root root 3589 Mar 17 21:57 capacity-scheduler.xml
#-rw-r--r--. 1 root root 774 Mar 17 21:57 core-site.xml
#-rw-r--r--. 1 root root 9201 Mar 17 21:57 hadoop-policy.xml
#-rw-r--r--. 1 root root 775 Mar 17 21:57 hdfs-site.xml
#-rw-r--r--. 1 root root 620 Mar 17 21:57 httpfs-site.xml
#-rw-r--r--. 1 root root 690 Mar 17 21:57 yarn-site.xml
hadoop 环境变量设置
mkdir input
cp etc/hadoop/*.xml input
vi etc/hadoop/hadoop-env.sh
<!-- 找到java_home 设置java环境变量 -->
export JAVA_HOME=/opt/modules/jdk1.7.0_67
vi etc/hadoop/core-site.xml
<configuration>
<!-- NameNode -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop.lilang.com:9000</value>
</property>
<!-- 临时文件夹 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/modules/hadoop-2.5.0/data/tmp</value>
</property>
<!--垃圾处理时间一周 -->
<property>
<name>fs.trash.interval</name>
<value>604800</value>
</property>
</configuration>
vi etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<!-- SecondaryNameNode-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop.jianxin.com:50090</value>
</property>
</configuration>
vi etc/hadoop/mapred-env.xml
export JAVA_HOME=/opt/modules/jdk1.7.0_67
vi etc/hadoop/mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop.jianxin.com:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop.jianxin.com:19888</value>
</property>
</configuration>
#配置yarn的环境变量
vi etc/hadoop/yarn-env.sh
export JAVA_HOME=/opt/modules/jdk1.7.0_67/
vi etc/hadoop/yarn-site.xml
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop.jianxin.com</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- NodeManager Resouce -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>4096</value>
<description>Amount of physical memory, in MB, that can be allocated
for containers.</description>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>4</value>
<description>Number of CPU cores that can be allocated
for containers.</description>
</property>
<!-- 日志聚集功能配置 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>640800</value>
</property>
vi etc/hadoop/slaves
启动方式
jps查看启动了哪些服务
bin/hdfs namenode -format #格式化文件系统,如果启动失败Cannot remove currentdirectory一般是没有用管理员权限登录
全部启动
需要配置ssh免密登录,因为链接节点的时候用的是ssh协议
cd ~
cd .ssh
ssh-keygen -t rsa #指定加密算法
ssh-copy-id hadoop.jianxin.com #拷贝公钥到authorized_keys
sbin/start-all.sh #/opt/modules/hadoop-2.5.0
#默认情况下历史服务器是没有启动的
[root@hadoop hadoop-2.5.0]# jps
5993 Jps
5676 NodeManager
5180 NameNode
5583 ResourceManager
5440 SecondaryNameNode
#单独启动历史服务器
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没有启动起来
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
at org.apache.hadoop.hdfs.server.datanode.DataStorage.doTransition(DataStorage.java:477)
at org.apache.hadoop.hdfs.server.datanode.DataStorage.recoverTransitionRead(DataStorage.java:226)
at org.apache.hadoop.hdfs.server.datanode.DataStorage.recoverTransitionRead(DataStorage.java:254)
at org.apache.hadoop.hdfs.server.datanode.DataNode.initStorage(DataNode.java:975)
at org.apache.hadoop.hdfs.server.datanode.DataNode.initBlockPool(DataNode.java:946)
at org.apache.hadoop.hdfs.server.datanode.BPOfferService.verifyAndSetNamespaceInfo(BPOfferService.java:278)
at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.connectToNNAndHandshake(BPServiceActor.java:220)
at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.run(BPServiceActor.java:812)
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
分模块启动
sbin/start-dfs.sh
sbin/start-yarn.sh
sbin/mr-jobhistory-daemon.sh start historyserver
关闭服务的时候都有相应的关闭模块,即start变为stop
各个服务组件逐一启动
# 各个服务组件逐一启动
# hdfs
sbin/hadoop-daemon.sh start|stop namenode|datanode|secondarynamenode
# yarn
sbin/yarn-daemon.sh start|stop resourcemanager|nodemanager
# mapreduce
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 NameNoderead 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 使用方式)