最近公司业务数据量越来越大,以前的基于消息队列的日志系统越来越难以满足目前的业务量,表现为消息积压,日志延迟,日志存储日期过短,所以,我们开始着手要重新设计这块,业界已经有了比较成熟的流程,即基于流式处理,采用 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
|
# 当前ssh窗口即可生效
|
同样,在 slave1 、slave2 机器上面执行相同的命令,只需要更改最后一句为相应的角色名称
1
|
HOSTNAME=slave1
|
1
|
HOSTNAME=slave2
|
添加Hosts映射关系,三台机器上面分别都执行操作 vi /etc/hosts
添加如下内容 ,之后在每台机器上面ping
一下,确保能够连接彼此。
1
|
192.168.9.92 master
|
2.2 配置 JDK 环境
下载 Java 对应的版本,地址如下jdk-7u75-linux-i586.tar_0.gz,配置环境变量即可完成java环境的配置,详情看脚本 :
1
|
# 解压到 /opt/下面
|
使修改的配置立即生效,终端中执行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
|
# 创建账号hadoop并赋予密码nopass.2
|
2、给hadoop账户赋予root权限 vi /etc/sudoers
添加如下:
1
|
hadoop ALL=(ALL) ALL
|
这样就将生成的授权秘钥拷贝到了slave1和slave2的/home/hadoop/.ssh目录下,从 master 机器 ssh到 slave1 、slave2 都不再需要密码了,同理,在slave1、slave2机器上执行上面的命令即可完成slave 到master之间的无密码登录。(其实,操作完后,slave之间也是可以无密码登录的,只是不需要而已)
测试下 ,不使用密码登录即ok
1
|
ssh hadoop@master
|
三、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
|
export HADOOP_HOME=$HOME/hadoop-2.5.2
|
3、 修改 hadoop 文件目录中的各项配置文件 ,配置文件详细说明见
3.1、修改core-site.xml
配置
1
|
<configuration>
|
3.2 、修改hdfs-site.xml
,代码如下:
1
|
<configuration>
|
备注:访问namenode的hdfs使用50070端口,访问datanode的webhdfs使用50075端口。要想不区分端口,直接使用namenode的IP和端口进行所有的webhdfs操作,就需要在所有的datanode上都设置hdfs-site.xml中的dfs.webhdfs.enabled为true。
3.3 、修改mapred-site.xml
,代码如下:
1
|
<configuration>
|
备注:jobhistory是Hadoop自带了一个历史服务器,记录Mapreduce历史作业。默认情况下,jobhistory没有启动,可用以下命令启动:$HADOOP_HOME/sbin/mr-jobhistory-daemon.sh start historyserver
3.4、 修改yarn-site.xml
,代码如下:
1
|
<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
|
slave1
|
以上就是整个安装过程,下面测试下是否安装ok
四、Hadoop 集群的测试
4.1 启动 hadoop,验证页面是否ok
1 、格式化磁盘,格式化hadoop使用的文件磁盘,并不是物理上的磁盘,需要在每个节点上都执行下面的命令
1
|
source $HADOOP_HOME/bin/hdfs namenode –format
|
2、 启动hadoop ,注意:只需要在 master 节点上启动即可,会自动启动slave各个节点
1
|
# start-dfs.sh 此命令启动了namenode、secondaryNamenode以及datanode
|
3、 停止 hadoop , 注意:只需要在 master 节点上执行即可
1
|
$HADOOP_HOME/sbin/stop-all.sh
|
5、 HTTP效果,通过浏览器查看集群运行状态,访问 http://192.168.9.92:50070/、http://192.168.9.92:8088/、http://192.168.9.92:19888/ 即可看到下图的效果
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
|
./hadoop-daemon.sh start namenode
|
上述四个命令都可以指定—config参数,后面跟hadoop的集群配置文件所在目录(即$HADOOP_HOME/etc/hadoop),大家可通过参数-h查看命令帮助信息
注意:上面命令不会影响已经启动的hdfs或yarn服务,只会把丢失节点的服务启动起来。
4.2 运行Hadoop自带的wordcount示例
1、 创建input文件
1
|
cd /home/hadoop/
|
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
|
Hadoop 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