HDFS完全分布式搭建
搭建前环境准备
Hadoop集群节点规划
ip | CPU | 内存 | 硬盘 | 角色 | 主机名 |
---|---|---|---|---|---|
192.168.91.11 | 2C | 2G | 40GB | Namenode | node01 |
192.168.91.12 | 2C | 2G | 40GB | SecondaryNameNode、DataNode | node02 |
192.168.91.13 | 2C | 2G | 40GB | DataNode | node03 |
192.168.91.14 | 2C | 2G | 40GB | DataNode | node04 |
# 所有节点
# hosts 配置
cat >> /etc/hosts << "EOF"
192.168.91.11 node01
192.168.91.12 node02
192.168.91.13 node03
192.168.91.14 node04
EOF
# JDK安装
wget https://builds.openlogic.com/downloadJDK/openlogic-openjdk/8u392-b08/openlogic-openjdk-8u392-b08-linux-x64.tar.gz
tar xf openlogic-openjdk-8u392-b08-linux-x64.tar.gz
mv openlogic-openjdk-8u392-b08-linux-x64 /usr/local/jdk8
rm -f openlogic-openjdk-8u392-b08-linux-x64.tar.gz
echo 'export JAVA_HOME=/usr/local/jdk8' >> /etc/profile
echo 'export PATH=$PATH:${JAVA_HOME}/bin' >> /etc/profile
source /etc/profile
# 关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
# 关闭selinux
sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0
systemctl enable ntpdate && systemctl start ntpdate
# 时间同步配置,最小化安装系统需要安装ntpdate软件
yum -y install ntpdate
echo "0 */1 * * * ntpdate time1.aliyun.com" >> /var/spool/cron/root
systemctl enable ntpdate && systemctl start ntpdate
免密钥设置
Hadoop集群可以通过start-dfs.sh和stop-dfs.sh脚本启停集群,执行启停脚本的节点需要能够ssh免密登录到其它节点执行脚本或命令,一般都是在NameNode节点启停集群,因此需要配置NameNode节点到其它节点的免密
# node01
# 生成免密公钥和私钥
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
# 将公钥发送到所有节点包括node01(node01需要远程登录自己),目标节点接收公钥的用户与当前节点当前用户一样时可以省略用户
# 按照提示输入密码即可
# ssh-copy-id root@node01
ssh-copy-id node01
ssh-copy-id node02
ssh-copy-id node03
ssh-copy-id node04
# ssh-copy-id 实际就上将 ~/.ssh/id_rsa.pub 文件追加到 ~/.ssh/authorized_keys 文件中,但是最好不要手动添加 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys 因为这样创建的authorized_keys文件权限标识与ssh-copy-id创建的可能会不同从而导致不能免密登录
Hadoop集群搭建
没有特别说明,下面都是在node01节点操作
# node01
wget https://dlcdn.apache.org/hadoop/common/hadoop-3.2.4/hadoop-3.2.4.tar.gz
tar xf hadoop-3.2.4.tar.gz
chown -R root:root hadoop-3.2.4
mv hadoop-3.2.4 /usr/local/hadoop-3.2.4
echo 'export HADOOP_HOME=/usr/local/hadoop-3.2.4' >> /etc/profile
echo 'export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin' >> /etc/profile
source /etc/profile
配置hadoop-env.sh
由于通过SSH远程启动进程的时候默认不会加载/etc/profile(SSH除了远程登陆还可以远程执行),JAVA_HOME变量就加载不到,而Hadoop启动需要读取到JAVA_HOME信息,所有这里需要手动指定
sed -i 's%# export JAVA_HOME=%export JAVA_HOME=/usr/local/jdk8%' $HADOOP_HOME/etc/hadoop/hadoop-env.sh
配置workers指定datanode的位置
cat > $HADOOP_HOME/etc/hadoop/workers << "EOF"
node02
node03
node04
EOF
配置hdfs-site.xml
$HADOOP_HOME/etc/hadoop/hdfs-site.xml 文件内容如下
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定secondary namenode在哪里启动,也即secondary namenode的访问地址 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>node02:50090</value>
</property>
<!-- 配置副本数量 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
</configuration>
配置core-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在哪里启动,也即namenode的访问地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://node01:9000</value>
</property>
<!-- 指定hadoop的数据目录位置 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/var/hadooptmp/full</value>
</property>
</configuration>
配置start-dfs.sh和stop-dfs.sh
这两个文件在 $HADOOP_HOME/sbin 目录中,在这两个文件上面添加下面的内容
HDFS_DATANODE_USER=root
HDFS_DATANODE_SECURE_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
发送安装包到其他节点
# node01
cd /usr/local
tar -zcvf hadoop-3.2.4-config.tar.gz hadoop-3.2.4/
for i in 2 3 4; do scp hadoop-3.2.4-config.tar.gz node0$i:/usr/local; done
# node02-node04 节点
cd /usr/local
tar xf hadoop-3.2.4-config.tar.gz
rm -f hadoop-3.2.4-config.tar.gz
echo 'export HADOOP_HOME=/usr/local/hadoop-3.2.4' >> /etc/profile
echo 'export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin' >> /etc/profile
source /etc/profile
格式化并启动集群
# node01
# 格式化,会在namenode节点初始化一个空的fsimage
hdfs namenode -format
ll /var/hadooptmp/full/dfs/name/current/
total 16
-rw-r--r-- 1 root root 399 Jan 15 10:47 fsimage_0000000000000000000
-rw-r--r-- 1 root root 62 Jan 15 10:47 fsimage_0000000000000000000.md5
-rw-r--r-- 1 root root 2 Jan 15 10:47 seen_txid
-rw-r--r-- 1 root root 217 Jan 15 10:47 VERSION
# 查看集群VERSION信息
cat /var/hadooptmp/full/dfs/name/current/VERSION
#Mon Jan 15 10:47:48 CST 2024
namespaceID=414451219
clusterID=CID-fd11059d-23d4-4e4f-99dd-2fd5f37a9537
cTime=1705286868287
storageType=NAME_NODE
blockpoolID=BP-2091421317-192.168.91.11-1705286868287
layoutVersion=-65
# 启动集群
# 第一次启动,datanode和secondary角色会初始化创建自己的数据目录
start-dfs.sh
# 启动后namenode会创建EditLog,且EditLog的id(在文件名中)在FSimage的后边
ll /var/hadooptmp/full/dfs/name/current/
total 1044
-rw-r--r-- 1 root root 42 Jan 15 10:56 edits_0000000000000000001-0000000000000000002
-rw-r--r-- 1 root root 1048576 Jan 15 10:56 edits_inprogress_0000000000000000003
-rw-r--r-- 1 root root 399 Jan 15 10:47 fsimage_0000000000000000000
-rw-r--r-- 1 root root 62 Jan 15 10:47 fsimage_0000000000000000000.md5
-rw-r--r-- 1 root root 2 Jan 15 10:56 seen_txid
-rw-r--r-- 1 root root 217 Jan 15 10:47 VERSION
# SNN只需要从NN拷贝最后时点的FSimage和增量的Editlog
ssh node02 "ls -l /var/hadooptmp/full/dfs/namesecondary/current/"
total 24
-rw-r--r-- 1 root root 42 Jan 15 10:56 edits_0000000000000000001-0000000000000000002
-rw-r--r-- 1 root root 399 Jan 15 10:56 fsimage_0000000000000000000
-rw-r--r-- 1 root root 62 Jan 15 10:56 fsimage_0000000000000000000.md5
-rw-r--r-- 1 root root 399 Jan 15 10:56 fsimage_0000000000000000002
-rw-r--r-- 1 root root 62 Jan 15 10:56 fsimage_0000000000000000002.md5
-rw-r--r-- 1 root root 217 Jan 15 10:56 VERSION
# 停止集群
stop-dfs.sh
至此,Hadoop完全分布式搭建完成,可以浏览器访问HDFSwebui界面,通过此界面方便查看和操作HDFS集群。WebUI访问地址如下,在Hadoop2.x版本中,访问的WEBUI端口为50070,Hadoop3.x 访问WebUi端口是9870
# 上传文件测试
# 创建文件夹
hdfs dfs -mkdir -p /mydata
# 创建用户默认目录
hdfs dfs -mkdir -p /user/`whoami`
# 上传文件,如果不指定目标目录,默认会上传到/user/root目录(root是当前用户),默认目录也需要创建
hdfs dfs -put /usr/local/hadoop-3.2.4-config.tar.gz /mydata
# 查看文件
hdfs dfs -ls /mydata
-rw-r--r-- 3 root supergroup 492316786 2023-12-01 11:07 /mydata/hadoop-3.2.4-config.tar.gz
# 删除文件
hdfs dfs -rm /mydata/hadoop-3.2.4-config.tar.gz
# 上传文本文件,查看分割情况
for i in `seq 100000`;do echo "hello hadoop $i" >> data.txt;done
# 上传文件,并设置块大小为1M
hdfs dfs -D dfs.blocksize=1048576 -put data.txt
# node02
# 根据实际情况切换目录
cd /var/hadooptmp/full/dfs/data/current/BP-2091421317-192.168.91.11-1705286868287/current/finalized/subdir0/subdir0
# 可以看出data.txt被分割成两个块了
ll -h
total 1.9M
-rw-r--r-- 1 root root 1.0M Jan 15 11:20 blk_1073741833
-rw-r--r-- 1 root root 8.1K Jan 15 11:20 blk_1073741833_1009.meta
-rw-r--r-- 1 root root 821K Jan 15 11:20 blk_1073741834
-rw-r--r-- 1 root root 6.5K Jan 15 11:20 blk_1073741834_1010.meta
# 可以看出块是按照固定字节大小分割的,可能会导致单词被分开了,这没有关系,在处理数据时会按照指定的分隔条件将块的结尾给拼起来
tail -5 blk_1073741833
hello hadoop 55769
hello hadoop 55770
hello hadoop 55771
hello hadoop 55772
hello hadoop 5