Hadoop3.x完全分布式集群搭建教程(二)

以下操作全部需要切换到hadoop用户

编写集群批量操作脚本

1.在/home/hadoop/bin目录下上传脚本

cd ~/bin
rz

(1)xsync
这个脚本的作用就是将指定目录的所有文件复制到其他虚拟机相同目录中
用法为:

xsync 文件路径
注意:因为要保证集群每台机器的配置都相同,所以任意一台机器有修改都需要及时使用xsync脚本分发修改后的文件给其它机器
(2)ssh
  • 有以下几个文件

ips_zk、ips_hadoop、ssh-all.sh、zk-ssh-all.sh

  • 其中ssh-all.sh、zk-ssh-all.sh实现多机操作
两个脚本的区别是前者操作hadoop集群,后者操作zookeeper集群

用法为:

ssh-all.sh 命令
  • ips:用于存放要操作的主机列表,用回车或空格隔开
  • 然后修改权限
chmod -R 777 ~/bin

2.测试脚本

xsync ~/bin
ssh-all.sh hostname
此时调用ssh脚本需要输入各虚拟机的密码(因为还没有设置免密登录其它机器)

设置免密登录

实现任意一台虚拟机都可以免密登录到其它虚拟机,即任意一台虚拟机执行 ssh hadoop10x 不需要输密码

1.生成公钥和私钥:

cd ~
ssh-keygen -t rsa
然后敲(三个回车),就会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)

2.将公钥拷贝到要免密登录的目标机器上

ssh-copy-id hadoop101
ssh-copy-id hadoop102
ssh-copy-id hadoop103
ssh-copy-id hadoop104
ssh-copy-id hadoop105

3.把整个.ssh文件夹分发到其它虚拟机

xsync ~/.ssh

修改集群的相关配置文件

1.修改Zookeeper配置文件

(1)在hadoop101上创建data目录,创建myid文件

cd /opt/module/zookeeper-3.6.2/
mkdir data
touch myid

(2)修改zoo.cfg文件

cd conf
mv zoo_sample.cfg zoo.cfg
vim zoo.cfg

找到dataDir,将其修改为

dataDir=/opt/module/zookeeper-3.6.2/data

并增加如下配置

#######################cluster##########################
server.1=hadoop101:2888:3888
server.2=hadoop102:2888:3888
server.3=hadoop103:2888:3888

(3)分发

xsync /opt/module

4.修改zookeeper集群的myid文件
讲hadoop101、hadoop102、hadoop103的myid文件内容分别修改为
123

[hadoop@hadoop101 ~]$ vim /opt/module/zookeeper-3.6.2/data/myid
[hadoop@hadoop101 data]$ ssh hadoop102
[hadoop@hadoop102 ~]$ vim /opt/module/zookeeper-3.6.2/data/myid
[hadoop@hadoop102 ~]$ ssh hadoop103
[hadoop@hadoop103 ~]$ vim /opt/module/zookeeper-3.6.2/data/myid

2.修改HDFS、YARN、MapReduce配置文件

  • 需要修改的文件有:

core-site.xml
hadoop-env.sh
workers(hadoop2.x版本里的名字为slaves)
hdfs-site.xml
yarn-site.xml
yarn-env.sh
mapred-site.xml
mapred-env.sh

以上配置文内容比较多(因为配置的是HA集群),所以就不贴出来了,都在我之前分享的网盘链接里。需要将其上传并覆盖至/opt/module/hadoop-3.1.3/etc/hadoop
  • 然后,在集群上分发配置
xsync /opt/module/hadoop-3.1.3/etc

第一次启动集群

1.Zookeeper

  • 批量启动zookeeper服务
zk-ssh-all.sh  zkServer.sh
  • 查看是否启动成功
zk-ssh-all.sh  zkServer.sh status

Hadoop3.x完全分布式集群搭建教程(二)_第1张图片

  • 初始化HA的zookeeper信息(只有第一次启动需要)
hdfs zkfc -formatZK
  • 启动zkclient,并连接zookeeper集群
zkCli.sh -server hadoop101:2181,hadoop102:2181,hadoop103:2181

image.png

2.HDFS

(1)启动NameNode

  • 同步两台NameNode的信息
#在hadoop101上启动journalnode 
hdfs --daemon start journalnode 
#在hadoop102上启动journalnode 
hdfs -‐daemon start journalnode
  • hadoop101 初始化namenode
hdfs namenode -format
  • 启动hadoop101 namenode
hdfs --daemon start namenode
  • 在hadoop102上同步第一个namenode状态(第一次启动前执行,以后不用每次都执行)
hdfs namenode -bootstrapStandby
  • 启动hadoop102 namenode
hdfs --daemon start namenode
能访问 http://hadoop101:50070/http://hadoop102:50070/则启动成功
  • 启动ZKFC(激活其中一台namenode)
hdfs --daemon start zkfc
再次访问 http://hadoop101:50070/,就会发现

Hadoop3.x完全分布式集群搭建教程(二)_第2张图片

(2)启动DataNode

  • 先批量修改${HADOOP_HOME}/etc/hadoop/tmp目录下的文件权限为751
ssh-all.sh chmod -R 751 ${HADOOP_HOME}/etc/hadoop/tmp
  • 启动所有的datanode,在标记为active的namenode节点上执行
hdfs --workers --daemon start datanode
执行成功后,点击web页面的Datanodes

Hadoop3.x完全分布式集群搭建教程(二)_第3张图片

往下滑一点,看到此画面就是启动成功

Hadoop3.x完全分布式集群搭建教程(二)_第4张图片

3.YARN

  • 在hadoop101上启动yarn
start-yarn.sh
  • 查看各节点的进程信息是否有ResourceManager和NodeManager
./ssh-all.sh jps

hadoop101 hadoop102有ResourceManager进程
hadoop103 hadoop104 hadoop105有NodeManager进程
即为启动成功

之后,如何启动和停止一个完整的集群

(1)启动

  • 启动zookeeper
zk-ssh-all_zookeeper.shzkServer.sh start 
  • 在hadoop101上启动所有
start-all.sh 

(2)停止

  • 在hadoop101上,停止所有

stop-all.sh

  • 停止zookeeper

zk-ssh-all.sh zkServer.sh stop

遇到的问题

无法启动datanode

查看hadoop103日志,建议我修改tmp文件夹权限,理由是

2020-11-19 12:07:30,375 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: Exception in secureMain
java.io.IOException: The path component: '/opt/module/hadoop-3.1.3/tmp' in 'opt/module/hadoop-3.1.3/tmp/dn_socket9866' has permissions 0777 uid 1000 and gid 1000. It is not protected because it is world-writable. This might help: 'chmod o-w /opt/module/hadoop-3.1.3/tmp'. For more information: https://wiki.apache.org/hadoop/SocketPathSecurity
    at org.apache.hadoop.net.unix.DomainSocket.validateSocketPathSecurity0(Native Method)

简单来说,就是给的权限太大了,不安全,所以就让我修改权限

ssh-all.sh chmod g-w /opt/module/hadoop-3.1.3/tmp

修改完之后,

No such file or directory when trying to bind to 'opt/module/hadoop-3.1.3/tmp/dn_socket9866'

又告诉我,没有dn_socket9866文件夹,可是这些文件夹应该能自动创建吧,没事,我自己建一个(在datanode机器上创建)

mkdir  /opt/module/hadoop-3.1.3/tmp/dn_socket9866

结果还是相同的报错,等等!!!我发现了问题,opt前面没有斜杠,我去!!!搞半天是我的配置文件出错了,这也太蠢了
image.png

打开hdfs-site.xml文件,修改一波,修改完再分发一波,然后把刚才创建的文件夹删除

ssh-all.sh rm -rf /opt/module/hadoop-3.1.3/tmp/dn_socket9866

Hadoop3.x完全分布式集群搭建教程(二)_第5张图片

再次启动datanode,5555,成功了

总结:看日志真的很有用

如果hdfs崩了怎么办

  • 删除以下文件夹
ssh-all.sh rm -rf /opt/module/hadoop-3.1.3/tmp/*
ssh-all.sh rm -rf /opt/module/hadoop-3.1.3/logs/*
  • 或者配置完hadoop的时候,拍个快照

这是最简单的解决方案

你可能感兴趣的