大数据平台安装部署系列——【3】Hadoop集群搭建
Hadoop集群搭建
===================================================================
看一百篇文章,读一百遍手册,不如自己动手操做一遍。
大数据平台也一样,你也许用过hadoop/hdfs,hbase,spark,kafka,......等等系统或组件,但真正动手部署过的人也许不多,如果是多个系统集成到一起部署可能更是少之又少。
学习就是要不停地折腾,多折腾几遍你就自然熟悉了,很多原理也就明白了。
因此计划做一个“大数据平台安装部署系列”的博文,step by step,逐步深入,希望对学习者有所帮助。
注:所有内容均能在互联网中找到,本人做了整合和梳理,所有步骤及相关命令经过本人亲手验证。欢迎转载但请注明出处。
约定:
a. 系统命令执行
#符号开头的命令行,是指以root用户运行的命令
$符号开头的命令行,是指以普通用户运行的命令
b. 加黄底色的文字,一般是指配置文件或脚本文件中的内容
如:<name>hadoop.tmp.dir</name>
===================================================================
今天开始搭建Hadoop集群,步骤较多,同时需要具备一定的Linux/Unix操作系统的使用技能。但只要能按步骤进行,细心仔细的进行操作,应该都能部署成功。
1. 规划
计划配置NameNode+HA、ResourceManager+HA,并使用zookeeper来管理Hadoop集群。
5台主机,CentOS 7(vm 虚拟机,4G/200G/1*2CPU)
用户:每台主机用户都是hadoop.
Java: openjdk version "1.8.0_161"
centos7-220:192.168.13.220 图形界面,8Gmemory/ 也可以和其他主机一样,图像界面不是必须的。实际环境部署时推荐使用server模式。
centos7-221:192.168.13.221 server 4G
centos7-222:192.168.13.222 server 4G
centos7-223:192.168.13.223 server 4G
centos7-224:192.168.13.224 server 4G
软件目录:/usr/local/hadoop /usr/local/spark /usr/local/zookeeper
注:此处软件目录一般来说只是一个软连接,连向一个带有版本号的目录,即实际目录,这样方便以后升级。是否使用这种方式视个人习惯而定。
实际目录为:/home/hadoop/bdapps/hadoop.2.9.1 ......
数据目录:/home/hadoop/bdapps/data,在该目录下创建hadoop,spark,zookeeper等的目录
HDFS数据存放目录:/home/hadoop/bdapps/data/hadoop/dfs/name & /home/hadoop/bdapps/data/hadoop/dfs/data
2. 环境配置
2.1 操作系统安装,IP地址及主机名配置
# vi /etc/hosts 增加
192.168.13.220 centos7-220
192.168.13.221 centos7-221
192.168.13.222 centos7-222
192.168.13.223 centos7-223
192.168.13.224 centos7-224
拷贝到其他四个机器上
# scp /etc/hosts root@centos7-222:/etc/hosts
2.2 配置ssh免密登录
2.2.1 在每一台机器上配置本机免密登录
# 编辑 /etc/ssh/sshd_config,打开允许RSA pub key登录的选项
PubkeyAuthentication yes
重启服务
# service sshd restart
$ cd ~/.ssh/
$ ssh-keygen -t rsa
$ cat id_rsa.pub >> authorized_keys
$ chmod 600 authorized_keys
这个步骤不能漏
$ ssh localhost
验证是否能够免密登录成功
2.2.2 将每台机器的public key归集到一起,并且分发到每一台主机上。
$ hadoop用户:scp centos7-22x:~/.ssh/id_rsa.pu ~/.ssh/id_rsa.pub.22x
$ cat id_rsa.pub.22x >> authorized_keys
重复以上步骤,将pub key收集完得到authorized_keys。
$ scp authorized_keys centos7-22x:~/.ssh/
重复以上步骤,将authorized_keys分发到每个主机上。
2.3 JAVA环境,在每一台主机上安装jdk
$ scp java-1.8.0-openjdk-devel-1.8.0.161-2.b14.el7.x86_64.rpm centos7-22x:~
# su && rpm -i java-1.8.0-openjdk-devel-1.8.0.161-2.b14.el7.x86_64.rpm
......
配置JAVA_HOME
$ vi .bashrc 增加
export JAVA_HOME=/usr/lib/jvm/java
2.4 时间同步配置
一般来说安装时选择了时区的话,应该就是OK的。否则需要
[hadoop@centos7-220 Asia]$ ll /etc/localtime
lrwxrwxrwx. 1 root root 35 9\u6708 25 18:35 /etc/localtime -> ../usr/share/zoneinfo/Asia/Shanghai
root用户执行如下命令
# ntpdate pool.ntp.org
2.5 创建相应目录,需要在每个主机上创建相应目录
$ mkdir -p /home/hadoop/bdapps/data/hadoop/dfs/name
$ mkdir -p /home/hadoop/bdapps/data/hadoop/dfs/data
$ mkdir -p /home/hadoop/bdapps/data/zookeeper/zkdata
$ mkdir -p /home/hadoop/bdapps/data/zookeeper/zklog
3. 安装Zookeeper
3.1 先在一台主机上安装
下载zookeeper:https://www.apache.org/dyn/closer.cgi/zookeeper/
解压到/home/hadoop/bdapps/目录下
# cd /usr/local/ && ln -s /home/hadoop/bdapps/zookeeper-3.4.13 zookeeper
$ cd /usr/local/zookeeper/conf && cp zoo_sample.conf zoo.conf
$ vi zoo.conf 增加相应的配置,如下:
[hadoop@centos7-220 conf]$ diff zoo.cfg zoo_sample.cfg
12,14c12
< #dataDir=/tmp/zookeeper
< dataDir=/home/hadoop/bdapps/data/zookeeper/zkdata
< dataLogDir=/home/hadoop/bdapps/data/zookeeper/zklog
---
> dataDir=/tmp/zookeeper
31,35d28
< server.0=centos7-220:2888:3888
< server.1=centos7-221:2888:3888
< server.2=centos7-222:2888:3888
< server.3=centos7-223:2888:3888
< server.4=centos7-224:2888:3888
注:此处server.x中的数字应该与myid匹配,否则启动会失败
myid的设置见下面3.3。
3.2 将zookeeper安装目录打包并分发到其他主机上
copy zookeeper目录到其他节点机器上。
$ tar zcvf zookeeper-3.4.13.tar.gz zookeeper-3.4.13
重复以下步骤
$ scp -r zookeeper-3.4.13.tar.gz centos7-221:~/bdapps/
$ ssh centos7-221
$ cd ~/bdapps && tar zxvf zookeeper-3.4.13.tar.gz
$ su - root
# cd /usr/local && ln -s /home/hadoop/bdapps/zookeeper-3.4.13 zookeeper
# exit
3.3 设置每个zookeeper节点的id值。
修改每个zookeeper节点的id, 分别设为0,1,2,3,4
此处的id值必须与3.1步中的配置文件中的server.id对应。
$ cd /home/hadoop/bdapps/data/zookeeper/zkdata && echo "0">myid && more myid
3.4 设置ZOOKEEPER_HOME环境变量
$ vi ~/.bashrc 并在其中增加ZOOKEEPER_HOME的设置
export ZOOKEEPER_HOME=/usr/local/zookeeper
重新登录或在命令行执行上面的export命令。
$ cd $ZOOKEEPER_HOME && bin/zkServer.sh start
$ jps 验证zookeeper安装是否成功
对每一台机器启动zookeeper,使用bin/zkServer.sh status 查看状态,5台中有1台Leader和4台follower. 停掉Leader的话,会自动重新选取并产生一个Leader。
使用bin/zkServer.sh stop停止zookeeper。
可以使用/usr/hadoop/bdapps/tools/下的deploy.conf, deploy.sh和runRemoteCmd.sh两个工具帮助在多主机上运行相同命令。如:
$ ./runRemoteCmd.sh jps all
参考:大数据平台安装部署系列——【2】大数据平台部署脚本工具
3. 安装Hadoop
下载hadoop安装包,解压到规划的目录下。
$ cd /home/hadoop/bdapps/ && tar zxvf hadoop-2.9.1.tar.gz .
$su
# cd /usr/local && ln -s /home/hadoop/bdapps/hadoop-2.9.1 hadoop
$ vi ~/.bashrc 并且增加:
export HADOOP_HOME=/usr/local/hadoop
3.1 配置hadoop-env.sh
$vi hadoop-env.sh
将JAVA_HOME设为/usr/lib/jvm/java
3.2 配置core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://cluster1</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/home/hadoop/bdapps/data/hadoop/tmp</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>centos7-220:2181,centos7-221:2181,centos7-222:2181,centos7-223:2181,centos7-224:2181</value>
</property>
</configuration>
3.3 配置hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 数据块副本数为 3 -->
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<!-- 权限默认配置为false -->
<property>
<name>dfs.nameservices</name>
<value>cluster1</value>
</property>
<!-- 命名空间,它的值与fs.defaultFS的值要对应,namenode高可用之后有两个namenode,cluster1是对外提供的统一入口 -->
<property>
<name>dfs.ha.namenodes.cluster1</name>
<value>nameService1,nameService2</value>
</property>
<!-- 指定 nameService 是 cluster1 时的nameNode有哪些,这里的值也是逻辑名称,名字随便起,相互不重复即可 -->
<property>
<name>dfs.namenode.rpc-address.cluster1.nameService1</name>
<value>centos7-220:9000</value>
</property>
<!-- nameService1 rpc地址 -->
<property>
<name>dfs.namenode.http-address.cluster1.nameService1</name>
<value>centos7-220:50070</value>
</property>
<!-- nameService1 http地址 -->
<property>
<name>dfs.namenode.rpc-address.cluster1.nameService2</name>
<value>centos7-221:9000</value>
</property>
<!-- nameService2 rpc地址 -->
<property>
<name>dfs.namenode.http-address.cluster1.nameService2</name>
<value>centos7-221:50070</value>
</property>
<!-- nameService2 http地址 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 启动故障自动恢复 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://centos7-220:8485;centos7-221:8485;centos7-222:8485;centos7-223:8485;centos7-224:8485/cluster1</value>
</property>
<!-- 指定journal -->
<property>
<name>dfs.client.failover.proxy.provider.cluster1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 指定 cluster1 出故障时,哪个实现类负责执行故障切换 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadoop/bdapps/data/hadoop/journaldata/jn</value>
</property>
<!-- 指定JournalNode集群在对nameNode的目录进行共享时,自己存储数据的磁盘路径 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>shell(/bin/true)</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>10000</value>
</property>
<!-- 脑裂默认配置 -->
<property>
<name>dfs.namenode.handler.count</name>
<value>100</value>
</property>
<!-- 未配置以下两项时,出现权限错误,无法格式化hdfs -->
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoop/bdapps/data/hadoop/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoop/bdapps/data/hadoop/dfs/data</value>
</property>
</configuration>
将hadoop部署到其他节点去
428 tar zcvf hadoop-2.9.1.tar.gz hadoop-2.9.1/
431 cd tools/
434 ./deploy.sh ../hadoop-2.9.1.tar.gz /home/hadoop/bdapps slave
436 ./runRemoteCmd.sh "cd ~/bdapps/ && tar zxvf hadoop-2.9.1.tar.gz" slave
在其他每个节点上,建立软链接
# cd /usr/local && ln -s /home/hadoop/bdapps/hadoop-2.9.1 hadoop
4. 启动HDFS
4.1 在每个节点上启动zookeeper
$ ./runRemoteCmd.sh "$ZOOKEEPER_HOME/bin/zkServer.sh start" zookeeper
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
$ ./runRemoteCmd.sh "$ZOOKEEPER_HOME/bin/zkServer.sh status" zookeeper
*******************centos7-220***************************
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower
......
4.2 启动所有节点上面的journalnode进程
[hadoop@centos7-220 tools]$ ./runRemoteCmd.sh "$HADOOP_HOME/sbin/hadoop-daemon.sh start journalnode" all
*******************centos7-220***************************
starting journalnode, logging to /home/hadoop/bdapps/hadoop-2.9.1/logs/hadoop-hadoop-journalnode-centos7-220.out
......
[hadoop@centos7-220 tools]$ ./runRemoteCmd.sh "jps" all
*******************centos7-220***************************
20913 Jps
19389 JournalNode
9391 QuorumPeerMain
......
4.3 格式化hdfs
在主节点(centos7-220)上执行格式化
$ $HADOOP_HOME/bin/hdfs namenode -format
格式化高可用
$ $HADOOP_HOME/bin/hdfs zkfc -formatZK
注:这里要特别注意所有配置文件,如果有配置错误,就会失败。部署时出现了几次错误,主要是配置文件的问题,比如主机名配置错了,漏写了字母等等。
启动namenode
581 bin/hdfs namenode
在另外一个namenode主机节点上启动standby的namenode
[hadoop@centos7-221 hadoop]$ bin/hdfs namenode -bootstrapStandby
回到之前的namenode主机,
ctrl^C 关掉 581命令启动的namenode进程,然后停掉所有journalnode
582 ../tools/runRemoteCmd.sh "$HADOOP_HOME/sbin/hadoop-daemon.sh stop journalnode" all
使用start-dfs.sh命令一键启动dfs
583 sbin/start-dfs.sh
访问http://centos7-220:50070/ 以及 http://centos7-221:50070/
查看状态,必须有一个active才正确。
通过如下命令切换active namenode
[hadoop@centos7-220 hadoop-2.9.1]$ bin/hdfs haadmin -failover nameService1 nameService2
[hadoop@centos7-220 hadoop-2.9.1]$ ../tools/runRemoteCmd.sh "jps" all
*******************centos7-220***************************
12976 NameNode
13505 JournalNode
13928 DFSZKFailoverController
940 QuorumPeerMain
10238 Jps
*******************centos7-221***************************
23955 NameNode
24041 JournalNode
20059 QuorumPeerMain
24254 DFSZKFailoverController
24543 Jps
*******************centos7-222***************************
10368 DataNode
10561 Jps
7047 QuorumPeerMain
10474 JournalNode
*******************centos7-223***************************
10338 DataNode
10531 Jps
7030 QuorumPeerMain
10444 JournalNode
*******************centos7-224***************************
10370 DataNode
10562 Jps
7066 QuorumPeerMain
10476 JournalNode
[hadoop@centos7-220 hadoop-2.9.1]$
4.4 copy文件到hdfs
$ bin/hdfs dfs -ls
$ bin/hdfs dfs -mkdir -p /user/hadoop/input
$ bin/hdfs dfs -put etc/hadoop/*xml input/
小结:部署完成之后,系统重新启动
1. 关于防火墙
防火墙会导致服务端口被屏蔽,因此要随时注意防火墙。尤其是主机重启之后,命令防火墙可能重新启动生效,导致集群出现问题。最简单的办法是把防火墙彻底关闭,但不建议。(由于是实验,暂且先关闭防火墙。)
安全的做法是将需要使用的端口全部加入防火墙设置中并让其永久生效。
#firewall-cmd --permanent --add-port=9000/tcp
#firewall-cmd --reload
2. 启动zookeeper
$ ../tools/runRemoteCmd.sh "cd $ZOOKEEPER_HOME && bin/zkServer.sh start" all
$ ../tools/runRemoteCmd.sh "cd $ZOOKEEPER_HOME && bin/zkServer.sh status" all
有一个leader,和4个follower
3.一键启动dfs。
sbin/start-dfs.sh
访问http://centos7-220:50070/ 以及 http://centos7-221:50070/ 查看状态,必须有一个active才正确。
运行测试测序,与之前伪集群相同的命令,相同的结果
$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+'
$ bin/hdfs dfs -cat output/*
注:如果已经配置了yarn,mapred-site.xml配置文件已经存在,该命令会试图以yarn模式运行。因此未启动yarn的情况下会失败,可以先把mapred-site.xml文件改个名字。
4.一键shutdown dfs.
$ sbin/stop-dfs.sh
5. 关闭zookeeper
$ ../tools/runRemoteCmd.sh "cd $ZOOKEEPER_HOME && bin/zkServer.sh stop" all
- 点赞
- 收藏
- 关注作者
评论(0)