新手搭建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 公钥和私钥的关系及工作原理如下:

xshell连接Hadoop如何操作 xshell启动hadoop_xml

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