需要准备好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

其他错误

检查防火墙是不是没有关闭

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)