背景
之前的时间里对Hadoop的使用都是基于学长所搭建起的实验环境的,没有完整的自己部署和维护过,最近抽时间初体验了在集群环境下装机、配置、运行的全过程,梳理总结到本文中。
配置
环境准备
1.节点机器的配置
配置固定IP:修改/etc/nerwork/interfaces auto lo iface lo inet loopback address 192.168.108.131 gateway 192.168.108.2 netmask 192.168.108.0 broadcast 192.168.108.0
为了便于管理,建议按统一约定修改hostname:修改/etc/hostname;同时,Hadoop集群要求每个节点使用同一个账号来管理、运行,所以,也需要设置好公用账号。
2.集群ssh配置
ssh相关原理和操作,参见博文《SSH原理和使用》。
在每台机器上生成密钥对,并将所有机器的公钥集成到master的~/.ssh/authorized_keys中,之后将这个文件分发到集群所有机器上。 这样,所有机器之间都可以实现免密码的ssh访问了。
使用如下指令,可以将本机的公钥添加到master的authorized_keys文件末尾。当所有节点都执行一遍以后,再将master的authorized_keys发布到各个节点上。
cat .ssh/id_rsa.pub | ssh T 'cat >> ~/.ssh/authorized_keys'
在分布式的环境里,运维工作的自动化很有必要。为了方便集群的运维,我写了两个简单的batch脚本。
统一执行脚本
在所有节点上执行同样的动作。使用时,在master节点上调用batch脚本,参数为对应的batch执行语句。
!/bin/bash Program: Execute instructions in hosts in slaveslist. Description: 2013/5/8 biaobiaoqi First Release if [ $# -lt 1 ]; then echo "usage: $0 COMMAND" exit 0 fi for i in cat slaveslist do ssh biaobiaoqi@$i "$1" done
脚本中使用的slaveslist文件保存着所有slave节点的hostname,需要与脚本放在同一个工作目录下。
统一替部署脚本
将主节点的某文件或目录统一的更新部署替换到所有节点上(注意,所有节点拥有相同的目录结构,即替换的文件路径相同)。
遇到hadoop集群中节点的增删改动需要修改配置文件的,都可以通过这个脚本便捷的部署。
!/bin/bash Program: Put the dirctory into all nodes of the cluster as the same path. Description: 2013/5/10 biaobiaoqi First Release if [ $# -lt 1 ]; then echo "Usage $0 DIR_PATH" exit 0 fi for i in cat slaveslist do ssh $i "rm ~/tmp -rf" scp -r $1 $i:~/tmp ssh $i "rm -rf $1; mv ~/tmp $1" done
4.配置hosts文件
由于hadoop体系在处理节点时,是使用的hostname,而非IP,所以必须先配置好hostname和IP的关系。
在一台机器上修改/etc/hosts
127.0.0.1 localhost 192.168.108.128 T3 192.168.108.129 T2 192.168.108.130 T 192.168.108.131 T4
然后使用统一执行脚本,将它发布到所有节点上。
值得注意的是,在/etc/hostsname中修改了host name之后,如果不同步的修改/etc/hosts中的相关信息,则在sudo操作时出现 sudo: unable to resolve host 的提示。原因是机器无法解析主机名。
修改/etc/hosts时也要特别注意,如果改成127.0.0.1 localhost HOSTNAME (其中HOSTNAME是主机名)的形式,在开启hadoop集群时,会出现datanode无法正常访问namenode,算是个小bug吧。所以得把hosts文件写成如上的形式。
5.配置Java环境
Hadoop需要Java1.6或更高版本,记住Java的安装目录,之后需要在hadoop配置过程中用到。
安装Hadoop
1.下载Hadoop
从官网下载Hadoop发布版(博主使用的是较早的稳定版0.20.2)
关于版本选择,推荐阅读:Hadoop版本选择探讨
2.部署
解压下载好的Hadoop,后放到合适的目录下。这里假定放置在/home/USER/ 的目录下
在/home/USER/.bashrc(其中USER为集群的用户名)文件中,增加如下语句,设定Hadoop相关的路径信息:
export JAVA_HOME=/usr/lib/jvm/java-6-openjdk export HADOOP_HOME=/home/hadoop/Hadoop export HADOOP_CONF=$HADOOP_HOME/conf export HADOOP_PATH=$HADOOP_HOME/bin export PATH=$HADOOP_PATH:$PATH export CLASSPATH=.:$JAVA_HOME/bin:$PATH:$HADOOP_HOME:$HADOOP_HOME/bin
Hadoop核心配置修改
配置文件在$HADOOP_HOME/conf目录下,其中基础配置比较重要的有三个:core-site.xml, hdfs-site.xml, mapred-site.xml。(当然,每个配置文件都有其细节作用,不过在初步实践hadoop时,理解这三个配置文件中的几个重要配置项就够了)
一般的,有三种可选模式。即本地模式、伪分布式模式和全分布式模式。前两种只是在单机环境下,后一种才是生产环境下的常用方式。《Hadoop权威指南》和《Hadoop实战》等书中都有讲到不同方式的配置,这里博主仅描述实验环境下4节点的全分布式配置。
core-site.xml整个hadoop的顶层配置
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Put site-specific property overrides in this file. --> <configuration> <property> <name>hadoop.tmp.dir</name> <value>/home/biaobiaoqi/UDMS/hadoop-data/tmp-base</value> <description> 存放临时目录的路径,默认也被用来存储hdfs的元数据和文件数据,值得注意的是,hadoop账户对所设定的本地路径是否有足够的操作权限。之后再hdfs-site.xml中设定的dfs.data.dir和dfs.name.dir也要注意同样的问题 </description> </property> <property> <name>fs.default.name</name> <value>hdfs://T:9000/</value> <description> 默认文件系统的标记。这个URI标记了文件系统的实现方式。UIR的协议决定了文件系统的实现类,而后面的值决定了文件系统的地址、端口等信息。 </description> </property> </configuration>
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Put site-specific property overrides in this file. --> <configuration> <property> <name>dfs.replication</name> <value>3</value> <description>默认的块的副本数量。实际的副本数量可以在文件写入的时候确定,默认的副本数则是在没有指定写入副本时被使用。 </description> </property> <property> <name>dfs.name.dir</name> <value>/home/hadoop/hadoop-data/meta-data</value> <description> 设定hdfs的元数据信息存储地址。在namenode上。 </description> </property> <property> <name>dfs.data.dir</name> <value>/home/hadoop/hadoop-data/data</value> <description> 设定hdfs的数据存储地址。在datanode上。 </description> </property> </configuration>
mapred-site.xml存储mapreduce作业相关配置
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Put site-specific property overrides in this file. --> <configuration> <property> <name>mapred.job.tracker</name> <value>T:9001</value> <description> Mapreduce 的job tracker所在的节点和端口。</description> </property> </configuration>
T
slaves文件存储着所有的slaves节点
T2 T3 T4
启动集群
1.格式化namenode
如果是第一次起动集群,需要先格式化HDFS。
namenode存放了HDFS的元数据,故可以看成是对HDFS的格式化。
$HADOOP_HOME/bin/hadoop namenode -format
2.启动守护进程
$HADOOP_HOME/bin/start-all.sh
等价于如下命令执行:
start dfs daemons $"$bin"/start-dfs.sh --config $HADOOP_CONF_DIR start mapred daemons $"$bin"/start-mapred.sh --config $HADOOP_CONF_DIR
如果成功,打开 http://T:50070 (T为集群master节点),可以看到HDFS的运行情况,包括节点数量、空间大小等。这是Hadoop自带的HDFS监控页面;同样的,http://T:50030 是Mapreduce的监控界面。
如果没有成功,根据$HADOOP_HOME/logs目录下的日志文件信息debug。
3.常见问题
$/$HADOOP_HOME/bin/hadoop dfsadmin -safemode leave
初体验
最简单的尝试就是使用Hadoop自带的wordcount程序了,参照这篇文章,描述很详细。
其他的一些尝试: 动态增删节点 、 修改备份数量
参考
offical document: Cluster Setup
PS:欢迎访问新博客地址,这里有支持markdown的排版;) 点击打开链接