新手搭建hadoop2.x集群并群起集群,并设置节点间SSH免密登录
1.前提
首先由于hadoop至少需要3台服务器,所以我们需要准备三台虚拟机,由于每个节点(虚拟机)很多的配置文件要去配置,而且差异不大,这个时候我们需要一种同步工具,我们期望能做到在一台节点修改之后,能同步到其它节点
1.1.rsync命令
- rsync的作用:如果文件发生改变,可以同步不同的节点中,而且只同步发生了改变的部分
- rsync的语法:
rsync -rvl 本地目录 账号@hostname:目录
- 在rsync的基础上,我们实现一个xsync脚本,期望能够实现命令
xsync 要同步的文件
,即可同步到其他hadoop节点中 - 在
/home/hxl/bin
目录下新建文件xsync,并编辑如下:[basename:输出文件名,dirname:输出文件名的目录,whoami:输出当前登录用户]
# !/bin/bash
# 1获取输入参数个数,如果没有参数,直接退出
pcount=$#
if((pcount==0)); then
echo no args;
exit;
fi
#2 获取文件名称
p1=$1
fname=`basename $p1`
echo fname=$fname
#3 获取上级目录到绝对路径
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir
#4 获取当前用户名称
user=`whoami`
#5 循环
for((host=101; host<103; host++)); do
echo ------------------- hadoop$host --------------
rsync -rvl $pdir/$fname $user@hadoop$host:$pdir
done
2.集群配置【安装hadoop,并解压,我的路径在/opt/module/hadoop2.7.2/】:
2.1 集群规划
在搭建一个集群之前,我们需要确定要安排几个节点,并确定服务要放在哪些节点上;
规划如下:一共准备三台虚拟机hadoop100,hadoop101,hadoop102
需要注意的是,为了避免内存资源的问题,尽量保证:
- SecondaryNameNode和NameNode不在一个节点上
- ResourceManager和NameNode,SecondaryNameNode不在同一个节点上
hadoop100 | hadoop101 | hadoop102 | |
HDFS | NameNode DataNode | DataNode | SecondaryNameNode DataNode |
Yarn | NodeManager | ResourceManager NodeManager | NodeManager |
2.2 核心配置:【下面的配置都在hadoop100上修改,配置完毕再同步到hadoop101和hadoop102节点】
(1)配置core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop100:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.2/data/tmp</value>
</property>
</configuration>
(2)HDFS配置文件
# 配置hadoop-env.sh
[root@hadoop100 hadoop]# vim hadoop-env.sh
[export JAVA_HOME=/opt/module/jdk1.8.0_144
# 配置hdfs-site.xml
[root@hadoop100 hadoop]# vim hdfs-site.xml
# 在该文件中编写如下配置
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 指定Hadoop辅助名称节点主机配置 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop102:50090</value>
</property>
</configuration>
(3)YARN配置文件
[root@hadoop100 hadoop]# vim yarn-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
#配置yarn-site.xml
[atguigu@hadoop102 hadoop]$ vi yarn-site.xml
# 在该文件中增加如下配置
<configuration>
<!-- Site specific YARN configuration properties -->
<!-- Reducer获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop101</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
(4)MapReduce配置文件
[root@hadoop100 hadoop]# vim mapred-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
#配置mapred-site.xml
[root@hadoop100 hadoop]$ cp mapred-site.xml.template mapred-site.xml
[root@hadoop100 hadoop]$ vim mapred-site.xml
<configuration>
# 在该文件中增加如下配置
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop100:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop100:19888</value>
</property>
</configuration>
(5)在集群上分发配置好的Hadoop配置文件
[root@hadoop100 hadoop]$ xsync /opt/module/hadoop-2.7.2/
2.3 群起集群
2.3.1 配置slaves
[root@hadoop100 hadoop]# pwd
/opt/module/hadoop-2.7.2/etc/hadoop
[root@hadoop100 hadoop]# vim slaves
[root@hadoop100 hadoop]# cat slaves
localhost
hadoop100
hadoop101
hadoop102
2.3.2 xsync脚本,同步到hadoop101,102上:
[root@hadoop100 hadoop]# xsync slaves
fname=slaves
pdir=/opt/module/hadoop-2.7.2/etc/hadoop
------------------- hadoop101 --------------
sending incremental file list
slaves
sent 130 bytes received 41 bytes 114.00 bytes/sec
total size is 40 speedup is 0.23
------------------- hadoop102 --------------
sending incremental file list
slaves
sent 130 bytes received 41 bytes 342.00 bytes/sec
total size is 40 speedup is 0.23
2.3.3 启动集群,输入命令 sbin/start-dfs.sh
[root@hadoop100 hadoop-2.7.2]# sbin/start-dfs.sh
Are you sure you want to continue connecting (yes/no)? hadoop100: starting datanode, logging to /opt/module/hadoop-2.7.2/logs/hadoop-root-datanode-hadoop100.out
hadoop102: starting datanode, logging to /opt/module/hadoop-2.7.2/logs/hadoop-root-datanode-hadoop102.out
hadoop101: starting datanode, logging to /opt/module/hadoop-2.7.2/logs/hadoop-root-datanode-hadoop101.out
hadoop102: starting secondarynamenode, logging to /opt/module/hadoop-2.7.2/logs/hadoop-root-secondarynamenode-hadoop102.out
[root@hadoop100 hadoop-2.7.2]# jps
#启动成功之后,输入jps查看各个节点的进程【和一开始的集群规划是一致的】
[root@hadoop100 hadoop-2.7.2]# jps
2722 Jps
2382 NameNode
2510 DataNode
[root@hadoop101 hadoop]# jps
2259 Jps
2181 DataNode
[root@hadoop102 .ssh]# jps
1776 Jps
1698 DataNode
2.3.4 在hadoop101上起ResourceManager(必须单独在节点hadoop101上启动,然后其他节点的NodeManager也会一并启动起来),如下:
[root@hadoop101 hadoop-2.7.2]# sbin/start-yarn.sh
starting yarn daemons
starting resourcemanager, logging to /opt/module/hadoop-2.7.2/logs/yarn-hxl-resourcemanager-hadoop101.out
The authenticity of host 'localhost (127.0.0.1)' can't be established.
ECDSA key fingerprint is SHA256:wT7G3pZT6k8kQHYcLlVHlRq/OjGMxl9SysiAL84Lnuw.
ECDSA key fingerprint is MD5:5d:7c:42:aa:76:f7:96:c2:14:26:74:30:43:c8:73:b7.
Are you sure you want to continue connecting (yes/no)? hadoop102: starting nodemanager, logging to /opt/module/hadoop-2.7.2/logs/yarn-root-nodemanager-hadoop102.out
hadoop101: starting nodemanager, logging to /opt/module/hadoop-2.7.2/logs/yarn-root-nodemanager-hadoop101.out
hadoop100: starting nodemanager, logging to /opt/module/hadoop-2.7.2/logs/yarn-root-nodemanager-hadoop100.out
2.4 注意
如果需要充值namenode,必须要先删除DataNode(删除data/logs)
因为DataNode和namenode用的集群ID是一致的,如果重置了NameNode,会重新生成集群ID,如果不先删除DataNode,则两个的集群ID对应不一致,造成报错。
3. 虚拟机之间SSH无密登录{只需输入一次密码}
3.1 公钥和私钥的关系及工作原理如下:
3.2 如何生成公钥和私钥【首先需要切换到root账号】
首先在hadoop100上的/home/hxl/目录下找到.ssh目录
[hxl@hadoop100 hadoop-2.7.2]$ cd #cd 直接进入home目录
[hxl@hadoop100 ~]$ pwd
/home/hxl
[hxl@hadoop100 ~]$ ll
总用量 0
drwxrwxr-x. 2 hxl hxl 19 3月 19 14:44 bin
drwxrwxr-x. 2 hxl hxl 6 2月 25 17:27 redis
[hxl@hadoop100 ~]$ ls -al #查看所有
总用量 28
drwx------. 6 hxl hxl 160 3月 19 15:04 .
drwxr-xr-x. 3 root root 17 2月 24 17:46 ..
-rw-------. 1 hxl hxl 7455 3月 19 15:12 .bash_history
-rw-r--r--. 1 hxl hxl 18 4月 1 2020 .bash_logout
-rw-r--r--. 1 hxl hxl 193 4月 1 2020 .bash_profile
-rw-r--r--. 1 hxl hxl 231 4月 1 2020 .bashrc
drwxrwxr-x. 2 hxl hxl 19 3月 19 14:44 bin
drwxrwxr-x. 2 hxl hxl 40 3月 17 16:28 .oracle_jre_usage
drwxrwxr-x. 2 hxl hxl 6 2月 25 17:27 redis
drwx------. 2 hxl hxl 25 3月 18 17:59 .ssh
-rw-------. 1 hxl hxl 6856 3月 19 15:04 .viminfo
[hxl@hadoop100 ~]$ cd .ssh
执行命令ssh-keygen -t rsa
连续三次enter:
[hxl@hadoop100 .ssh]$ ssh-keygen -t rsa
将公钥拷贝到hadoop101的/home/hxl/.ssh/目录下,执行命令如下,第一次会要求输入’yes’和密码:
[hxl@hadoop100 .ssh]$ ssh-copy-id hadoop101
切换到hadoop102节点,查看/home/hxl/.ssh/下,会多了一个Authorized_keys文件,里面就是hadoop100的公钥
下次再输入ssh hadoop102,即可直接切换,无需再输入密码
每个节点都需要如此操作一次
[hxl@hadoop101 .ssh]$ pwd
/home/hxl/.ssh
[hxl@hadoop101 .ssh]$ ll
总用量 4
-rw-------. 1 hxl hxl 395 3月 19 17:10 authorized_keys