集群整体配置如下:
| Hadoop101 | Hadoop102 | Hadoop103 |
HDFS
| NameNode DataNode | DataNode | SecondaryNameNode DataNode |
YARN | NodeManager | ResourceManager NodeManager | NodeManager |
这里以hadoop100 hadoop101 hadoop102为例
ResourceManager NameNode SecondaryNameNode都比较废资源,所以不要配在一台电脑上
注意:NameNode和SecondaryNameNode不要安装在同一台服务器
注意:ResourceManager也很消耗内存,不要和NameNode、SecondaryNameNode配置在同一台机器上。
1.服务器配置
1>修改主机名
(1)修改主机名称
sudo vim /etc/hostname
(2)配置主机名称映射,打开/etc/hosts
sudo vim /etc/hosts
添加如下内容
192.168.1.100 hadoop100
192.168.1.101 hadoop101
192.168.1.102 hadoop102
2>在/opt目录下创建文件夹
(1)在/opt目录下创建module(放安装好的程序)、software(放安装包)文件夹
sudo mkdir module
sudo mkdir software
(2)修改module、software文件夹的所有者
sudo mkdir /opt/module /opt/software
sudo chown jlu:jlu /opt/module /opt/software
在hadoop100下进行如下操作,配置完一台环境后直接把配好的东西分发到其他机子上
2 安装JDK
- 将JDK安装包上传到Linux /opt/software目录下
- 解压JDK到/opt/module目录下
tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/module/
- 配置JDK环境变量,两种方式:
(1)新建/etc/profile.d/my_env.sh文件
sudo vim /etc/profile.d/my_env.sh
添加如下内容
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_212
export PATH=$PATH:$JAVA_HOME/bin
(2)保存退出,然后执行如下命令
source /etc/profile
- 测试JDK是否安装成功
java -version
如果能看到以下结果、则Java正常安装
java version "1.8.0_212"
注意:重启(如果java -version可以用就不用重启)
sudo reboot
3.安装Hadoop
Hadoop下载地址:https://archive.apache.org/dist/hadoop/common/hadoop-3.1.3/
- 将hadoop安装包上传到/opt/software目录下
- 解压安装文件到/opt/module下面
[jlu@hadoop101 software]$ tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module/
- 查看是否解压成功
[jlu@hadoop101 software]$ ls /opt/module/
hadoop-3.1.3
- 将Hadoop添加到环境变量
(1)获取Hadoop安装路径
[jlu@hadoop101 hadoop-3.1.3]$
pwd /opt/module/hadoop-3.1.3
(2)打开/etc/profile.d/my_env.sh文件
sudo vim /etc/profile.d/my_env.sh
将my_env.sh文件修改为:
#JAVA_HOME
JAVA_HOME=/opt/module/jdk1.8.0_212
#HADOOP_HOME
HADOOP_HOME=/opt/module/hadoop-3.1.3
PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export PATH JAVA_HOME HADOOP_HOME
(3)保存后退出
:wq
(4)让修改后的文件生效
[jlu@ hadoop101 hadoop-3.1.3]$ source /etc/profile.d/my_env.sh
- 测试是否安装成功
[jlu@hadoop101 hadoop-3.1.3]$ hadoop version
Hadoop 3.1.3
- 并重启(如果Hadoop命令不能用再重启)
[jlu@ hadoop101 hadoop-3.1.3]$ sudo reboot
4 SSH无密登录配置
1>生成公钥和私钥:
ssh-keygen -t rsa
然后敲(三个回车),就会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)
2>将公钥拷贝到要免密登录的目标机器上
ssh-copy-id hadoop102
ssh-copy-id hadoop103
ssh-copy-id hadoop104
注意:
还需要在hadoop102,had oop103上采用jlu账号配置一下无密登录到hadoop101、hadoop102、hadoop103服务器上。
如果还想实现root用户的免密登录,需要如下操作:
还需要在hadoop101上采用root账号,配置一下无密登录到hadoop102、hadoop103、hadoop101;
5 脚本
1>编写集群分发脚本xsync
(a)在/home/jlu目录下创建bin目录,并在bin目录下创建xsync文件
[jlu@hadoop101 hadoop] cd /home/atguigu
[jlu@hadoop101 ~] mkdir bin
[jlu@hadoop101 bin] touch xsync
[jlu@hadoop101 bin] vim xsync
在该文件中编写如下代码
#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 遍历集群所有机器
for host in hadoop101 hadoop102 hadoop103
do
echo ==================== $host ====================
#3. 遍历所有目录,挨个发送
for file in $@
do
#4 判断文件是否存在
if [ -e $file ]
then
#5. 获取父目录
pdir=$(cd -P $(dirname $file); pwd)
//cd -p防止软链接
#6. 获取当前文件的名称
fname=$(basename $file)
ssh $host "mkdir -p $pdir"
rsync -av $pdir/$fname $host:$pdir
//host前指定为哪个用户可以省略,所以这里没写
else
echo $file does not exists!
fi
done
done
(b)修改脚本 xsync 具有执行权限
chmod +x xsync
(d)测试脚本
sudo xsync /bin/xsync
6 集群配置
(1)核心配置文件
配置core-site.xml
cd $HADOOP_HOME/etc/hadoop
vim core-site.xml
文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!--指定NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop101:8020</value>
</property>
<!--hadoop数据的存储目录-->
<property>
<name>hadoop.data.dir</name>
<value>/opt/module/hadoop-3.1.3/data</value>
</property>
<!--兼容性配置,用于兼容后续的框架使用-->
<!--配置该jlu(superUser)允许通过代理访问的主机节点-->
<property>
<name>hadoop.proxyuser.atguigu.hosts</name>
<value>*</value>
</property>
<!--配置该jlu(superUser)允许代理的用户所属组-->
<property>
<name>hadoop.proxyuser.jlu.groups</name>
<value>*</value>
</property>
</configuration>
(2)HDFS配置文件
配置hdfs-site.xml
vim hdfs-site.xml
文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!--NameNode数据的存储目录 这个路径在core里配置过 所以直接拿来用-->
<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>
<!--2nn数据的存储目录-->
<property>
<name>dfs.namenode.checkpoint.dir</name>
<value>file://${hadoop.data.dir}/namesecondary</value>
</property>
<!-- 兼容性配置-->
<property>
<name>dfs.client.datanode-restart.timeout</name>
<value>30</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>
</configuration>
(3)YARN配置文件
配置yarn-site.xml
vim yarn-site.xml
文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- Site specific YARN configuration properties -->
<!-- Reducer获取数据的方式 指定MapReduce走shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!--指定resourceManager的地址 相当于指定Yarn所在的主机-->
<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.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>
<!--不检查虚拟内存-->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
</configuration>
(4)MapReduce配置文件
配置mapred-site.xml
vim mapred-site.xml
文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定MR运行在YARN上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop101:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop101:19888</value>
</property>
</configuration>
(5) 在hadoop101向102 103 分发配置好的环境
xsync /etc/profile.d/my_env.sh
xsync /opt/module
xsync /opt/software
7 集群启动
1>.测试集群是否搭建成功
(1)NN配置在101上,在101上格式化NN
hdfs namenode -format
(2)在hadoop101上启动NameNode
完成后执行jps命令,看到如下结果(进程号可能不同):
3461 NameNode
(3)在hadoop102、hadoop103上执行如下命令
hdfs --daemon start datanode
- 群起集群
1. 配置workers(里面存储了现在有哪些节点的名称)
vim /opt/module/hadoop-3.1.3/etc/hadoop/workers
在该文件中增加如下内容:
hadoop101
hadoop102
hadoop103
注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行。
同步所有节点配置文件
xsync workers
start-dfs.sh/stop-dfs.sh
(2)整体启动/停止YARN
start-yarn.sh/stop-yarn.sh