一、环境配置
准备三台虚拟机。
因为集群是有多台服务器组成的,当设计到配置的更改,要求集群的配置是同步的,所以需要在每台机器上都做相同的更改。当集群的服务器很多时,重复性的工作做起来没有意义且非常麻烦,因此,需要集群分发脚本。
1.1 scp 安全拷贝
scp可以实现服务器与服务器之间的数据拷贝,基本语法如下:
命令 递归 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
[root@xiaolei module]# scp -r /etc/profile.d/my_env.sh root@hadoop104:/etc/profile.d/
1.2 XSync 集群分发脚本
rsync和scp的区别:用rsync做文件的复制要比scp的速度更快,rsync只对差异文件做更新。scp是将所有文件都复制过去。基本语法:
rsync -av $pdir/$fname $user@hadoop$host:$pdir/$fname
命令 选参数 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
选项参数说明 :
-a:归档拷贝
-v:显示复制过程
用xsync来命名分发脚本:
注意问题,在etc/profile的文件中添加路径:/home/lei/bin 如下,然后把脚本写在这里就可以实现全局访问了。
export PATH=$PATH:/home/lei/bin
然后在/home/lei 目录下建立bin目录,在下面创建xsync文件:
[lei@xiaolei module]# cd /home/leilei
[lei@xiaolei leilei]# ls
[lei@xiaolei leilei]# mkdir bin
[lei@xiaolei leilei]# touch xsync
[lei@xiaolei leilei]# vim xsync
脚本内容:
#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 遍历集群所有机器
for host in hadoop102 hadoop103
do
echo ==================== $host ====================
#3. 遍历所有目录,挨个发送
for file in $@
do
#4 判断文件是否存在
if [ -e $file ]
then
#5. 获取父目录
pdir=$(cd -P $(dirname $file); pwd)
#6. 获取当前文件的名称
fname=$(basename $file)
ssh $host "mkdir -p $pdir"
rsync -av $pdir/$fname $host:$pdir
else
echo $file does not exists!
fi
done
done
测试:脚本可以使用。
[root@xiaolei bin]# xsync /home/leilei/bin/xsync
==================== hadoop101 ====================
root@hadoop101's password:
root@hadoop101's password:
sending incremental file list
xsync
sent 693 bytes received 35 bytes 208.00 bytes/sec
total size is 602 speedup is 0.83
二、分布式集群搭建
2.1 集群规划
三台机器:hadoop101、hadoop102、hadoop103。
使用的用户为:lei 。该用户拥有root用户的权限。
资源分配:
nameNode、Resourcemanager、SecondarynameNode 相对来讲需要的资源更多,因此,把这个分布到不同的机器。
DataNode是负责数据存储的,因为三台机器都有存储资源,因此三台都要有DataNode。Nodemanager是负责资源管理的,因为三台机器都有计算资源,因此三台都要有nodeManager。
hadoop101: NameNode DataNode Nodemanager
hadoop102: Resourcemanager DataNode Nodemanager
hadoop103: SecondarynameNode DataNode Nodemanager
2.2 集群搭建
1、删除每个节点中hadoop安装目录下的data和logs目录,这是之前留下的记录。
2、配置etc/hadoop/hadoop-env.sh 的javahome
3、配置core-site:定义一个路径变量
<!-- 指定NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop101:9820</value>
</property>
<!-- 指定hadoop数据的存储目录
官方配置文件中的配置项是hadoop.tmp.dir ,用来指定hadoop数据的存储目录,此次配置用的hadoop.data.dir是自己定义的变量, 因为在hdfs-site.xml中会使用此配置的值来具体指定namenode 和 datanode存储数据的目录
配置的一个简洁变量
-->
<property>
<name>hadoop.data.dir</name>
<value>/opt/module/hadoop-3.1.3/data</value>
</property>
4、配置hdfs-site
手动指定存储位置
<!-- 指定HDFS副本的数量 -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<!-- 指定NameNode数据的存储目录 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>file://${hadoop.data.dir}/name</value>
</property>
<!-- 指定Datanode数据的存储目录 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>file://${hadoop.data.dir}/data</value>
</property>
<!-- 指定SecondaryNameNode数据的存储目录 -->
<property>
<name>dfs.namenode.checkpoint.dir</name>
<value>file://${hadoop.data.dir}/namesecondary</value>
</property>
<!-- 兼容配置,先跳过 -->
<property>
<name>dfs.client.datanode-restart.timeout</name>
<value>30s</value>
</property>
<!-- nn web端访问地址-->
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop101:9870</value>
</property>
<!-- 2nn web端访问地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop103:9868</value>
</property>
5、配置yarn-site
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定ResourceManager的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop102</value>
</property>
<!-- 环境变量的继承 -->
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
<!--取消虚拟内存的限制 -->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
6、配置mapreduce mapred-site
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
// 下面这个不需要配置
<property>
<name>mapreduce.application.classpath</name>
<value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value>
</property>
7、同步配置
xsync /opt/module/hadoop3.1.3
2.3 集群单点启动
1、如果集群是第一次启动,需要格式化nameNode
hdfs namenode -format
2、启动hdfs
在hadoop101上启动nameNode
hdfs --daemon start namenode
在hadoop101、hadoop102 、hadoop103 上启动datanode
hdfs --daemon start datanode
在Hadoop103 启动secondarynamenode
hdfs --daemon start secondarynamenode
http://hadoop103:9868/status.html
http://hadoop101:9870/dfshealth.html
3、启动yarn
在hadoop102启动resourcemanager
yarn --daemon start resourcemanager
在hadoop101、102、103 启动nodemanager
yarn --daemon start nodemanager
4、集群测试
a、在hdfs上创建一个 /user/lei/input 目录
[root@xiaolei hadoop-3.1.3]# hdfs dfs -mkdir -p /user/leilei/input
b、把本地文件上传到创建的目录中:
[root@xiaolei hadoop-3.1.3]# hdfs dfs -put wcinput/wc.input /user/leilei/input
c、如何在hdfs查看具体存储,hadoop的默认副本就是三个。如果配置一个的话,它存放的位置是随机的。hdfs文件管理系统。
d、测试yarn
[lei@hadoop103 hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /user/lei/input /user/lei/output
e、问题
如果出现这种问题,有两种解决方法,第一种是直接修改配置文件,将hdfs添加配置如下:
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
但这种不建议在生产环境使用。
第二种就是添加目录权限:
[lei@hadoop101 hadoop-3.1.3]$ bin/hdfs dfs -chmod -R 777 /
2.4 ssh免密登录
1、存在的问题:
集群的启动和关闭,现在都是通过单点启动和关闭的方式操作的,如果集群的机器很多,怎么办?
2、解决问题的想法
希望把集群启动和关闭的事情写成一个脚本
脚本的大概思路:
登录到hadoop101 启动关闭Namenode。
登录到hadoop102 启动关闭2nn。
登录到hadoop101 、hadoop102 、hadoop103 启动关闭datanode
登录到hadoop102 启动关闭resourcemanager
登录到hadoop101,hadoop102,hadoop103 启动关闭namenode
3、如何登录到远程机器
通过ssh ip/主机名
[root@xiaolei hadoop-3.1.3]# ssh hadoop101
root@hadoop101's password:
Last login: Wed Aug 26 10:41:51 2020
[root@hadoop101 ~]# exit
登出
Connection to hadoop101 closed.
4、解决ssh登录到远程机器需要输入密码问题
通过公私钥进行免密登录。实现的效果:hadoop101、hadoop102、hadoop103。
[lei@hadoop101 /]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/lei/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/lei/.ssh/id_rsa.
Your public key has been saved in /home/lei/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:73UcABIdwg3Vvosv8YTfiZbwnjf+p8kubOPcwZk/ST0 lei@hadoop101
The key's randomart image is:
+---[RSA 2048]----+
| .=*+o |
| .oo.. |
| .. |
| .. |
| S . .. .|
| .+ oo E.|
| .X.=O.o|
| .oo&==*.|
| .B**B+=|
+----[SHA256]-----+
[lei@hadoop101 /]$
授权对其他机器免密:
ssh-copy-id hadoop101
ssh-copy-id hadoop102
ssh-copy-id hadoop103
同理,其他机器也做类似的操作即可完成互相免密登录。
2.5 群起集群
1、需要用到的脚本
在sbin目录下
在namenode所在节点启动
start-dfs.sh
stop-dfs.sh
在resourcemanager所在节点启动
start-yarn.sh
stop-yarn.sh
2、hadoop如何知道在那些机器启动对应的namenode、secondnamenode、datanode、Nodemanager和resourcemanager
我们在配置文件名已经指定过namenode、secondnamenode、resourcemanager。
还剩的dn和nm 需要通过worker文件来告知启动。 hadoop3 需要通过workers文件配置在哪些节点启动datanode和Nodemanager。
vim /opt/module/hadoop-3.1.3/etc/hadoop/workers
添加ip地址,分发到每个节点。
hadoop101
hadoop102
hadoop103
3、启动集群
1)、启动HDFS:在namenode所在的节点运行启动关闭程序。
start-dfs.sh stop-dfs.sh
2)、启动关闭yarn:在resourcemanager所在的节点运行start-yarn.sh
start-yarn.sh stop-yarn.sh
4、管理脚本
进入/home/lei/bin 创建脚本,实现集群的群起 和群停,脚本名:mycluster.sh
#!/bin/bash
if [ $# -lt 1 ]
then
echo Not Enough Arguement
exit;
fi
case $1 in
"start")
echo "========Start Hdfs============"
ssh hadoop101 /opt/sofeware/hadoop-3.1.3/sbin/start-dfs.sh
echo "========start yarn==========="
ssh hadoop102 /opt/sofeware/hadoop-3.1.3/sbin/start-yarn.sh
;;
"stop")
echo "========stop yarn============"
ssh hadoop102 /opt/sofeware/hadoop-3.1.3/sbin/stop-yarn.sh
echo "========stop hdfs==========="
ssh hadoop101 /opt/sofeware/hadoop-3.1.3/sbin/stop-dfs.sh
;;
*)
echo "Input args error"
;;
esac
创建脚本myjps.sh 实现查看每台节点jps的脚本:不用切换其他目录下。
#!/bin/bash
for i in hadoop101 hadoop102 hadoop103
do
echo "===== $i jps======"
ssh $i /opt/sofeware/java8/bin/jps
done
赋值权限后,查看该目录,现在有三个脚本了:
[lei@hadoop101 bin]$ ll
总用量 12
-rwxrwxrwx 1 lei lei 581 3月 17 21:25 mycluster.sh
-rwxrwxrwx 1 lei lei 126 3月 17 21:27 myjps.sh
-rwxrwxrwx. 1 lei lei 613 3月 15 21:23 xsync
群起测试:
[lei@hadoop101 hadoop]$ mycluster.sh start
========Start Hdfs============
Starting namenodes on [hadoop101]
Starting datanodes
Starting secondary namenodes [hadoop103]
========start yarn===========
Starting resourcemanager
Starting nodemanagers
[lei@hadoop101 hadoop]$ myjps.sh
===== hadoop101 jps======
41730 NodeManager
42325 Jps
40696 NameNode
40911 DataNode
===== hadoop102 jps======
30074 Jps
29099 ResourceManager
29326 NodeManager
28383 DataNode
===== hadoop103 jps======
23360 NodeManager
22962 SecondaryNameNode
22547 DataNode
24025 Jps
2.6 配置历史服务器
为了查看程序的历史运行情况,需要配置下历史服务器,具体的配置如下:
1)配置mapred-site.xml
在该文件里面增加如下配置:
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop101:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop101:19888</value>
</property>
2)分发配置
xsync $HADOOP_HOME/etc/hadoop/mapred-site.xml
3)启动关闭历史服务器
mapred --daemon start historyserver
mapred --daemon stop historyserver
4)查看jobhistory
http://hadoop101:19888/jobhistory
2.7 配置日志的聚集功能
日志聚集概念:应用运行完成以后,将程序的日志信息上次到HDFS系统上。
聚集功能的好处:可以方便的查看程序运行详情,方便开发调试。
注意:开启日志聚集功能,需要重新启动NodeManager、ResourceManager、HistoryManager。
1、配置yarn-site.xml
//启用日志聚集
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop101:19888/jobhistory/logs</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
2、分发配置
xsync $HADOOP_HOME/etc/hadoop/yarn-site.xml
3、重新启动集群
可以看到历史服务器在起着作用:
2.8 集群时间同步
时间同步有两种方式:
1、通过网络进行时钟同步(必须保证虚拟机能连上外网)
三台机器都安装ntpdate
yum -y install ntpdate
阿里云时钟同步服务器
sudo ntpdate ntp4.aliyun.com
三台机器定时任务
crontab -e
添加下面内容:
*/1 * * * * /usr/sbin/ntpdate ntp4.aliyun.com;
2、找一个机器作为时间服务器,所有的机器与这台机器时间进行定时的同步。(暂不讲解这种)