hadoop3手动搭建保姆级教程

一、前言

本篇文章是hadoop3的搭建教程,从零开始的全手动搭建,包括其中遇到过的所有坑及解决方案,面向全新小白。本文当时操作部署是用的hadoop3.3.3,一般实际的项目推荐是用hadoop3.1.3,这是由于各种的兼容性问题,但部署上是基本没有区别的。

二、服务器准备

1、阿里云ECS购买

阿里云服务器4台,2核4G,centos7系统。2核2G理论上也能部署,但是再往上部署其他服务估计够呛。如果只是做搭建练习的话,3台机器也足够了。买腾讯云CVM也可以,其他厂商就不多说,自行斟酌。
预算紧张的朋友可以买按量付费的,一个小时大概几块钱,不用的时候可以停机不销毁,停机时候大概一个小时几毛钱。新人可以白嫖阿里云的免费使用一个月。学习的话,以性价比为主。

2、服务器预设置

每个机器新建普通用户Patrick,并升级到root权限。后面所有的部署都会使用这个用户,各位自行命名。

useradd Patrick
passwd Patrick

升级root权限方法有几个,我使用的是以下方式:
修改/etc/sudoers 文件,找到

root    ALL=(ALL)       ALL

新增一行

root    ALL=(ALL)       ALL
Patrick ALL=(ALL)       NOPASSWD:ALL

保存设置即可,这样这个用户使用sudo命令可以不需要输入密码。

3、内网IP和账号映射配置

准备功夫做完后,我们挑其中一台机器作为namenode,姑且命名为master,其他机器作为datanode,姑且命名为worder01、worder02、worder03。
这些命名通过修改 /etc/hosts实现。

sudo vim /etc/hosts

然后在hosts文件里添加内网IP映射,大家可以根据自己实际的内网情况去修改。一定注意是内网IP。

172.19.181.1 master
172.22.88.214 worker01
172.19.181.0 worker02
172.19.180.255 worker03

三、安装JDK8和hadoop3

1、下载及解压

可以用xshell6把文件传到一个服务器上进行解压安装,或者通过curl访问官网链接下载。
如果是用curl的,官方下载链接如下:
jdk: https://www.oracle.com/java/technologies/downloads/
hadoop: https://hadoop.apache.org/releases.html
也可以用国内镜像
jdk: https://repo.huaweicloud.com/java/jdk/8u151-b12/
hadoop: https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/

注意:一定要下载JDK8,因为hadoop不兼容JDK8以上的版本。
这是官网的解释

顺便科普一下,Java8、JDK8、JDK1.8 这3个都是指一样的东西,只是叫法不一样,这个跟JAVA的发展史有关,有兴趣的朋友可以自行百度。下载安装包的命名一般是JDK-8开头的。

我是下载好了安装包,然后通过xshell上传文件到服务器里的。
这里把xshell上传的功能安装好,通过rz命令上传。

sudo yum install lrzsz -y
sudo rz

解压命令

tar -zxvf jdk-8u341-linux-x64.tar.gz -C /opt/module

2、修改环境变量

jdk和hadoop都安装好之后,比如安装路径是:
/usr/java/jdk1.8.0_171
/usr/hadoop-3.3.3
在/etc/profile里添加以下配置信息,根据自己实际情况修改。

export JAVA_HOME=/usr/java/jdk1.8.0_171
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export HADOOP_HOME="/usr/hadoop-2.7.4"
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

环境变量都配好后,应该可以看到版本号,即为成功。

java -version
hadoop version

我们每个服务器都需要安装jdk和hadoop,但如果每台机器都用同样的步骤,会比较繁琐,我们可以使用服务器分发。
要实现服务器分发,首先得设置SSH免密登录,我们来到下一步。

三、配置SSH免密登录

1、设置首次公钥不检查

这一步是什么意思?
如果不优先设置首次公钥不检查的话,当你配置好SSH免密登陆后,首次登陆还是需要输入密码,然后你开始怀疑是不是自己的SSH免密没有设置好,从此怀疑人生。

目的:在配置大量的节点之间需要ssh连通的时候,如果自动复制很多节点,都需要输入yes,两两节点之间都要互通一次,这样会造成很大的麻烦
设置方法:
修改配置文件/etc/ssh/ssh_config

找  到  # StrictHostKeyChecking ask
修改为:StrictHostKeyChecking no

2、SSH免密配置

注意,这一步不能用root账号,用普通用户,之后所有hadoop集群的操作都是使用普通用户,这个就是为什么要服务器准备时,我们要设置普通用户。

2.1 namenode生成公私钥

秘钥生成在这个位置,公钥和私钥生成在普通用户默认的路径~/.ssh
这里特意提一下普通用户生成的公私钥路径是在~/.ssh,而不是在root/.ssh
网上有很多几年前的攻略都是说在/root/.ssh,这是因为他们在虚拟机上配置,不是在真机,然后这些做教程卖课的都是用root账号做的视频。这也是网上攻略的一个坑,但他们也不会细说。

使用以下命令生成公私钥

ssh-keygen -t rsa

执行完,在~/.ssh目录下能看到以下3个文件。

2.2 把所有服务器的公钥都放在各个服务器的authorized_keys 里

首先,我们要搞明白一点,我们的最终目的,是要把所有的节点的私钥都放在各自节点的authorized_keys中。
先在namenode把自己的私钥放进 authorized_keys 中。
shell cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
登陆每台datanode服务器,通过ssh-copy-id把公钥分发给namenode,即我的master。注意,这一步是每一台datanode都执行。

ssh-copy-id master

这时候master的authorized_keys已经收集了所有datanode的公钥,即此时master的authorized_keys是最完整的了,然后把master的authorized_keys分发给每个datanode节点。
在master节点执行下面命令

scp ~/.ssh/authorized_keys worker01:~/.ssh/
scp ~/.ssh/authorized_keys worker02:~/.ssh/
scp ~/.ssh/authorized_keys worker03:~/.ssh/

又或者在各个子节点执行下面命令

scp master:~/.ssh/authorized_keys ~/.ssh/

如果你遇到权限问题,出现类似Operation not permitted的报错的话,修改目的路径的文件归属就可以了。本文的机器权限都是Patrick:Patrick。

最终效果就是每个节点的authorized_keys都有4个私钥

2.3 修改authorized_keys的权限等级

chmod 755 ~
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

这样各个节点的机器,免密登录配置已经做好了。
我们可以试一下,通过用scp把整个目录复制到各个datanode。
在每个datanode执行

sudo scp -r Patrick@master:/opt/module/java/jdk-18.0.2.1 ./

同时,配置文件/etc/profile也复制到每个datanode,配置步骤能省一步就省一步。

scp /etc/profile root@worker01:/etc
scp /etc/profile root@worker02:/etc
scp /etc/profile root@worker03:/etc

最后,配置文件复制过去后,记得顺便source一下。

这里还要提一点,我的etc/profile权限是root,原配置文件的权限我不太想改,怕出问题。所以scp命令只能复制到datanode的root账号下。

注意尽量保证JDK和hadoop的路径和master是一样,方便以后配置修改。

四、配置hadoop集群

1、几个原则

NameNode 和 SecondaryNameNode不安装在一台服务器。
ResourceManager也不和上面2个装在一起。
因为这3个太耗内存

2、编辑配置文件

一共要配置4个xml文件,分别是
core-site.xml
hdfs-site.xml
yarn-site.xml
mapred-site.xml
配置文件一般是在$HADOOP_HOME/etc/hadoop下面,可以自己找一找。

配置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://master:8020</value>
</property>
<!-- 指定 hadoop 数据的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop/hadoop-3.2.4/data</value>
</property>
<!-- 配置 HDFS 网页登录使用的静态用户为 root -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>Patrick</value>
</property>
</configuration>

配置hdfs-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- nn web 端访问地址-->
<property>
<name>dfs.namenode.http-address</name>
<value>master:9870</value>
</property>
<!-- 2nn web 端访问地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>worker02:9868</value>
</property>
</configuration>

配置yarn-site.xml

配置这个之前,首先要先获取一下自己的classpath。
通过执行这个命令获取

hadoop classpath

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定 MR 走 shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>

<!-- 指定 ResourceManager 的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>worker01</value>
</property>

<!-- 环境变量的继承 -->
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CO
NF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAP
RED_HOME</value>
</property>

<property>
<name>yarn.application.classpath</name>
<value>/opt/module/hadoop/hadoop-3.2.4/etc/hadoop:/opt/module/hadoop/hadoop-3.2.4/share/hadoop/common/lib/*:/opt/module/hadoop/hadoop-3.2.4/share/hadoop/common/*:/opt/module/hadoop/hadoop-3.2.4/share/hadoop/hdfs:/opt/module/hadoop/hadoop-3.2.4/share/hadoop/hdfs/lib/*:/opt/module/hadoop/hadoop-3.2.4/share/hadoop/hdfs/*:/opt/module/hadoop/hadoop-3.2.4/share/hadoop/mapreduce/lib/*:/opt/module/hadoop/hadoop-3.2.4/share/hadoop/mapreduce/*:/opt/module/hadoop/hadoop-3.2.4/share/hadoop/yarn:/opt/module/hadoop/hadoop-3.2.4/share/hadoop/yarn/lib/*:/opt/module/hadoop/hadoop-3.2.4/share/hadoop/yarn/*
</value>
</property>

<!-- 开启日志聚集功能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>

<!-- 设置日志聚集服务器地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://master:19888/jobhistory/logs</value>
</property>

<!-- 设置日志保留时间为 7 天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
<!-- yarn的webUI-->
<property>
 <name>yarn.resourcemanager.webapp.address</name>
 <value>worker01:8088</value>
</property>
</configuration>

配置mapred-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定 MapReduce 程序运行在 Yarn 上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>worker01:10020</value>
</property>
<!-- 历史服务器 web 端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>worker01:19888</value>
</property>

<property>
  <name>yarn.app.mapreduce.am.env</name>
  <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
  <name>mapreduce.map.env</name>
  <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
  <name>mapreduce.reduce.env</name>
  <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>

</configuration>

上面4个配置文件,根据自己实际的内网IP映射,填写映射名字。我的是master,worker01~03,根据自己实际情况修改。

配置workers

其实还有第5个文件需要配置,找到文件$HADOOP_HOME/etc/hadoop/workers
输入以下信息

master
worker01
worker02
worker03

配置这个文件,一定要注意了。命名前后一定不要有空格,通过换行符换到下一行。否则命名就会带空格。

以上4个配置文件(其实是5个),要在每一个节点都如法炮制。当然,我们程序员不可能做重复累赘的工作。我们可以通过脚本进行文件分发,把配置好的文件分发给所有的节点。因此,我们来到下一步。

3、编写xsync脚本

我们除了要在namenode要配置,同样还要在所有datanode配置一次,纯手动会相当麻烦,所以需要进行脚本分发。
要实现xsync首先一定要先实现SSH免密登陆,这个我们在上面步骤已经配置好了。
xsync分发脚本的原理是用linux的rsync命令,这是linux的数据镜像备份工具,Remote Sync
xsync脚本放在/home/bin下面就行了。

#!/bin/bash
if [ $# -lt 1 ]
then
echo Not Enough Argument!
exit;
fi
#2. 遍历集群所有机器
for host in worker{01..03}
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 exits!
            fi
    done
done

脚本的第8行,遍历集群机器,大家根据自己的机器命名修改即可。
脚本建好后,记得修改权限。

sudo chmod 777 xsync

这里介绍一个小坑:xsync脚本建好后,测试发现报错command not found。

这是因为我的xsync是放在个人的bin下,需要配置环境变量。一般有4个解决方案,我用的是第三种。

4、用xsync脚本把5个配置文件分发给所有datanode节点

分发之前,要注意修改好目录权限,比如:

sudo chown -R Patrick:Patrick /opt/module/hadoop/

然后就愉快的分发


分发完成!(注意不要忘记workers文件也要分发)

总结一下,4个xml配置文件实现的配置情况如下:(hive可以暂时无视,本文没有提及,第4个节点worker03可有可无)

五、启动集群

1、首次启动hadoop

首次启动集群,记住是历史以来第一次启动需要,先格式化namenode。这一步格式化做了一次,以后不用再做了。进入到hadoop安装目录中

hdfs namenode -format

启动hadoop集群,启动命令在sbin目录下的start-dfs.sh

这里有个小坑,如果报错java_home is not set
检查 $HADOOP_HOME/etc/hadoop/hadoop-env.sh
添加 JAVA_HOME

启动成功

查看report,看到集群的节点情况。

hdfs dfsadmin -report

通过web页面查看hadoop情况

我们在上面的hdfs-site.xml中配置里master端口9870为web端访问地址。(前几年的教程多数是50070)

另外这里有个坑,web要用外网IP:9870,但用了外网地址也出现访问不到的情况。百度有些攻略说什么把hdfs-site.xml里面的web端地址改为0.0.0.0。但我试过不对,可能做攻略的人都是用虚拟机。

我用是阿里云ECS,把主节点的 9870端口添加到安全组就可以了。
在阿里云的账号后台菜单找到安全组:

端口添加后就可以通过WEB端访问了。但实际生产环境是不会开放外网端口,这是出于安全的考虑。 这里只是做个测试练习而已,这一点也需要强调一下。

2、启动yarn

启动yarn,我的yarn配置在worker01,需要切到worker01去启动。

./sbin/start-yarn.sh

这里出现一个坑,yarn启动命令执行后无任何反应。这是因为:
hadoop 3.3需要额外修改配置文件,不然启动无法完成类的初始化,无法启动,找到这个文件
hadoop-3.3.3/etc/hadoop/yarn-env.sh
末尾增加:

export YARN_RESOURCEMANAGER_OPTS="--add-opens java.base/java.lang=ALL-UNNAMED"
export YARN_NODEMANAGER_OPTS="--add-opens java.base/java.lang=ALL-UNNAMED"

启动yarn成功后,在所有节点可以看到nodemanager的进程,以及在worker01可以看到ResourceManager的进程
然后回到master可以查询yarn的各节点情况
在sbin目录下,运行 yarn node -list

同样在阿里云实例,worker01的服务器开放8088端口后,可以在web端查看yarn的情况。(注意8088端口一般也是不对外开放的,做完测试记住关掉)

3、运行example

运行自带的example,计算pi的值,测试mapreduce。

./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.3.jar pi 5 10

如果你是hadoop3.1.4,则修上面命令examples后面的参数即可。

如果example运行不成功,请重新再检查上面的xml配置文件有没有问题。
如果example运行成功,那么恭喜你,整个hadoop集群的基础配置,你已经完成了。下面的内容是可选内容。

4、启动历史服务器

要提前在mapred-site.xml配置好历史服务器,在跑下面这条命令

mapred --daemon start historyserver

启动后,可以看到master节点有JobHistoryServer进程。

web端访问历史服务器 http://master:19888/jobhistory

5、配置日志聚集功能

因为跑yarn任务,各个节点的日志会分布在各自的目录中,出bug了不好追查日志,因此需要把各datanode的日志集中到一个服务器中查看。
在yarn-site.xml增加如下代码:

<!-- 开启日志聚集功能 -->
<property>
    <name>yarn.log-aggregation-enable</name>
    <value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property>
    <name>yarn.log.server.url</name>
    <value>http://master:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间为 7 天 -->
<property>
    <name>yarn.log-aggregation.retain-seconds</name>
    <value>604800</value>
</property>

保存后要xsync分发到各个节点。
分发完成,需要重启历史服务器和yarn

mapred --daemon stop historyserver
mapred --daemon start historyserver

这样配置了日志聚集之后,可以从web页面的logs查看:

如果日志聚集配置失败,点击logs会显示如下:

6、hadoop集群启动脚本

由于集群启动,首先要在master启动start-dfs.sh,然后去到worker01启动start-yarn.sh,还有历史服务器等。这时候可以设置一个shell脚本方面启动。脚本代码参考:


#!/bin/bash

if [ $# -lt 1 ]
then
    echo "No Args Input..."
    exit ;
fi

case $1 in
"start")
        echo " =================== 启动 hadoop集群 ==================="

        echo " --------------- 启动 hdfs ---------------"
        ssh master  "/opt/module/hadoop-3.1.3/sbin/start-dfs.sh"
        echo " --------------- 启动 yarn ---------------"
        ssh worker01 "/opt/module/hadoop-3.1.3/sbin/start-yarn.sh"
        echo " --------------- 启动 historyserver ---------------"
        ssh master "/opt/module/hadoop-3.1.3/bin/mapred --daemon start historyserver"
        echo " ----------------启动 hiveserver2 -----------------"
        ssh worker03 "/opt/module/hive-3.1.2/bin/hiveserver2 > /dev/null 2>&1 &"
;;
"stop")
        echo " =================== 关闭 hadoop集群 ==================="

        echo " --------------- 关闭 historyserver ---------------"
        ssh master "/opt/module/hadoop-3.1.3/bin/mapred --daemon stop historyserver"
        echo " --------------- 关闭 yarn ---------------"
        ssh worker01 "/opt/module/hadoop-3.1.3/sbin/stop-yarn.sh"
        echo " --------------- 关闭 hdfs ---------------"
        ssh master "/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh"
;;
*)
    echo "Input Args Error..."
;;
esac

六、运行一个wordcount

在hdfs上建1个文件夹作为文本输入

hadoop fs -mkdir /test_input

在master里建一个测试txt,并put到hdfs的input文件夹里

hadoop fs -put wordcount_test.txt /test_input

可以通过 hadoop fs -ls /test_input 查看已上传的txt,
也可以通过9870端口查看

运行wordcount

./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.4.jar wordcount /test_input /test_output

运行成功

查看结果

web端的结果,part-r-00000就是执行结果。

用cat打开partxxx那个文件查看运行结果

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇