Apache Hadoop 的配置安装及错误处理

Posted by Donggu Ho on 2016-11-23

在阿里云上面配了个(并不知道用来干啥的) Hadoop。主要参考的还是Apache官网的教程,配置过程中出现一些报错,网上的解决方案似乎不多?
服务器系统: CentOS 7.0 64x
Hadoop 版本: Apache Hadoop 2.7.3
JDK 版本: jdk1.8.0_101

安装流程

前置环境配置

  1. 安装JDK,并配置JAVA_HOME等环境变量(略)
  2. 安装sshrsync
1
2
$ yum install ssh
$ yum install rsync

绝大多数服务器都已经自带了 ssh,而我的服务器也已经安装了 rsync。这是官方文档的要求,但其实我有点怀疑 rsync 的必要性……因为似乎并没有用到……这货是用来以 sftp 协议传输文件的。

修改hosts

1
$ vi /etc/hosts

127.0.0.1所在行加上自己机器的名字并保存。
然后重启网络服务使其生效。

1
$ service network restart

下载与安装

  • 下载并解压
1
2
3
4
5
$ cd
$ wget http://ftp.jaist.ac.jp/pub/apache/hadoop/common/hadoop-2.7.3/hadoop-2.7.3.tar.gz
$ mkdir /usr/local/hadoop
$ cd /usr/local/hadoop
$ tar zxvf ~/hadoop-2.7.3.tar.gz
  • 配置环境变量

这步可以跳过我就是图个方便?

1
$ vi ~/.bash_profile

添加HADOOP_HOME环境变量,并将$HADOOP_HOME/bin$HADOOP_HOME/sbin续到PATH后面,以冒号:分隔。

1
2
3
export HADOOP_HOME=/usr/local/hadoop/hadoop-2.7.3           #添加HADOOP_HOME环境变量
PATH=$PATH:$HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export PATH

保存后运行source ~/.bash_profile使设置生效;下次登录时会自动生效。这步完成之后其实下文所有的bin/hadoop bin/hdfs sbin/start-all.sh等指令都可以在任意目录下直接运行了。

配置非分布式

1
2
3
4
$ mkdir input
$ cp etc/hadoop/*.xml input
$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar grep input output 'dfs[a-z.]+'
$ cat output/*

基本上就是随便配配【

配置伪分布式

1
$ cd $HADOOP_HOME/etc/hadoop

需要修改以下文件:

  • hadoop-env.sh 第27行修改为
1
export JAVA_HOME=<JAVA_HOME路径地址>

我也不知道为什么明明JAVA_HOME环境变量已经配好了这里还要重写一次……

  • core-site.xml
1
2
3
4
5
6
7
8
9
10
11
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
<!-- 指定运行时产生文件的存放目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
</property>
</configuration>

如果不指定存放目录的话产生的文件会放置到/tmp/hadoop下,如果系统重启就会被清除。

  • hdfs-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<!-- 使用完整的绝对地址 -->
<value>file:/usr/local/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<!-- 即使用完整的绝对地址 -->
<value>file:/usr/local/hadoop/tmp/dfs/data</value>
</property>
</configuration>

此处指定路经地址也是为了方便管理。参考的中文教程中两个地址是一样的,估计是写错了。

使用ssh查看能否无密码连接

1
2
$ ssh localhost
$ exit #测试后退出ssh连接

如果无法连接则需要执行以下语句

1
2
3
$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 0600 ~/.ssh/authorized_keys

格式化与初运行

1
2
3
$ cd $HADOOP_HOME
$ bin/hdfs namenode -format #格式化
$ sbin/start-dfs.sh #运行dfs

启动完毕后,使用jps查看是否已启动成功。若NameNodeDataNodeSecondaryNameNode都出现则ok。

1
2
3
4
5
$ jps
19488 SecondaryNameNode
19188 NameNode
20248 Jps
19292 DataNode

此时可以在浏览器连接http://localhost:50070查看Hadoop的运行情况。
运行无碍可以试跑一下 example 的 grep:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 在hdfs内新建文件夹
$ bin/hdfs dfs -mkdir /user
$ bin/hdfs dfs -mkdir /user/<username>

# 随便将一些文件丢到/user/<username>/input/内
$ bin/hdfs dfs -put etc/hadoop/*.xml input

# 运行 grep,输出到/user/<username>/output
# 注意:输出文件夹无需新建
$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar grep input output 'dfs[a-z.]+'

# 查看输出
$ bin/hdfs dfs -cat output/*

关闭dfs

1
$ sbin/stop-dfs.sh

假如有错误记得先关闭了再慢慢修改和格式化……

只有一台机子的话做到这里就够了后面配了也是浪费时间跑得更慢

配置yarn

修改以下配置文件:

  • etc/hadoop/mapred-site.xml
    该属性用以指定运行yarn,所以想要回到无yarn状态需要删除该文件(或者xjb改个名字)。
1
2
cp mapred-site.xml.template mapred-site.xml
vi mapred-site.xml
1
2
3
4
5
6
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
  • yarn-site.xml
1
2
3
4
5
6
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>

运行和停止yarn

1
sbin/start-yarn.sh

使用命令JPS,若有NodeManagerResouceManager出现则成功。
此时可以在浏览器连接http://localhost:8088查看yarn的运行情况。
停止yarn:

1
sbin/stop-yarn.sh

Hadoop和yarn一起启动

1
2
sbin/start-all.sh   #同时启动
sbin/stop-all.sh #同时关闭

参考

报错处理

Error: JAVA_HOME is not set and could not be found.

hadoop-env.sh 第27行修改为

1
export JAVA_HOME=<JAVA_HOME路径地址>

NameNode 没有运行

查看日志$HADOOP_HOME/logs/下记录NameNode.log文件,发现有报错指出端口9000已被占用。
查看端口9000的情况

1
2
$ netstat -apn | grep 9000  
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 845/php-fpm: master

发现端口已经被php程序占用了,那天我终于想起我服务器是配了php的 因此需要换一个没在用的端口(使用netstat -apn查看所有已被使用的端口)。
修改$HADOOP_HOME/etc/hadoop/core-site.xml中的端口

1
2
3
4
5
6
7
8
9
10
11
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9001</value><!-- 将端口改为9001 -->
</property>
<!-- 指定运行时产生文件的存放目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
</property>
</configuration>

更改后需要重新格式化dfs,否则会发生NameNode启动成功了DataNode又不行了的玄学事件。

重新格式化的注意事项

假如才刚刚搭起来,里面没有东西的话,建议直接删除temp文件夹(~在core-site.htmlhdfs-site.html中指定的那些路径)的所有内容,然后执行格式化语句。
假如没办法直接删库跑路的话,执行格式化语句之后要把tmp/name/current/VERSION复制到tmp/data/current/VERSION(好像是吧)【。