Hadoop环境搭建

在之前的大数据课程项目中,简单搭建了一个MasterNode和两个SlaveNode的Hadoop网络集群。踩了一些坑,把搭建过程简单记录一下,包含基础步骤和一些常见的报错解决。

首先当然是需要去购买三个服务器,选一台服务器作为Master,另外两台作为Slave。

配置SSH

在一个Hadoop集群里面,Master节点要能和Slave节点之间无需密码地互相登录。所以需要生成秘钥对,去实现免密的SSH登录。下面以设置MasterNode为例,实现从MasterNode免密登录到SlaveNode。

cd ~\.ssh进入ssh文件目录,之后ssh-keygen -t rsa生成一对RSA方式加密的秘钥。

ssh-copy-id -i ~/.ssh/id\_rsa.pub root@the ip address of your slave server
这条指令会自动把刚刚生成公钥加入SlaveNode的authorized_keys配置文件里面,并且一旦成功SSH到一个SlaveNode之后,在MasterNode里面的配置文件known_hosts会记录下这个SlaveNode的地址信息。

确保MasterNode能免密SSH登录所有的SlaveNode之后,对各个SlaveNode进行类似的操作,确保每个SlaveNode能免密SSH登录MasterNode。

安装JAVA环境

1
2
sudo apt-get update
sudo apt-get -y install openjdk-8-jdk-headless

在.bashrc(.zshrc)文件中加入
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/

之后source .bashrc完成变量更新。装完之后可以java -versionjps测试一下输出是否正常。

安装Hadoop

下载
wget https://www-us.apache.org/dist/hadoop/common/hadoop-2.9.2/hadoop-2.9.2.tar.gz

解压

sudo tar zxvf hadoop-*.tar -C /usr/local
sudo mv /usr/local/hadoop-* /usr/local/hadoop

修改.bashrc文件

1
2
3
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop

修改host文件

vim /etc/hosts

删除原有的localhost

新增:

1
2
3
xxx.xxx.xxx.xxx Master
xxx.xxx.xx.xx Slave1
xxx.xxx.xx.xx Slave2

xxx是内部ip地址。这样,以后配置文件的时候就可以使用主机名称Master, Slave1, Slave2

以上的操作需要对所有Node操作一遍。

配置Hadoop

首先进入配置文件文件夹
cd $HADOOP_CONF_DIR

前三个step对所有的node都适用

Step1

修改core-site.xml

mkdir /usr/local/hadoop/tmp

hadoop.tmp.dir 是 hadoop文件系统依赖的基本配置,很多配置路径都依赖它,它的默认位置在/tmp/{$user}下面。但是服务器在服务重启后,/tmp 下的目录被清空,Hadoop无法找到dfs/name 这个dfs文件系统的域名空间文件。建议使用自己创建的文件夹地址作为tmp文件夹的地址。解决办法:在core-site.xml中配置 hadoop.tmp.dir 路径到持久化目录。

1
2
3
4
5
6
7
8
9
10
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://Master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
</property>
</configuration>

Step2

修改yarn-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<configuration>

<! — Site specific YARN configuration properties →
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce\_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>Master</value>
</property>

</configuration>

Step3

修改mapred-site.xml

把给的mapred-site.xml.template复制一份生成mapred-site.xml

sudo cp $HADOOP_CONF_DIR/mapred-site.xml.template $HADOOP_CONF_DIR/mapred-site.xml

1
2
3
4
5
6
7
8
9
10
<configuration>
<property>
<name>mapreduce.jobtracker.address</name>
<value>Master:54311</value>
</property>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>

Step4

这一步仅仅针对MasterNode

1
2
3
4
5
6
7
8
9
10
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///usr/local/hadoop/hadoop_data/hdfs/namenode</value>
</property>
</configuration>

建立namenode文件夹:
sudo mkdir -p $HADOOP_HOME/hadoop_data/hdfs/namenode

vim $HADOO_CONF_DIR/masters

文件里面加入 Master 一行

vim \$HADOOP\_CONF\_DIR/slaves

文件里面加入

1
2
Slave1
Slave2

Step5

针对SlaveNode的步骤

修改 hdfs-site.xml

1
2
3
4
5
6
7
8
9
10
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///usr/local/hadoop/hadoop\_data/hdfs/datanode</value>
</property>
</configuration>

创建datanode目录:
sudo mkdir -p $HADOOP_HOME/hadoop_data/hdfs/datanode

值得注意的是在\usr\local\hadoop路径下的所有目录都需要归属同一个user和group。

运行Hadoop

Format namenode

hdfs namenode -format

Start cluster

$HADOOP_HOME/sbin/start-all.sh

如果配置成功,终端输入jps

在MasterNode, 输出是:

1
2
3
4
xxx Jps
xxx SecondaryNameNode
xxx ResourceManager
xxx NameNode

在SlaveNode, 输出是:

1
2
3
xxx Jps
xxx NodeManager
xxx DataNode

之后再测试一下hdfs的使用情况

查看内容
hdfs dfs -ls <folder name>

创建文件夹
hdfs dfs -mkdir <folder name>

拷贝文件
hdfs dfs -copyFromLocal <local folder or file name>

删除文件
hdfs dfs -rm <file name>

删除文件夹
hdfs dfs -rmdir <folder name>

查看hdfs信息
hadoop dfsadmin -report

启动失败的解决方法

停止所有Hadoop进程
$HADOOP_HOME/sbin/stop-all.sh

清除namenode和datanode里的所有文件

查看log目录下的log