环境准备
设置hostname
hostnamectl set-hostname hadoop-xx
设置hosts
-
将自己配置到其他主机中
# 关于<与< <的特殊用法,详见结尾参考 ssh root@<other_server_ip> "cat >> /etc/hosts" < <(paste <(ip addr | grep ens33|grep inet|awk '{print $2}'|cut -d "/" -f1) <(hostname))
-
把自己也设置到自己的hosts中(非必要)
# 关于<与< <的特殊用法,详见结尾参考 cat >> /etc/hosts < <(paste <(ip addr | grep ens33|grep inet|awk '{print $2}'|cut -d "/" -f1) <(hostname))
设置防火墙端口
# namenode
firewall-cmd --add-port=9870/tcp --zone=public --permanent
firewall-cmd --add-port=9000/tcp --zone=public --permanent
# resourcemanager
firewall-cmd --add-port=8088/tcp --zone=public --permanent
firewall-cmd --add-port=8030/tcp --zone=public --permanent
firewall-cmd --add-port=8031/tcp --zone=public --permanent
firewall-cmd --add-port=8032/tcp --zone=public --permanent
firewall-cmd --add-port=8033/tcp --zone=public --permanent
设置Ali云安全组
端口同防火墙略
创建用户hadoop
# 创建用户hadoop
adduser hadoop
# 设置密码
passwd hadoop
切换用户到hadoop
# 切换用户
su hadoop
# 进入用户目录
cd
准备访问公钥
ssh-keygen -t rsa -C 'hello hadoop!'
cat ~/.ssh/<key_name>.pub >> ~/.ssh/authorized_keys
同步公钥
ssh hadoop@<other_server_ip> "cat >> ~/.ssh/authorized_keys" < ~/.ssh/id_rsa.pub
编辑ssh权限
chmod 700 .ssh/
chmod 600 .ssh/*
测试连通性
-
服务器1
ssh hadoop@<other_server_ip>
两个服务器均可以直接登录对方,则代表ssh部分配置成功
Java准备
下载AdoptOpenJDK与解压
# 下载
wget https://mirrors.tuna.tsinghua.edu.cn/AdoptOpenJDK/11/jdk/x64/linux/OpenJDK11U-jdk_x64_linux_hotspot_11.0.10_9.tar.gz
# 解压
tar -zxf OpenJDK11U-jdk_x64_linux_hotspot_11.0.10_9.tar.gz
# 配置环境变量
cat << EOF >> .bashrc
export JAVA_HOME=/home/hadoop/jdk-11.0.10+9
export PATH=$PATH:$JAVA_HOME/bin
EOF
# 刷新
source .bashrc
同步其他服务
# 下载
scp OpenJDK11U-jdk_x64_linux_hotspot_11.0.10_9.tar.gz hadoop@<server_ip>:/home/hadoopOpenJDK11U-jdk_x64_linux_hotspot_11.0.10_9.tar.gz
# 解压
ssh hadoop@<server_ip> "tar -zxf OpenJDK11U-jdk_x64_linux_hotspot_11.0.10_9.tar.gz"
# 配置环境变量
ssh hadoop@<server_ip> "cat << EOF >> .bashrc
export JAVA_HOME=/home/hadoop/jdk-11.0.10+9
export PATH=\$PATH:\$JAVA_HOME/bin
EOF
"
验证
# 验证
java -version
这里基于局域网操作,主要有两个好处
- 我这里使用的是阿里ECS服务,同一内网传输速度可达100MB/s
- 减少镜像服务器压力~
Hadoop准备
下载与解压Hadoop-基于清华镜像
# 下载
wget https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-3.3.0/hadoop-3.3.0.tar.gz
# 解压
tar -zxf hadoop-3.3.0.tar.gz
# 配置环境变量
cat << EOF >> .bashrc
export HADOOP_HOME=/home/hadoop/hadoop-3.3.0
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
EOF
同步其他服务
# 传输
scp hadoop-3.3.0.tar.gz hadoop@<other_server_ip>:/home/hadoop
# 解压
ssh hadoop@<other_server_ip> "tar -zxf hadoop-3.3.0.tar.gz"
# 配置环境变量
ssh hadoop@<other_server_ip> "cat << EOF >> .bashrc
export HADOOP_HOME=/home/hadoop/hadoop-3.3.0
export PATH=\$PATH:\$HADOOP_HOME/bin:\$HADOOP_HOME/sbin
EOF
"
同Java准备
Hadoop配置
这里只进行简单的配置,使用VSCode和Remote插件,直接进行远程编辑.下面贴出具体配置(暂时略)
各文件配置
暂时略过,需要合并几个服务上的文件
启动所有节点
启动namenode
-
登陆hadoop@<server_01_ip>并执行下列命令
# 格式化namenode hdfs namenode -format hdfs --daemon start namenode # 启动namenode
-
访问 <server_01_ip>:9870
现在就能直接看到hadoop的web页面了
启动datanode
-
登陆hadoop@<server_02_ip>并执行下列命令
hdfs --daemon start datanode
-
访问 <server_01_ip>:9870
可以在Datanodes页面中看到刚刚启动的server_02_datanode
启动resourcemanager
-
登陆hadoop@<server_01_ip>并执行下列命令
yarn --daemon start resourcemanager
-
访问 <server_01_ip>:8088
现在就能直接看到resourcemanager的web页面了
启动nodemanager
-
登陆hadoop@<server_02_ip>并执行下列命令
yarn --daemon start nodemanager
-
访问 <server_01_ip>:8088
可以在Nodes中看到刚刚启动的server_02_nodemanager了
运行一个程序
登陆hadoop@<server_01_ip>并执行下列命令
# 创建用户文件夹
hadoop fs -mkdir /user
hadoop fs -mkdir /user/hadoop
# 创建存放测试文件的文件夹
hadoop fs -mkdir input_01
# 将测试文件上传到hadoop中
hadoop fs -put test.txt
部分坑
Ali云特有
- 使用
hadoop jar
提交任务时,命令行长时间没有反应.同时resourcemanager日志可以观察到大量的未知host报错.原因: resourcemanager无法通过主机名访问nodemanager.
解决方案: 在Ali云ECS控制台中直接修改主机名
备注: 目前暂时不知道为什么会出现这个现象,即使使用命令设置hostname.在hadoop中的datanode的hostname依然是一串随机字符串,而这个字符串就是Ali云ECS控制台中显示的的主机名.我目前也没有能够直接在linux中获取到这个错误的主机名.且尚不知hadoop是如何获取的
其他
- 执行应用时,两台datanode所属ECS完全卡死.无法登陆,无法操作.Ali云控制台也无法重启
原因: 提交应用后,两个nodemanager分别创建了6个容器,导致ECS资源完全耗尽
解决方案: 设置yarn.nodemanager.resource.cpu-vcores
与yarn.nodemanager.resource.memory-mb
为ECS实际规格,并重新运行nodemanager即可