以下所有操作都是在Linux发行版Fedora25-64位系统上进行操作。注意您所操作的目录与当前终端所在的目录的区别以及相对路径的区分。
本文根据他人的教程进行配置,经过测试成功,并且做些小小的改动,现总结为本篇文章,如需了解更详细的教程,请参考作者原文,链接为:
Hadoop安装教程_单机/伪分布式配置_Hadoop2.6.0/Ubuntu14.04
Hadoop集群安装配置教程_Hadoop2.6.0_Ubuntu/CentOS
官方hadoop介绍文档,hadoop版本2.7.3:http://hadoop.apache.org/docs/r2.7.3/
官方API文档指南-hadoop版本2.7.3,链接地址:http://hadoop.apache.org/docs/r2.7.3/api/index.html
1、Linux Java环境配置
本次教程使用Oracle的jdk,不使用系统自带的openjdk,如有需要,可以卸载系统自带的openjdk,或者自己另行搜索openjdk的环境配置方法。这里分享本人整理的jdk安装包,百度云下载地址:http://pan.baidu.com/s/1hrLJ6Fq 密码:eji4 ,请根据自己系统版本选择对应的安装文件,这里使用64位的jdk 1.8.0_102。
下载jdk文件,解压到任意目录,为了便于管理,把jdk解压到目录 /usr/lib 下,同时使用命令更改jdk目录的用户所属:
1
2
3
4
|
$ su root //切换到超级用户
$
$ tar -zxf ./jdk-8u102-linux-x64.tar.gz -C /etc/lib/ //解压文件到 /etc/lib 目录下
$ chown -R root.root ./jdk1.8.0_102 //更改目录为root所有,用户组为root
|
使用root用户身份编辑文件 /etc/profile,添加jdk文件路径:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
$ su root //切换到root用户
$ vim /etc/profile
$ //添加如下字符串
export JAVA_HOME=/usr/lib/jdk1.8.0_102
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
$ source /etc/profile //不必重启系统,使环境变量生效
$ java -version //查看jdk版本信息
//输出如下信息,则表示Java环境配置正确
java version "1.8.0_102"
Java(TM) SE Runtime Environment (build 1.8.0_102-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode)
$
|
ps:Ubuntu系统可以编辑 /etc/bash.bashrc ,或者用户家目录下的 .bashrc 。
注意:编辑用户家目录下的 .bashrc 文件,表示只在当前用户下生效,/etc/profile 下的环境变量则是所有登录用户都生效。
2、Hadoop安装与环境配置
首先,创建用户:hadoop,用户名随意,这里使用hadoop,注意,在集群分布式中使用ssh无密码登录时,需要每一台主机的用户名都相同。
使用如下命令创建用户:
1
2
|
$ su root //切换到root用户
$ useradd -m hadoop -s /bin/bash //创建登录用户hadoop,并且使用/bin/basn 作为默认shell。
|
注销系统,以hadoop用户身份登录系统后,下载Hadoop安装包,可以从Hadoop官网进行下载:Apache Hadoop 下载 ,或者百度云下载:Hadoop 百度云下载地址密码:bvyd,请选择自己需要的版本进行下载。这里使用hadoop-2.7.3.tar.gz版本的安装包。
解压Hadoop安装文件,解压到任意目录:
1
2
3
4
5
6
7
8
9
10
11
|
$ tar -zxf ./hadoop-2.7.3.tar.gz -C ~/ //解压hadoop文件到用户的家目录下
$ mv ~/hadoop-2.7.3 ~/hadoop //更改目录名称
$ //配置hadoop环境变量,使hadoop的命令随处可用,编辑 /etc/profile 文件
$ vim ~/.bashrc
$ //添加如下字段
export PATH=$PATH:/home/hadoop/hadoop/sbin:/home/hadoop/hadoop/bin:/home/hadoop/hadoop/lib/native
$ //使设置生效
$ source ~/.bashrc
$ //验证是否生效,输入如下命令
$ hadoop version
$ //如果正常输出hadoop的版本信息,则表示hadoop环境配置成功。
|
Hadoop 默认模式为非分布式模式,可以直接以单Java进程运行hadoop程序,我们可以使用hadoop自带的例子,例如:
终端执行:
1
2
3
4
5
6
7
|
$ cd ~/hadoop //进入hadoop 目录
$ hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples*.jar //运行例子,可以看到所有例子
//在此,我们选择运行grep例子,将 input 文件夹中的所有文件作为输入,筛选当中符合正则表达式 dfs[a-z.]+ 的单词并统计出现的次数,最后输出结果到 output 文件夹中。
$ mkdir ./input //创建目录
$ cp ./etc/hadoop/*.xml ./input //将配置文件作为输入文件
$ hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep ./input ./output 'dfs[a-z.]+' //运行例子
$ cat ./output/* //查看运行结果 注意,Hadoop 默认不会覆盖结果文件,因此再次运行上面实例会提示出错,需要先将 ./output 删除。或者更换输出目录路径。
|
3、ssh无密码登录主机
配置Master主机节点可以无密码SSh登录到各个Slave节点。
首先生成Master节点的公钥,如果已经更改了主机名,则需要删除原来的公钥,重新生成。执行如下shell命令:
注意:Master与Slave机的用户名需要完全相同,主机不同,否则,以下的配置可能不会成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
$ cd ~/.ssh # 如果没有该目录,先执行一次ssh localhost,或者 ssh 目的IP地址,如:ssh 192.168.110.23
$ rm ./id_rsa* # 删除之前生成的公匙(如果有)
$ ssh-keygen -t rsa # 一直按回车就可以
//在Master节点上执行如下命令,使用Master节点可以无密码连接本机
$ cat ./id_rsa.pub >> ./authorized_keys
// 完成后可执行 ssh Master 验证一下(可能需要输入 yes,成功后执行 exit 返回原来的终端)。接着在 Master 节点将上公匙传输到 Slave1 节点:
$ scp ~/.ssh/id_rsa.pub hadoop@Slave1:/home/hadoop/ //Slave1 为集群分布中的一台主机的主机名,可以有Slave2、Slave3等等。
// 传输完毕,可以使用ssh连接到Slave1主机,这时需要密码进行登录
$ ssh Slave1主机IP
// 将Master主机传输过来的 ssh公钥加入授权
$ mkdir ~/.ssh # 如果不存在该文件夹需先创建,若已存在则忽略
$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
$ rm ~/id_rsa.pub # 用完就可以删掉了
//验证是否可以无密码进行登录,先退出当前连接 exit
$ ssh Slave1 //如果不需要密码就可以直接登录Slave1主机,则表示配置成功。
|
4、Hadoop伪分布式配置
hadoop伪分布式需要修改2个配置文件 core-site.xml 和 hdfs-site.xml,配置文件存放路径为 hadoop/etc/hadoop/中,使用vim 修改core-site.xml配置文件:vim ./etc/hadoop/core-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
|
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/home/hadoop/hadoop/tmp</value>
<!- 配置缓存文件路径,避免系统重启时丢失数据,需要再次进行格式化节点-->
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://Master:9000</value>
</property>
</configuration>
|
修改配置文件:vim ./etc/hadoop/hdfs-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value> <!- 这里的数值为集群分布的主机数量 -->
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/hadoop/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/hadoop/hadoop/tmp/dfs/data</value>
</property>
</configuration>
|
配置完成后,执行 NameNode 的格式化:
1
2
3
4
5
|
$ hdfs namenode -format //成功的话,会看到 “successfully formatted” 和 “Exitting with status 0” 的提示,若为 “Exitting with status 1” 则是出错。
//接着开启 NameNode 和 DataNode 守护进程。
$ start-dfs.sh
// 启动时可能会出现如下 WARN 提示:WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable。该 WARN 提示可以忽略,并不会影响正常使用(该 WARN 可以通过编译 Hadoop 源码解决)。
|
启动完成后,可以通过命令 jps 来判断是否成功启动,若成功启动则会列出如下进程: “NameNode”、”DataNode” 和 “SecondaryNameNode”(如果 SecondaryNameNode 没有启动,请运行 sbin/stop-dfs.sh 关闭进程,然后再次尝试启动尝试)。如果没有 NameNode 或 DataNode ,那就是配置不成功,请仔细检查之前步骤,或通过查看启动日志排查原因。
此外,若是 DataNode 没有启动,可尝试如下的方法(注意这会删除 HDFS 中原有的所有数据,如果原有的数据很重要请不要这样做),此外,在集群分布式环境中如果发现有的节点无法启动datanode,则删除各个节点的tmp文件夹和logs,再重新在master中格式化,hdfs namenode -format:
ps:当master主机进行namenode格式化时,需要提前把所有Slave主机的tmp和日志logs目录删除,否则会出现有的主机无法启动DataNode节点。
1
2
3
4
|
$ ./sbin/stop-dfs.sh # 关闭
$ rm -r ./tmp # 删除 tmp 文件,注意这会删除 HDFS 中原有的所有数据
$ ./bin/hdfs namenode -format # 重新格式化 NameNode
$ ./sbin/start-dfs.sh # 重启
|
成功启动后,可以访问 Web 界面 http://localhost:50070 查看 NameNode 和 Datanode 信息,还可以在线查看 HDFS 中的文件。
由于运行伪分布式实例的方法与运行分布式实例的方法相同,请参考下面的分布式实例。
5、Hadoop集群分布式配置
首先确保作为Master的主机已经有一个清楚的主机名,这里使用Master作为master主机的主机名,修改主机名需要编辑文件 /etc/hostname :
1
2
3
4
5
|
su root
vim /etc/hostname
//把默认的localhost修改为 Master
Master
|
编辑文件 /etc/hosts ,添加相应的IP映射
1
2
3
4
5
6
7
8
|
su root
vim /etc/hosts
//添加如下字段
127.0.0.1 localhost
192.168.110.12 Master //该IP依然为Master主机的IP地址
192.168.110.14 Slave1 //以下为Slave机的IP与主机名
192.168.110.15 Slave2
.........
|
同样的操作需要在每一台Slave主机上进行配置。每次更改主机名后需要重启系统,使其生效。
集群/分布式模式需要修改 /usr/local/hadoop/etc/hadoop 中的5个配置文件,更多设置项可点击查看官方说明,这里仅设置了正常启动所必须的设置项: slaves、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml 。
文件 slaves,将作为 DataNode 的主机名写入该文件,每行一个,默认为 localhost,如果你不想Master主机作为datanode,可以删除该行,但是,如果你有多台Slave机,并且同时想要Master机作为DataNode,则应该修改localhost为Master,否则可能在开启集群分布式环境时出错。
文件 Slaves 内容如下:
1
2
3
4
|
Master //如果同时需要Master主机作为DataNode节点,则添加,否则删除此行内容。
Slave1 //以下为Slave机的主机名
Slave2
......
|
同时需要修改文件:/home/hadoop/hadoop/etc/hadoop/hadoop-env.sh,手动添加所在主机的jdk路径:export JAVA_HOME=/usr/lib/jdk1.8.0_102,而不是采用Java环境变量,这样可以避免在运行分布式时,有的SLave机找不到JAVA_HOME的问题。
更改文件 core-site.xml 配置为:
1
2
3
4
5
6
7
8
9
10
11
|
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://Master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/home/hadoop/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
</configuration>
|
更改 hdfs-site.xml 文件配置为:我这里有三台主机作为集群
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>Master:50090</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/hadoop/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/hadoop/hadoop/tmp/dfs/data</value>
</property>
</configuration>
|
修改文件 mapred-site.xml 配置为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>Master:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>Master:19888</value>
</property>
</configuration>
|
修改文件 yarn-site.xml 配置为:
1
2
3
4
5
6
7
8
9
10
|
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>Master</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
|
配置好后,将 Master 上的 /usr/local/Hadoop 文件夹复制到各个节点上。因为之前有跑过伪分布式模式,建议在切换到集群模式前先删除之前的临时文件。在 Master 节点上执行:
1
2
3
4
5
6
7
8
9
10
11
|
cd /home/hadoop/
rm -r ./hadoop/tmp # 删除 Hadoop 临时文件
rm -r ./hadoop/logs/* # 删除日志文件
tar -zcf ~/hadoop.master.tar.gz ./hadoop # 先压缩再复制
cd ~
scp ./hadoop.master.tar.gz Slave1:/home/hadoop
//在 Slave1 节点上执行:
rm -r /usr/local/hadoop # 删掉旧的(如果存在)
tar -zxf ~/hadoop.master.tar.gz -C /usr/local
chown -R hadoop /home/hadoop/hadoop
|
注意:在Fedora系统中sshd服务可能需要手动开启,我在测试中没有添加sshd服务开机启动,所以手动启动:
1
|
su root; service sshd start;
|
在 Master 节点执行 NameNode 的格式化:
1
|
hdfs namenode -format # 首次运行需要执行初始化,之后不需要
|
接着可以启动 hadoop 了,启动需要在 Master 节点上进行:
1
2
3
|
start-dfs.sh
start-yarn.sh
mr-jobhistory-daemon.sh start historyserver
|
通过命令 jps 可以查看各个节点所启动的进程。正确的话,在 Master 节点上可以看到 DataNode、NameNode、ResourceManager、SecondrryNameNode、JobHistoryServer 进程。
缺少任一进程都表示出错。另外还需要在 Master 节点上通过命令 hdfs dfsadmin -report 查看 DataNode 是否正常启动,如果 Live datanodes 不为 0 ,则说明集群启动成功。
如果发现有的节点无法启动datanode,则删除各个节点的tmp文件夹和logs,再重新在master中格式化,hdfs namenode -format
可以通过 Web 页面看到查看 DataNode 和 NameNode 的状态:http://master:50070/。如果不成功,可以通过启动日志排查原因。
执行分布式实例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
//执行分布式实例过程与伪分布式模式一样,首先创建 HDFS 上的用户目录:
hdfs dfs -mkdir -p /user/hadoop
//将 /home/hadoop/hadoop/etc/hadoop 中的配置文件作为输入文件复制到分布式文件系统中:
hdfs dfs -mkdir input
hdfs dfs -put /usr/local/hadoop/etc/hadoop/*.xml input
//查看是否正确拷贝文件到了分布式系统中
hdfs dfs -ls input //如果正确列出拷贝的文件则执行成功。
//运行 MapReduce 作业了:
hadoop jar /home/hadoop/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+'
//运行时的输出信息与伪分布式类似,会显示 Job 的进度。
//执行完毕,输出结果
hdfs dfs -cat output/*
//在Master上关闭集群
stop-yarn.sh
stop-dfs.sh
mr-jobhistory-daemon.sh stop historyserver
//同伪分布式一样,也可以不启动 YARN,但要记得改掉 mapred-site.xml 的文件名。
|
可以通过 Web 界面查看任务进度 http://master:8088/cluster,在 Web 界面点击 “Tracking UI” 这一列的 History 连接,可以看到任务的运行信息。
6、Hadoop开启YARN管理
从引用的作者文章里有提到:YARN 是从 MapReduce 中分离出来的,负责资源管理与任务调度。YARN 运行于 MapReduce 之上,提供了高可用性、高扩展性,YARN 的更多介绍在此不展开,有兴趣的可查阅相关资料。
接下来开始配置YARN,首先需要将YARN的配置文件进行重命名:
1
|
mv ./etc/hadoop/mapred-site.xml.template ./etc/hadoop/mapred-site.xml
|
编辑文件 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
2
3
|
$ start-dfs.sh //启动分布式系统
$ start-yarn.sh //启动YARN
$ sbin/mr-jobhistory-daemon.sh start historyserver # 开启历史服务器,才能在Web中查看任务运行情况
|
开启后通过 jps 查看,可以看到多了 NodeManager 和 ResourceManager 两个后台进程。可以通过 Web 界面查看任务的运行情况:http://localhost:8088/cluster
注意:不启动 YARN 需重命名 mapred-site.xml
如果不想启动 YARN,务必把配置文件 mapred-site.xml 重命名,改成 mapred-site.xml.template,需要用时改回来就行。否则在该配置文件存在,而未开启 YARN 的情况下,运行程序会提示 “Retrying connect to server: 0.0.0.0/0.0.0.0:8032” 的错误,这也是为何该配置文件初始文件名为 mapred-site.xml.template。
关闭YARN:
1
2
|
stop-yarn.sh
mr-jobhistory-daemon.sh stop historyserver
|