大数据平台安装部署系列——【3】Hadoop集群搭建

举报
A21100 发表于 2019/02/11 15:52:22 2019/02/11
【摘要】 搭建Hadoop集群,步骤较多,同时需要具备一定的Linux/Unix操作系统的使用技能。但只要能按步骤进行,细心仔细的进行操作,应该都能部署成功。

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


centos7-220

centos7-221

centos7-222

centos7-223

centos7-224

NameNode




DataNode



ResouceManager




JournalNode

Zookeeper







软件目录:/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才正确。

spacer.gif

通过如下命令切换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




【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。