|
Hadoop可以说是现在最流行,最普遍的分布式系统框架。许多公司都使用Hadoop处理和分析公司内大量的业务和日志数据。同时大数据本身亦是一个很火并且在可预见范围内也会很火的技术。
本文主要是通过实践搭建Hadoop集群,让大家从实际操作中加深对Hadoop原理,框架和配置的理解。
环境准备:
- JAVA:版本 jdk1.8.0_121
下载地址:http://www.oracle.com/technetwork/cn/java/javase/downloads/jdk8-downloads-2133151-zhs.html
- Hadoop:版本 hadoop-2.7.4
下载地址:http://hadoop.apache.org/releases.html
- Zookeeper:版本 zookeeper-3.4.10
下载地址:http://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/
- 操作系统:CentOS release 6.7
http://www.centos.org/download/
注:这里的环境是本人这次实践的环境,java建议使用1.8以上,Hadoop和zookeeper版本和这里的版本差别不是太大应该是没有问题,操作系统是linux,其他Linux版本应该也没有问题。
Hadoop 组织框架
Hadoop主要包括两部分,一部分是HDFS(Hadoop Distributed File System),主要负责分布式存储和计算;另一部分是YARN(Yet Another Resource Negotiator, 从Hadoop2.0开始引入),主要负责集群的资源管理和调度。
HDFS架构
1. Active Name Node
- 主Master,整个Hadoop集群只能有一个
- 管理HDFS文件系统的命名空间
- 维护元数据信息
- 管理副本的配置和信息(默认三个副本)
- 处理客户端读写请求
2. Standby Name Node
- Active Name Node的热备节点
- Active Name Node故障时可快速切换成新的Active Name Node
- 周期性同步edits编辑日志,定期合并fsimage与edits到本地磁盘
3. Journal Node
- 可以被Active Name Node和StandBy Name Node同时访问,用以支持Active Name Node高可用
- Active Name Node在文件系统被修改时,会向Journal Node写入操作日志(edits)
- Standby Name Node同步Journal Node edits日志,使集群中的更新操作可以被共享和同步。
3. Data Node
- Slave 工作节点,集群一般会启动多个
- 负责存储数据块和数据块校验
- 执行客户端的读写请求
- 通过心跳机制定期向NameNode汇报运行状态和本地所有块的列表信息
- 在集群启动时DataNode项NameNode提供存储Block块的列表信息
4. Block数据块
- HDSF固定的最小的存储单元(默认128M,可配置修改)
- 写入到HDFS的文件会被切分成Block数据块(若文件大小小于数据块大小,则不会占用整个数据块)
- 默认配置下,每个block有三个副本
5. Client
- 与Name Node交互获取文件的元数据信息
- 与Data Node,读取或者写入数据
- 通过客户端可以管理HDFS
YARN架构
1. Resource Manager
- 整个集群只有一个Master。Slave可以有多个,支持高可用
- 处理客户端Client请求
- 启动/管理/监控ApplicationMaster
- 监控NodeManager
- 资源的分配和调度
2. Node Manager
- 每个节点只有一个,一般与Data Node部署在同一台机器上且一一对应
- 定时向Resource Manager汇报本机资源的使用状况
- 处理来自Resource Manager的作业请求,为作业分配Container
- 处理来自Application Master的请求,启动和停止Container
3. Application Master
- 每个任务只有一个,负责任务的管理,资源的申请和任务调度
- 与Resource Manager协商,为任务申请资源
- 与Node Manager通信,启动/停止任务
- 监控任务的运行状态和失败处理
4. Container
- 任务运行环境的抽象,只有在分配任务时才会抽象生成一个Container
- 负责任务运行资源和环境的维护(节点,内存,CPU)
- 负责任务的启动
虽然在架构图中没有画出,但Hadoop高可用都是基于Zookeeper来实现的。如NameNode高可用,Block高可用,ResourceManager高可用等。
集群配置
Hadoop集群部署概图
1. 修改各个机器的hostname
为了方便,重命名各机器为图中各个hostname,后面配置就可以使用hostname而不是IP地址。
使用root用户在各个机器上执行(各个机器序号需要改变)
hostname node01#修改完所有机器的hostname后,将IP和hostname的对应关系写到所有机器的/etc/hosts文件中
2. 在各个机器上添加hadoop用户,并修改密码
后面集群的配置和启动都用hadoop来操作
useradd hadoop #添加hadoop用户passwd hadoop #修改hadoop用户密码3. 配置各个机器间相互免密登陆
su hadoop #切换到hadoop用户,后面的命令,没有特殊说明,都是使用hadoop用户操作ssh-keygen -t -rsa #生成密钥,一直按回车即可ssh-copy-id -i node01 #将生成的公钥copy到所有集群上01-05,包括生成密钥的本机。即node01 拷贝到node01-05, node02 拷贝到node01-node05 以此类推4. 创建目录用于保存搭建集群相关的代码和工具
cd ~ #到hadoop home目录mkdir apps # 创建apps目录,用于存放于搭建集群相关的代码和工具。集群所有机器都需要创建该目录5. 安装JDK
#将下载好的JDK copy到刚创建的apps目录下tar -zxvf jdk-8u121-linux-x64.tar.gz #解压jdksu root #下面几步的操作需要root权限ln -s /home/hadoop/app/jdk1.8.0_121 /usr/local/jdk #创建jdk的软连接,所有机器都是相同的目录,为了操作和配置方便vim /etc/profile # 打开该文件并在文末添加:export JAVA_HOME=/usr/local/jdk ,然后保存文件source /etc/profile #重新加载环境配置文件su hadoop #切换回hadoopscp -r /home/hadoop/app/jdk1.8.0_121 hadoop@node02:/home/hadoop/app #将jdk拷贝到集群中其他机器上,然后重复上面的安装JDK步骤java -version #在集群中任一台机器上执行,有如下信息,说明JDK安装成功
6. 配置zookeeper
#将下载好的zookeeper拷贝到node01的/home/hadoop/apps目录下tar -zxvf zookeeper-3.4.10.tar.gz #解压压缩包su root #创建软连接需要root权限ln -s /home/hadoop/apps/zookeeper-3.4.10 /usr/local/zookeeperchown -R hadoop:hadoop /usr/local/zookeeper #修改属组#修改配置文件su hadoopcd /usr/local/zookeepercp /usr/local/zookeeper/conf/zoo_sample.cfg /usr/local/zookeeper/conf/zoo.cfg# 修改下图中红框的内容
zoo.cfg
scp -r /usr/local/zookeeper hadoop@node02:/home/hadoop/app #将zookeeper拷贝到node02和node03机器上,并创建软连接和修改属组#在node01,node02,node03上运行下面命令/usr/local/zookeeper/bin/zkServer.sh start #启动zookeeper/usr/local/zookeeper/bin/zkServer.sh status #查看zookeeper运行状态# 有如下图输出,说明zookeeper配置和运行成功。其中Mode可以为leader(只会有一个),follower(有两个)
7. 配置Hadoop
#将hadoop安装包拷贝到node01的/home/hadoop/apps目录下tar -zxvf hadoop-2.7.4.tar.gz #解压下载copy过来的hadoop压缩包su rootln -s /home/hadoop/apps/hadoop-2.7.4 /usr/local/hadoop #创建软连接chown -R hadoop:hadoop /usr/local/hadoop #修改软连接属组为hadoopsu hadoopcd /usr/local/hadoop/etc/hadoop#修改hadoop-env.shexport JAVA_HOME=/usr/local/jdk #找到export JAVA_HOME并修改#修改core-site.xml#找到configuration,并按下图修改
core-site.xml配置
#修改hdfs-site.xml#找到configuration,并按下图修改
hdfs-site.xml
#修改yarn-site.xml#找到configuration,并按下图修改
yarn-site.xml
#在/usr/local/hadoop目录下创建hdpdata文件夹cd /usr/local/hadoopmkdir hdpdata#修改slave文件,设置datanode和nodemanager的启动节点vim /usr/local/hadoop/etc/hadoop/slaves #添加以下内容node03node04node05#修改/etc/profile,配置环境变量su root vim /etc/profile#添加hadoop相关环境变量,配置完后/etc/profile文件应该包含以下信息source /etc/profile
#拷贝hadoop目录到其他(node02 - node05)机器上scp -r /usr/local/hadoop hadoop@node02:/home/hadoop/apps#在各个机器上创建hadoop的软连接并修改属组#修改各个机器上的/etc/profile至此,hadoop集群的配置完成,下一步我们来启动Hadoop集群
集群启动
以下操作都使用hadoop用户。
1. 启动Journal Node
参照部署图,Journal Node部署在node03,node04,node05上
分别去这几台机器上执行:
/usr/local/hadoop/sbin/hadoop-daemon.sh start journalnodejps #运行该命令后,如果输出中有JournalNode则表明启动成功2. 格式化HDFS
我们的namenode avtive部署在node01上,去node01上格式化HDFS
hdfs namenode -format格式化成功后会在/usr/local/hadoop/hdpdata(在core-site.xml中配置,并在前面已经提前创建)中新增一个dfs目录。将该目录copy到node02上,因为我们的namenode standby部署在node02上
scp -r /usr/local/hadoop/hdpdata/dfs hadoop@node02:/usr/local/hadoop/hdpdata3. 启动ZKFC
ZKFC(ZK Failover Controller)主要是确保namenode的高可用,在active namenode不可用时及时切换到standby namenode。我们在node01上执行:
hdfs zkfc -formatZK有如下输出表明ZKFC启动成功:
INFO ha.ActiveStandbyElector: Successfully created /hadoop-ha/ns in ZK4. 启动HDFS(node01)
/usr/local/hadoop/sbin/start-dfs.sh5. 启动YARN(node02)
/usr/local/hadoop/sbin/start-yarn.sh并且在node01上也启动一个ResourceManager作为备份节点
/usr/local/hadoop/sbin/yarn-daemon.sh start resourcemanager6. 启动JobHistoryServer(node2)
/usr/local/hadoop/sbin/mr-jobhistory-daemon.sh start historyserver通过jps命令可以查看到一个JobHistoryServer进程
至此,hadoop集群的启动完成了,下一步我们通过网页查看集群状态。
Hadoop状态界面
在我们需要访问集群的机器上配置下面hosts项(主要是为了访问方便)
1. NameNode Active (http://node01:50070/)
2. NameNode StandBy (http://node02:50070/)
3. Resource Manager (http://node02:8088/)
注:这里我自己添加了一台Data Node。大家也可以自行找些资料来练习如何动态的添加和删除DataNode。
4. Job History (http://node02:19888/)
注:这里我提前运行了一个JOB,所以有一条记录
总结
Hadoop集群的搭建流程比较长,配置和安装需要注意的细节也比较多。但从头走一次下来,会对Hadoop有更深的理解。网上也有一些自动话脚本,但自己操作一遍后,也才能理解里面的操作流程。搭建完成后,就可以写些任务来测试。或者在 Hadoop集群上结合更多的东西,如kafka,hive等。
Hadoop是很成熟的技术,如果你遇到了问题,其他人可能也遇到过相同问题,大家可以自行百度或其他技术网站,或者在下面留言,大家一起讨论。
如果本文有理解或者操作有问题,也希望大家不吝指教。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册!
x
|