布式实时日志系统(三) 环境搭建之centos 6.4下hadoop 2.5.2完全分布式集群搭建最全资料 一、总体环境说明 二、设置环境变量 三、Hadoop 集群的安装 四、Hadoop 集群的测试 五、参考资料

最近公司业务数据量越来越大,以前的基于消息队列的日志系统越来越难以满足目前的业务量,表现为消息积压,日志延迟,日志存储日期过短,所以,我们开始着手要重新设计这块,业界已经有了比较成熟的流程,即基于流式处理,采用 flume 收集日志,发送到 kafka 队列做缓冲,storm 分布式实时框架进行消费处理,短期数据落地到 hbase、mongo中,长期数据进入 hadoop 中存储。 接下来打算将这其间所遇到的问题、学习到的知识记录整理下,作为备忘,作为分享,带给需要的人。

hadoop 简介,也可以去官网看介绍 :(slideshare PPT 分享服务在大陆是被墙的,不能科学上网?查看使用shadowsocks服务享受自由网络学习方法)

在搭建 hadoop 集群的过程中还是遇到很多问题的,我尽量的以初学者的口吻来写这篇文章,尽量做到详尽,当然不明白、不清楚的地方可以随时留言或找到我的联系方式与我沟通。

操作系统: cenos 6.4 ,三台192.168.9.92、192.168.9.93、192.168.9.94
jdk版本: 1.7.0_75
hadoop版本: 2.5.2 (目的与hbase兼容)

hadoop集群3个节点,一主两从,如下:

角色 ip 用户 运行进程
master 192.168.9.92 hadoop JobHistoryServer,ResourceManager,NameNode,NodeManager,DataNode,Main
slave1 192.168.9.93 hadoop NodeManager,DataNode
slave2 192.168.9.94 hadoop NodeManager,DataNode

二、设置环境变量

安装 hadoop 前需要提前配置好三台机器的 hostname,之间ssh无密码可登陆,Java环境的搭建,bashrc 的一些变量设置等,详细如下

2.1 设置机器hostname别名

设置别名的目的是机器间相互识别可以不用ip,配置文件中也可以不用ip,通用性上更强一些。

在 master 机器上面执行下面的命令:

1
2
3
4
5
# 当前ssh窗口即可生效
hostname master
# 每次重启以后均生效
vi /etc/sysconfig/network
HOSTNAME=master

同样,在 slave1 、slave2 机器上面执行相同的命令,只需要更改最后一句为相应的角色名称

1
HOSTNAME=slave1
1
HOSTNAME=slave2

添加Hosts映射关系,三台机器上面分别都执行操作 vi /etc/hosts 添加如下内容 ,之后在每台机器上面ping一下,确保能够连接彼此。

1
2
3
192.168.9.92 master
192.168.9.93 slave1
192.168.9.94 slave2

2.2 配置 JDK 环境

下载 Java 对应的版本,地址如下jdk-7u75-linux-i586.tar_0.gz,配置环境变量即可完成java环境的配置,详情看脚本 :

1
2
3
4
5
6
7
8
9
10
# 解压到 /opt/下面
tar -zxf jdk-7u75-linux-i586.tar_0.gz -C /opt/

# 配置java环境,最好在全局 /etc/profile 配置中修改,这样所有用户均可以使用
vi /etc/profile

JAVA_HOME=/opt/jdk1.7.0_75
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME

使修改的配置立即生效,终端中执行source /etc/profile
测试是否ok,执行命令which java,若出现/opt/jdk1.7.0_75/bin/java 表示已经ok 或者java -version ,出现java version "1.7.0_75" 也表明ok。

2.3 配置集群之间SSH无密码登陆

1、为了hadoop集群的安全与方便管理,我们要另外新建用户,并设置密码,命令如下:

1
2
# 创建账号hadoop并赋予密码nopass.2
sudo adduser hadoop && sudo passwd hadoop

2、给hadoop账户赋予root权限 vi /etc/sudoers 添加如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
hadoop  ALL=(ALL)       ALL
```
3、配置集群各个节点之间的ssh无密码互信,也就是从master开始,ssh到master(localhost)、slave1和slave2上都不需要密码,反向ssh到master同样,互信设置需要在`hadoop`用户下执行命令如下:

``` bash
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

# 这步很重要,必须要授予读写的权限 r=4,w=2,x=1
chmod 600 ~/.ssh/authorized_keys

# 拷贝授权认证公钥
scp ~/.ssh/authorized_keys hadoop@master:/home/hadoop/.ssh/
scp ~/.ssh/authorized_keys hadoop@slave1:/home/hadoop/.ssh/
scp ~/.ssh/authorized_keys hadoop@slave2:/home/hadoop/.ssh/

这样就将生成的授权秘钥拷贝到了slave1和slave2的/home/hadoop/.ssh目录下,从 master 机器 ssh到 slave1 、slave2 都不再需要密码了,同理,在slave1、slave2机器上执行上面的命令即可完成slave 到master之间的无密码登录。(其实,操作完后,slave之间也是可以无密码登录的,只是不需要而已)

测试下 ,不使用密码登录即ok

1
2
3
ssh hadoop@master 
ssh hadoop@slave1
ssh hadoop@slave2

三、Hadoop 集群的安装

hadoop 下载地址 :https://hadoop.apache.org/releases.html
hadoop 的安装其实很简单,解压完毕后,修改配置文件、环境变量就完成了安装,需要在每个节点都安装,为了写了一键安装部署脚本,执行hadoop_install.sh后即可用启动命令进行测试,尽量做到简单方便的运维,提供的脚本如往常一样再本文最后给出,下面就一步步解释下:

1、 解压 hadoop-2.5.2.tar.gz 文件

1
tar -zxvf hadoop-2.5.2.tar.gz -C /home/hadoop/

2、修改环境变量vi /home/hadoop/.bashrc ,添加如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
export HADOOP_HOME=$HOME/hadoop-2.5.2
export HADOOP_MAPRED_HOME=${HADOOP_HOME}
export HADOOP_COMMON_HOME=${HADOOP_HOME}
export HADOOP_HDFS_HOME=${HADOOP_HOME}
export YARN_HOME=${HADOOP_HOME}
export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
export HDFS_CONF_DIR=${HADOOP_HOME}/etc/hadoop
export YARN_CONF_DIR=${HADOOP_HOME}/etc/hadoop
export HADOOP_LOG_DIR=${HADOOP_HOME}/logs
export HADOOP_PID_DIR=/var/hadoop/pids

# 解决启动时候的错误
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"

3、 修改 hadoop 文件目录中的各项配置文件 ,配置文件详细说明见
3.1、修改core-site.xml 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>

<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>

<property>
<name>hadoop.tmp.dir</name>
<!--hadoop运行时的临时文件的目录-->
<value>/home/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>

</configuration>

3.2 、修改hdfs-site.xml ,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:9001</value>
</property>

<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoop/dfs/name</value>
</property>

<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoop/dfs/data</value>
</property>

<property>
<!-- 值不应大于datanode数量 -->
<name>dfs.replication</name>
<value>2</value>
</property>

<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>

</configuration>

备注:访问namenode的hdfs使用50070端口,访问datanode的webhdfs使用50075端口。要想不区分端口,直接使用namenode的IP和端口进行所有的webhdfs操作,就需要在所有的datanode上都设置hdfs-site.xml中的dfs.webhdfs.enabled为true。

3.3 、修改mapred-site.xml,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<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>

备注:jobhistory是Hadoop自带了一个历史服务器,记录Mapreduce历史作业。默认情况下,jobhistory没有启动,可用以下命令启动:$HADOOP_HOME/sbin/mr-jobhistory-daemon.sh start historyserver

3.4、 修改yarn-site.xml,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<configuration>
<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.address</name>
<value>master:8032</value>
</property>

<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:8030</value>
</property>

<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:8031</value>
</property>

<property>

<name>yarn.resourcemanager.admin.address</name>
<value>master:8033</value>
</property>

<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:8088</value>
</property>
</configuration>

3.5、 修改两个启动命令文件 hadoop-env.sh 和 yarn-env.sh ,添加 JAVA_HOME 变量 :

1
export JAVA_HOME=/opt/jdk1.7.0_75

3.6 、 修改 slaves配置,代码如下,添加两台slaves机器:

1
2
slave1
slave2

以上就是整个安装过程,下面测试下是否安装ok

四、Hadoop 集群的测试

4.1 启动 hadoop,验证页面是否ok

1 、格式化磁盘,格式化hadoop使用的文件磁盘,并不是物理上的磁盘,需要在每个节点上都执行下面的命令

1
source $HADOOP_HOME/bin/hdfs namenode –format

2、 启动hadoop ,注意:只需要在 master 节点上启动即可,会自动启动slave各个节点

1
2
3
4
5
6
7
8
# start-dfs.sh 此命令启动了namenode、secondaryNamenode以及datanode
# start-yarn.sh 此命令启动了ResourceManager和NodeManager,相当于hadoop1中的jobtracker和TaskTracker

$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh

# 或者使用这一个命令代替
# $HADOOP_HOME/sbin/start-all.sh

3、 停止 hadoop , 注意:只需要在 master 节点上执行即可

1
2
3
4
5
6
7
8
9
10
$HADOOP_HOME/sbin/stop-all.sh
```
4、测试是否启动ok,使用java进程查看命令`jps`,终端中输入即可,看到如下内容即表示ok

``` bash
7692 ResourceManager
8428 JobHistoryServer
7348 NameNode
14874 Jps
7539 SecondaryNameNode

5、 HTTP效果,通过浏览器查看集群运行状态,访问 http://192.168.9.92:50070/、http://192.168.9.92:8088/、http://192.168.9.92:19888/ 即可看到下图的效果

布式实时日志系统(三) 环境搭建之centos 6.4下hadoop 2.5.2完全分布式集群搭建最全资料
一、总体环境说明
二、设置环境变量
三、Hadoop 集群的安装
四、Hadoop 集群的测试
五、参考资料

布式实时日志系统(三) 环境搭建之centos 6.4下hadoop 2.5.2完全分布式集群搭建最全资料
一、总体环境说明
二、设置环境变量
三、Hadoop 集群的安装
四、Hadoop 集群的测试
五、参考资料

布式实时日志系统(三) 环境搭建之centos 6.4下hadoop 2.5.2完全分布式集群搭建最全资料
一、总体环境说明
二、设置环境变量
三、Hadoop 集群的安装
四、Hadoop 集群的测试
五、参考资料

6、单独重启丢失的DataNode节点
如果某个DataNode节点Dead(由于死机或人为原因等),可以在不重启整个Hadoop服务的情况下进行单独重启。
方法如下:
在NameNode的hadoop-2.5.2/sbin目录下,执行命令启动HDFS DataNode

./hadoop-daemons.sh start datanode
./yarn-daemons.sh start nodemanager  

或者单独启动NameNode节点,命令如下:

1
2
./hadoop-daemon.sh start namenode  
./yarn-daemon.sh start resourcemanager

上述四个命令都可以指定—config参数,后面跟hadoop的集群配置文件所在目录(即$HADOOP_HOME/etc/hadoop),大家可通过参数-h查看命令帮助信息
注意:上面命令不会影响已经启动的hdfs或yarn服务,只会把丢失节点的服务启动起来。

4.2 运行Hadoop自带的wordcount示例

1、 创建input文件

1
2
3
cd /home/hadoop/
echo "My first hadoop example. Hello Hadoop in input. " > input
ls

2、创建用户目录,必须是 /user/用户名

1
$HADOOP_HOME/bin/hadoop fs -mkdir -p /user/hadoop

3、上传文件

1
$HADOOP_HOME/bin/hadoop fs -put input /user/hadoop

4、 执行 wordcount 程序

1
$HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.2.jar wordcount /user/hadoop/input /user/hadoop/output

5、验证结果

1
$HADOOP_HOME/bin/hadoop fs -cat /user/hadoop/output/part-r-00000
1
2
3
4
5
6
7
Hadoop  1  
My 1
example.Hello 1
first 1
hadoop 1
in 1
input. 1

五、参考资料

http://blog.****.net/hwwn2009/article/details/39889465
http://www.cnblogs.com/bxljoy/p/3880250.html
http://ju.outofmemory.cn/entry/29825
http://blog.****.net/tang9140/article/details/42869531