需要准备好3台虚拟机,关于怎么创建虚拟机这里不做介绍。
Linux 前置配置(三台)
为linux配置静态 ip
# 查看虚拟机的 ip 地址,或者查看vmware的对应的网卡网段
# 因为我需要在其他机器访问,所以我使用的桥接网络
# 为了避免和 dhcp 冲突,尽量分配靠后,为我的3台虚拟分配静态 ip
bigdata01 192.168.0.171
bigdata02 192.168.0.172
bigdata03 192.168.0.173
vi /etc/sysconfig/network-scripts/ifcfg-ens33
# dhcp 修改为静态
BOOTPROTO="static"
# 末尾添加
IPADDR=192.168.0.171
GATEWAY=192.168.0.1
DNS1=192.168.0.1
# 重启网卡
service network restart
修改 hostname
# 临时修改(临时修改一下,不用重启了)
hostname bigdata01
# 永久
vi /etc/hostname
关闭防火墙
# 临时
systemctl stop firewalld
systemctl status firewalld
# 永久
systemctl disable firewalld
ssh 免密登录
# 生成密钥
ssh-keygen -t rsa
# 公钥拷贝到需要登陆的机器
# 免密登陆自己
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
# 测试免密登录自己
ssh bigdata01
添加 hosts
vi /etc/hosts
192.168.0.171 bigdata01
192.168.0.172 bigdata02
192.168.0.173 bigdata03
JDK
# jdk-8u361-linux-x64.tar.gz
tar -zxvf jdk-8u361-linux-x64.tar.gz
# 重命名目录
mv jdk1.8.0_361 jdk1.8
# 把 jdk 同步到其他两台机器
scp -r /data/soft/jdk1.8 bigdata02:/data/soft/
scp -r /data/soft/jdk1.8 bigdata03:/data/soft/
# 添加环境变量
vi /etc/profile
# G 跳到末尾
export JAVA_HOME=/data/soft/jdk1.8
export PATH=.:$JAVA_HOME/bin:$PATH
source /etc/profile
java -version
服务器时间同步
yum install -y ntpdate
# 同步时间
ntpdate -u ntp.sjtu.edu.cn
# cron 定时执行
vi /etc/crontab
* * * * * root /usr/sbin/ntpdate -u ntp.sjtu.edu.cn
如果出现错误 "Could not resolve host: mirrorlist.centos.org; 未知的错误"
# mirrorlist.centos.org 不再提供服务,更换 vault.centos.org
sed -i s/mirror.centos.org/vault.centos.org/g /etc/yum.repos.d/*.repo
sed -i s/^#.*baseurl=http/baseurl=http/g /etc/yum.repos.d/*.repo
sed -i s/^mirrorlist=http/#mirrorlist=http/g /etc/yum.repos.d/*.repo
master 免密登录其他机器
# master 节点免密登陆其他节点
# 先把密钥拷贝到目标机器
scp ~/.ssh/authorized_keys bigdata02:~/
scp ~/.ssh/authorized_keys bigdata03:~/
# bigdata2 中 append ssh 公钥
cat ~/authorized_keys >> ~/.ssh/authorized_keys
# bigdata3 中 append ssh 公钥
cat ~/authorized_keys >> ~/.ssh/authorized_keys
# 测试
ssh bigdata02
ssh bigdata03
Hadoop 集群
下载地址
master 节点
# 解压 hadoop
tar -zxvf hadoop-3.2.0.tar.gz
cd hadoop-3.2.0/etc/hadoop/
hadoop-env.sh
vi hadoop-env.sh
# 添加 JAVA_HOME
export JAVA_HOME=/data/soft/jdk1.8
# 指定 hadoop log path
export HADOOP_LOG_DIR=/data/hadoop_repo/logs/hadoop
core-site.xml
vi core-site.xml
# 注意修改对应自己的 hostname
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://bigdata01:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/data/hadoop_repo</value>
</property>
</configuration>
hdfs-site.xml
vi hdfs-site.xml
# 注意修改 hostname
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>bigdata01:50090</value>
</property>
</configuration>
mapred-site.xml
vi mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
yarn-site.xml
vi yarn-site.xml
# 指定 resource manager 在 bigdata01
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</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.resourcemanager.hostname</name>
<value>bigdata01</value>
</property>
</configuration>
其他配置项目
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>32768</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>512</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-vcores</name>
<value>1</value>
</property>
worker
vi workers
bigdata02
bigdata03
脚本
脚本写入环境变量,是为了解决执行脚本时出现错误
cd /data/soft/hadoop-3.2.0/sbin/
# 在脚本的上方空行处,写入下边的环境变量
vi start-dfs.sh
HDFS_DATANODE_USER=root
HDFS_DATANODE_SECURE_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
vi stop-dfs.sh
HDFS_DATANODE_USER=root
HDFS_DATANODE_SECURE_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
vi start-yarn.sh
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root
vi stop-yarn.sh
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root
同步到其他节点
scp -rq /data/soft/hadoop-3.2.0 bigdata02:/data/soft/
scp -rq /data/soft/hadoop-3.2.0 bigdata03:/data/soft/
master 格式化
bin/hdfs namenode -format
# 看到如下一行表示成功
2023-06-07 11:17:43,937 INFO common.Storage: Storage directory /data/hadoop_repo/dfs/name has been successfully formatted.
启动集群
sbin/start-all.sh
# master jps
16952 NameNode
17786 Jps
17167 SecondaryNameNode
17455 ResourceManager
# other jps
16209 NodeManager
16101 DataNode
16311 Jps
HDFS webui界面:http://192.168.0.171:9870
YARN webui界面:http://192.168.0.171:8088
hadoop 环境变量
vi /etc/profile
export JAVA_HOME=/data/soft/jdk1.8
export HADOOP_HOME=/data/soft/hadoop-3.2.0
export PATH=.:$JAVA_HOME/bin:$HADOOP_HOME/bin:$PATH
export HADOOP_CLASSPATH=`${HADOOP_HOME}/bin/hadoop classpath`
source /etc/profile
hdfs dfs -ls /
hadoop classpath
停止集群
sbin/stop-all.sh
本地客户端
# 把 hadoop master 下载到本地
# 可执行权限
chmod -R +x hadoop-3.2.0
cd hadoop-3.2.0/etc
vi hadoop-env.sh
# 修改 JAVA_HOME 和 HADOOP_LOG_DIR
hdfs dfs -put README.txt /
hdfs dfs -ls /
可能出现的错误
Permission denied: user=xxx, access=WRITE, inode="/user":root:supergroup:drwxr-xr-x
# 可以指定用户
HADOOP_USER_NAME=root hdfs dfs -put README.txt /
# 或者添加环境变量
HADOOP_USER_NAME=root
其他错误
ack with firstBadLink as 192.168.0.173:9866
检查防火墙是不是没有关闭
2024-07-15 16:32:58,727 INFO hdfs.DataStreamer: Exception in createBlockOutputStream blk_1073741829_1005
java.io.IOException: Got error, status=ERROR, status message , ack with firstBadLink as 192.168.0.173:9866
at org.apache.hadoop.hdfs.protocol.datatransfer.DataTransferProtoUtil.checkBlockOpStatus(DataTransferProtoUtil.java:134)
at org.apache.hadoop.hdfs.protocol.datatransfer.DataTransferProtoUtil.checkBlockOpStatus(DataTransferProtoUtil.java:110)
at org.apache.hadoop.hdfs.DataStreamer.createBlockOutputStream(DataStreamer.java:1778)
at org.apache.hadoop.hdfs.DataStreamer.nextBlockOutputStream(DataStreamer.java:1679)
at org.apache.hadoop.hdfs.DataStreamer.run(DataStreamer.java:716)