近期有一个项目客户要求文件存储必须采用分布式存储,开发调研后建议使用HDFS,这里把搭建方法简单描述一下。

1、安装环境

  • 三台Linux主机(Centos 7.x)

    master:192.168.18.61

    slavae1:192.168.18.62

    slavae2:192.168.18.63

    请修改三台Server主机名分别为:master、slave1、slave2

  • hadoop 3.2安装包

    下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-3.2.0/hadoop-3.2.0.tar.gz

  • JDK安装包

    链接:https://pan.baidu.com/s/1Dit-y-tj_AE-9WrR0dU3hg 提取码:s97v 

注:默认下载目录及操作目录均在/opt下


2、基础环境配置

  • 修改host

ssh到master服务器执行:

cat <<-ENDHOST >> /etc/hosts
192.168.18.61 master
192.168.18.62 slave1
192.168.18.63 slave2
ENDHOST
  • 生成ssh key(用于各服务节点免密登陆)

ssh-keygen -t rsa

执行上述命令出现提示后连续三次回车,完成ssh key生成操作。

添加刚生成的ssh公钥钥到密钥文件中:

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

拷贝ssh公钥以两台slave节点:

#执行下述命令时需要输入对应服务器的root密码。

ssh-copy-id -i ~/.ssh/id_rsa.pub slave1
ssh-copy-id -i ~/.ssh/id_rsa.pub slave2

#为两个slave节点添加host信息:

ssh slave1 > /dev/null 2>&1 << addhost
cat <<-ENDHOST >> /etc/hosts
192.168.18.61 master
192.168.18.62 slave1
192.168.18.63 slave2
ENDHOST
exit
addhost

ssh slave2 > /dev/null 2>&1 << addhost
cat <<-ENDHOST >> /etc/hosts
192.168.18.61 master
192.168.18.62 slave1
192.168.18.63 slave2
ENDHOST
exit
addhost


3、配置JDK环境

#请从上面提供的网盘地址下载jdk压缩包到/opt目录;你也可以直接从oracle官网下载,但注意解压后的目录名,然后适当修改下述命令。

cd /opt
tar zxf jdk.tar.gz
ln -snf /opt/jdk1.8.0_171 /opt/java
  • 添加JDK环境变量(顺带也直接把Hadoop的也加了)

cat <<-'ENDJDK' > /etc/profile.d/java.sh 
JAVA_HOME=/opt/java
JRE_HOME=/opt/java/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:/opt/hadoop-3.2.0/bin:/opt/hadoop-3.2.0/sbin
export JAVA_HOME JRE_HOME CLASS_PATH PATH
ENDJDK
chmod +x /etc/profile.d/java.sh
source /etc/profile
  • 为两台Slave节点配置JDK环境:

scp /opt/jdk.tar.gz slave1:/opt
scp /opt/jdk.tar.gz slave2:/opt
ssh slave1 > /dev/null 2>&1 << addjdk
cd /opt
tar zxf jdk.tar.gz
ln -snf /opt/jdk1.8.0_171 /opt/java
cat <<-'ENDJDK' > /etc/profile.d/java.sh 
JAVA_HOME=/opt/java
JRE_HOME=/opt/java/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:/opt/hadoop-3.2.0/bin:/opt/hadoop-3.2.0/sbin
export JAVA_HOME JRE_HOME CLASS_PATH PATH
ENDJDK
chmod +x /etc/profile.d/java.sh
source /etc/profile
exit
addjdk

ssh slave2 > /dev/null 2>&1 << addjdk
cd /opt
tar zxf jdk.tar.gz
ln -snf /opt/jdk1.8.0_171 /opt/java
cat <<-'ENDJDK' > /etc/profile.d/java.sh 
JAVA_HOME=/opt/java
JRE_HOME=/opt/java/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:/opt/hadoop-3.2.0/bin:/opt/hadoop-3.2.0/sbin
export JAVA_HOME JRE_HOME CLASS_PATH PATH
ENDJDK
chmod +x /etc/profile.d/java.sh
source /etc/profile
exit
addjdk


4、安装配置Hadoop HDFS

mkdir -p /data/files
cd /opt
wget https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-3.2.0/hadoop-3.2.0.tar.gz
tar zxf hadoop-3.2.0.tar.gz
echo "export JAVA_HOME=/opt/java" >> /opt/hadoop-3.2.0/etc/hadoop

#修改core-site.xml和hdfs-site.xml 两个文件

cat <<-ENDCS > /opt/hadoop-3.2.0/etc/hadoop/core-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
  <name>fs.defaultFS</name>
  <value>hdfs://master:9000</value>
</property>
<property>
  <name>hadoop.tmp.dir</name>
  <value>/data/files</value>
</property>
<property>
    <name>fs.trash.interval</name>
    <value>4320</value>
</property>
</configuration>
ENDCS

cat <<-ENDHDFS > /opt/hadoop-3.2.0/etc/hadoop/hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
   <name>dfs.namenode.name.dir</name>
   <value>/data/files/dfs/name</value>
 </property>
 <property>
   <name>dfs.datanode.data.dir</name>
   <value>/data/files/dfs/data</value>
 </property>
 <property>
   <name>dfs.replication</name>
   <value>3</value>
 </property>
 <property>
   <name>dfs.webhdfs.enabled</name>
   <value>true</value>
 </property>
 <property>
   <name>dfs.permissions.superusergroup</name>
   <value>staff</value>
 </property>
 <property>
   <name>dfs.permissions.enabled</name>
   <value>false</value>
 </property>
</configuration>
ENDHDFS

#拷贝配置好的Hadoop到两个Slave节点的工作目录:

scp -r /opt/hadoop-3.2.0 slave1:/opt/
scp -r /opt/hadoop-3.2.0 slave2:/opt/

#为NameNode(Master)节点添加DataNode节点(下面的脚本我同时把Master节点也添加为了DataNode节点,你可以根据服务器负载等具体情况来决定Master节点是否要承载DataNode的角色,不需要可以直接删除脚本中的master行即可):


cat <<-ENDDN > /opt/hadoop-3.2.0/etc/hadoop/workers
master
slave1
slave2
ENDDN


5、格式化NameNode,启动HDFS系统

#在Master主机上 输入命令hdfs格式化命令格式化NameNode,由于前面我们在配置JDK时顺便把Hadoop的目录也加入了环境变量,所以下面的Hadoop命令都可以直接运行不需要切换到相应执行文件目录。

hdfs namenode -format
start-dfs.sh


6、检查Hadoop是否启动成功

start-dfs.sh命令执行后等待一分钟左右,在游览器中输入:http://192.168.18.61:9870

默认地址为:NameNode(Master)的IP+9870端口

如果用浏览器打开上述地址出现下图页面说明HDFS启动完成,可以在相应页面查看HDFS系统运行信息。如果你在参考本教程部署时遇到问题,可以留言交流,谢谢!