Hadoop完全分布式集群搭建

发布时间 2023-04-06 15:13:49作者: 来个煎饼

0 准备工作

首先需要准备三台虚拟机,这里准备的是hadoop1,hadoop1,hadoop3,虚拟机机要求如下:

  1. 配置了静态IP。
  2. 关闭了防火墙的。

虚拟机下载安装:https://www.cnblogs.com/lgjb/p/17292698.html

1 配置ssh免密登录

配置ssh免密登录是为了将配置好的应用或文件直接分发到其他节点,不然 一台一台的配置太慢了。

2.1 在每台主机上生成公钥和私钥

在所有节点上运行如下命令,运行完成后会在用户家目录下的.ssh目录下生成id_rsa(私钥文件)和id_rsa.pub(公钥文件)

ssh-keygen
ssh-copy-id 节点1ip
ssh-copy-id 节点2ip
ssh-copy-id 节点3ip
  • 分发完成后,被分发的节点会在用户家目录下的.ssh目录下生成authorized_keys文件,此文件负责保存得到的公钥,再有其他节点分发给它公钥,公钥会被追加到此文件中。

  • 此外hadoop1下还会生产known_hosts文件,该文件在在用户家目录下的.ssh目录下,A通过ssh首次连接到B,B会将公钥1(host key)传递给A,A将公钥1存入known_hosts文件中,以后A再连接B时,B依然会传递给A一个公钥2,OpenSSH会核对公钥,通过对比公钥1与公钥2 是否相同来进行简单的验证,如果公钥不同,OpenSSH会发出警告, 避免你受到DNS Hijack之类的攻击。

2.2 scp(secure copy,安全拷贝)

介绍:scp命令是依赖于ssh协议的远程拷贝技术,便于将文件从一个节点拷贝到另一个节点

scp [选项] [用户@主机:]文件/目录 [用户@主机:]文件/目录

选项:
-r #递归拷贝,用于拷贝目录

2.3 rsync(remote sync,远程同步)
rsync和scp区别:rsync只对差异文件做同步,scp是把所有文件都复制过去。

rsync [选项] [用户@主机:]文件/目录 [用户@主机:]文件/目录

选项:
-a  #可以递归同步(可以同步元信息,比如修改时间、权限等)
-v  #显示复制过程

2.4. xsync集群分发脚本

为了方便将修改的文件分发给其他节点,建一个脚本文件。

vim /bin/xsync.sh
#!/bin/bash
# 判断参数个数
if [ $# -lt 1 ]
then
  echo Not Enough Arguement!
  exit;
fi

# 遍历要分发的节点
for host in hadoop2 hadoop3
do
  echo ====================  $host  ====================
  # 遍历所有输入的文件/目录
  for file in $@
  do
    # 判断文件是否存在
    if [ -e $file ]
    then
      # 获取父目录
      pdir=$(cd -P $(dirname $file); pwd)
      # 获取当前文件的名称
      fname=$(basename $file)
      ssh $host "mkdir -p $pdir"
      rsync -av $pdir/$fname $host:$pdir
    else
      echo $file does not exists!
    fi
  done
done
# 要给脚本执行权限
chmod +x xsync.sh

2 配置IP-主机名映射

vim /etc/hosts #编辑hosts文件

image

3 下载安装JAVA

3.1 检查当前系统中是否已安装JDK

# 查看Java版本
java -version
# 检测系统JDK默认安装包
rpm -aq | grep java

3.2、卸载OpenJDK,若未检测出jdk则跳过

yum remove *openjdk*

3.3 安装JDK

  1. 选择到jdk官网上下载你想要的jdk版本。
  2. 用xftp将jdk安装包上传到opt目录下
  3. 解压JDK文件。
tar -zxvf jdk-8u341-linux-x64.tar.gz
# 重命名解压后的目录
mv jdk1.8.0_341 jdk

3.4 配置环境变量

vim /etc/profile
# JAVA环境变量 
export JAVA_HOME=/opt/jdk
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
# 重新载入配置文件
source /etc/profile

3.5 检查新安装的JDK

java -version

3.6 将Java和配置文件分发给其他节点

scp -r /opt/jdk root@hadoop2:/opt/
scp -r /opt/jdk root@hadoop3:/opt/
xsync.sh /etc/profile 
# 在被分发的机器上也要重新加载配置文件
source /etc/profile

4 下载安装Hadoop

4.1 选择需要的版本下载

建议:最好下载hadoop-3.2.1.tar.gz这种命名格式的包

Hadoop下载链接:https://archive.apache.org/dist/hadoop/common/

image

4.2 将下载的tar.gz包并自行用xftp上传至linux系统

image

4.3 在linux系统下解压tar.gz包

tar -zxvf hadoop-3.2.3.tar.gz -C /opt/

# 如果感到包名太长,可以修改
mv /opt/hadoop-3.2.3 /opt/hadoop

4.4 配置Hadoop环境变量并分发给其他节

vim /etc/profile

# Hadoop环境变量
export HADOOP_HOME=/opt/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
# 使配置文件生效
source /etc/profile

将配置文件分发给其他节点

xsync.sh /etc/profile 
# 在被分发的机器上也要重新加载配置文件
source /etc/profile

4.5 配置Hadoop环境脚本文件中的JAVA_HOME参数

# 进入Hadoop安装目录下的etc/hadoop目录
cd /opt/hadoop/etc/hadoop

# 分别在hadoop-env.sh文件中修改如下参数:
export JAVA_HOME=/opt/jdk #路径为jdk安装路径
# 验证Hadoop配置是否生效
hadoop version

5 修改Hadoop配置文件

配置文件在/opt/hadoop/etc/hadoop目录下。

5.1 core-site.xml (配置Common组件属性)

<configuration>
    <!-- 配置Hadoop的默认文件系统为hdfs 9820为hdfs内部通信端口-->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop1:9820</value>
    </property>
    
    <!-- 配置保存临时文件目录 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/tmp/hadoop</value>
    </property>
</configuration>

更多配置信息,请参考core-site.xml

5.2 hdfs-site.xml (配置HDFS组件属性)

<configuration>
    <!-- 配置NameNode所在主机和其web端口 -->
    <property>
        <name>dfs.namenode.http-address</name>
        <value>hadoop1:9870</value>
    </property>
    
    <!-- 配置Secondary NameNode所在主机和其web端口 -->
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>hadoop2:9868</value>
    </property>
</configuration>

更多参数配置,请参考hdfs-site.xml

5.3 mapred-site.xml (配置Map-Reduce组件属性)

<configuration>
    <!-- 设置MapReduce的运行平台为yarn -->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

更多配置信息,请参考mapred-site.xml

5.4 yarn-site.xml(配置资源调度属性)

<!-- 配置yarn-site.xml -->
<configuration>
    <!-- 配置yarn的ResourceManager所在节点 -->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>hadoop3</value>
    </property>

    <!-- 配置NodeManager启动时加载Shuffle服务 -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    
	<!-- 这里的value值要配置你自己机器使用hadoop classpath命令得到的值 -->
    <property>
        <name>yarn.application.classpath</name>
        <value>/opt/hadoop/etc/hadoop:/opt/hadoop/share/hadoop/common/lib/*:/opt/hadoop/share/hadoop/common/*:/opt/hadoop/share/hadoop/hdfs:/opt/hadoop/share/hadoop/hdfs/lib/*:/opt/hadoop/share/hadoop/hdfs/*:/opt/hadoop/share/hadoop/mapreduce/lib/*:/opt/hadoop/share/hadoop/mapreduce/*:/opt/hadoop/share/hadoop/yarn:/opt/hadoop/share/hadoop/yarn/lib/*:/opt/hadoop/share/hadoop/yarn/*</value>
    </property>
</configuration>

更多配置信息,请参考yarn-site.xml

5.5 修改workers文件

vim /opt/hadoop/etc/hadoop/workers

# 删除原有的localhost增加从节点地址(若配置了hosts,可直接使用主机名,亦可用IP地址)
hadoop1
hadoop2
hadoop3

6 将Hadoop分发到其他集群

6.1 将配置文件/etc/profile分发到其他节点,并重新加载加载

scp -r /etc/profile root@hadoop2:/etc/profile
[root@hadoop2 service]# source /etc/profile

scp -r /etc/profile root@hadoop3:/etc/profile
[root@hadoop3 service]# source /etc/profile

6.2 将Hadoop文件夹分发的其他节点

scp -r /opt/hadoop root@hadoop2:/opt/
scp -r /opt/hadoop root@hadoop3:/opt/

7 启动集群

7.1 初次启动集群前需对NameNode进行格式化处理

hdfs namenode -format

7.2 还需要配置启动脚本,添加HDFS和Yarn权限,脚本在Hadoop安装目录的sbin目录下

vim start-dfs.sh 
vim stop-dfs.sh 

#添加HDFS权限,在第二行空白位置添加HDFS权限
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
HDFS_DATANODE_USER=root
HDFS_DATANODE_SECURE_USER=hdfs
vim start-yarn.sh 
vim stop-yarn.sh 

#添加Yarn权限,在第二行空白位置添加Yarn权限
YARN_RESOURCEMANAGER_USER=root
HDFS_DATANODE_SECURE_USER=yarn
YARN_NODEMANAGER_USER=root

7.3 将启停脚本分发到其他节点

xsync.sh start-dfs.sh 
xsync.sh stop-dfs.sh
xsync.sh start-yarn.sh 
xsync.sh stop-yarn.sh

7.4 启动/关闭HDFS和YARN

注意:可以用命令启动,但是NomeNode只有在其所在节点启动才会开启;ResourceManage也只有在其所在节点启动才会开启。

# 在hadoop1上运行
start-dfs.sh
# 在hadoop3上运行
start-yarn.sh

stop-dfs.sh
stop-yarn.sh

为了方便启动,编写启停脚本:

# 将脚本放置于bin目录下用户可以全局使用
vim /bin/start-hadoop.sh

#!/bin/bash
echo ==================== 启动hadoop集群 ====================
echo -------------------- 启动hdfs --------------------
ssh hadoop1 /opt/hadoop/sbin/start-dfs.sh
echo -------------------- 启动yarn --------------------
ssh hadoop3 /opt/hadoop/sbin/start-yarn.sh
# 将脚本放置于bin目录下用户可以全局使用
vim /bin/stop-hadoop.sh

#!/bin/bash
echo ==================== 关闭hadoop集群 ====================
echo -------------------- 关闭hdfs --------------------
ssh hadoop1 /opt/hadoop/sbin/stop-dfs.sh
echo -------------------- 关闭yarn --------------------
ssh hadoop3 /opt/hadoop/sbin/stop-yarn.sh
# 还要给脚本执行权限
chmod +x /bin/start-hadoop.sh
chmod +x /bin/stop-hadoop.sh

7.5 查看集群启动情况

可以在每个节点上使用jps命令查看

[root@hadoop1 ~]# jps
[root@hadoop2 ~]# jps
[root@hadoop3~]# jps

也可以编写脚本一次性查看

vim /bin/jps-hadoop.sh

#!/bin/bash
for host in hadoop1 hadoop2 hadoop3
do
	echo ==================== $host ====================
	ssh $host $JAVA_HOME/bin/jps
done
chmod +x /bin/jps-hadoop.sh

8 Web访问

注意:需要访问的机器上配置了IP-主机名的映射

访问NameNode:

http://hadoop1:9870/

访问Secondary NameNode:

http://hadoop2:9868/

访问YARN:

http://hadoop3:8088/