布式实时日志系统(三) 环境搭建之centos 6.4下hadoop 2.5.2完全分布式集群搭建最全资料

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

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

Hadoop introduction , Why and What is Hadoop ? from Sudhakara St

 

在搭建 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/ 即可看到下图的效果

hadoop-overview

hadoop-cluster

hadoop-jobhistory

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.csdn.net/hwwn2009/article/details/39889465
http://www.cnblogs.com/bxljoy/p/3880250.html
http://ju.outofmemory.cn/entry/29825
http://blog.csdn.net/tang9140/article/details/42869531

posted on 2015-10-15 18:36  Yudar  阅读(504)  评论(0编辑  收藏  举报