共计 9943 个字符,预计需要花费 25 分钟才能阅读完成。
本文将基于 Hadoop 2.2.0 讲解其在 Linux 集群上的安装方法,并对一些重要的设置项进行解释
相关阅读:
Ubuntu 13.04 上搭建 Hadoop 环境 http://www.linuxidc.com/Linux/2013-06/86106.htm
Ubuntu 12.10 +Hadoop 1.2.1 版本集群配置 http://www.linuxidc.com/Linux/2013-09/90600.htm
Ubuntu 上搭建 Hadoop 环境(单机模式 + 伪分布模式)http://www.linuxidc.com/Linux/2013-01/77681.htm
Ubuntu 下 Hadoop 环境的配置 http://www.linuxidc.com/Linux/2012-11/74539.htm
单机版搭建 Hadoop 环境图文教程详解 http://www.linuxidc.com/Linux/2012-02/53927.htm
搭建 Hadoop 环境(在 Winodws 环境下用虚拟机虚拟两个 Ubuntu 系统进行搭建)http://www.linuxidc.com/Linux/2011-12/48894.htm
1. 网络设置
禁用防火墙
service iptables stop
禁用 IPv6
打开 /etc/modprobe.d/dist.conf,添加:
alias net-pf-10 off
alias ipv6 off
重新系统之后,可以通过命令:
lsmod|grep ipv6
查看 ipv6 模块是否已经不再加载
2. 安装与配置
2.1 安装前的准备
在安装 hadoop 前需要安装 ssh,配置各节点间的基于密钥的免密码登录,安装 jdk1.7 并配置 JAVA_HOME,关于这些操作请参考其他文档,本文不做赘述,只给出 /etc/profile 中关于 JAVA_HOME 和 HADOOP_HOME 的配置参考:
JAVA_HOME=/usr/java/jdk1.7.0_51
HADOOP_HOME=/usr/local/hadoop
PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export JAVA_HOME HADOOP_HOME PATH
注:为了方便起见,我们将 $HADOOP_HOME/sbin 也加入到了 PATH 中, 同时为了在输入命令时避免同名 cmd 文件的干扰,可以使用 rm -f $HADOOP_HOME/bin/*.cmd;rm -f $HADOOP_HOME/sbin/*.cmd; 删除 cmd 文件。
2.2 配置必要的环境变量
本文安装基于这样一个约定或者说偏好:安装程序位于 /usr/local(或者 /opt), 生成的文件和相关数据文件集中放置于 /var/hadoop, 将发行包解压至 /usr/local(或者 /opt)后,分别编辑 ${HADOOP_HOME}/etc/hadoop/hadoop-env.sh 和 ${HADOOP_HOME}/etc/hadoop/yarn-env.sh,在两个文件中找到并修改或者是添加下列环境变量:
export JAVA_HOME=/your/java/home
export HADOOP_LOG_DIR=/var/hadoop/logs
export HADOOP_COMMON_LIB_NATIVE_DIR=${HADOOP_PREFIX}/lib/native
export HADOOP_OPTS=”-Djava.library.path=$HADOOP_PREFIX/lib”
上述环境变量的配置都不是必须的,对于第一项配置原文件的写法是 export JAVA_HOME=${JAVA_HOME},但在集群环境下启动时可能会报 JAVA_HOME is not set and could not be found 错误,从该项的注释上我们了解到,在集群环境下即使各结点都正确地配置了 JAVA_HOME,这里最好还是显示地重新声明一遍 JAVA_HOME. 第二项配置是指定 log 的存放目录,默认位置是安装目录下的 logs 文件夹,按前文约定,本次安装将 log 文件置于 /var/hadoop/logs 下。对第三项和第四顶配置要视情况添加,如果出现 4.2 节所描述的问题则这两项是必须的!
2.3 配置 ${HADOOP_HOME}/etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://YOUR-NAMENODE:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/var/hadoop</value>
</property>
</configuration>
core-site.xml 的各项默认配置可参考:http://hadoop.apache.org/docs/r2.2.0/hadoop-project-dist/hadoop-common/core-default.xml
对于一个新集群来说,唯一必须修改的项是:fs.defaultFS,该项指明了文件系统的访问入口,实际上是告知所有的 datanode 它们的 namenode 是哪一个从而建立起 namenode 与各 datanode 之间的通信。
除此之外,按照前文约定,我们把 hadoop.tmp.dir 设置为 /var/hadoop。观察 core-default.xml 我们可以发现,在所有涉及目录的配置项上,默认都是在 ${hadoop.tmp.dir}之下建立子文件夹,所以本次安装我们只简单地将 hadoop.tmp.dir 的原默认值 /tmp/hadoop-${user.name}改为 /var/hadoop,将所有 hadoop 生成和使用的文件集中 /var/hadoop 下,避免与 /tmp 目录下若干其他文件混杂在一起。
更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2014-04/100934p2.htm
2.4 配置 ${Hadoop_HOME}/etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>YOUR-SECONDARY-NAMENODE:50090</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
hdfs-site.xml 的各项默认配置可参考:http://hadoop.apache.org/docs/r2.2.0/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml 对于一个新集群来说这个文件没没有必须修改的项,但是有几个重要的配置项是可能需要修改的,主要是如下几项:
- dfs.namenode.secondary.http-address // 指定 secondary namenode 结点,若不指定,在使用 start-dfs.sh 启动时,当前节点将自动成为 secondary namenode
- dfs.replication // 每一个 block 的复制份数,默认是 3,如果集群 datanode 结点数量小于 3 应将该值设置小于或等于 datanode 的结点数量
- dfs.namenode.name.dir // 存放 namenode 相关数据的文件夹
- dfs.datanode.data.dir // 存放 datanade 相关数据的文件夹
- dfs.namenode.checkpoint.dir // 存放 secondary namenode 相关数据的文件夹
对于后三项来说,它们的默认值也都是在 ${hadoop.tmp.dir}之下的子文件夹,你可以根据集群的实际情况修改这三个值。比如:把它们改到一个挂载到 NFS 上的文件夹。
2.5 配置 ${HADOOP_HOME}/etc/hadoop/mapred-site.xml
在 ${HADOOP_HOME}/etc/hadoop 下拷贝一份 mapred-site.xml.template 命名为 mapred-site.xml,添加如下内容:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
mapred-site.xml 的各项默认配置可参考:hadoop.apache.org/docs/r2.2.0/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml 该文件唯一一个必须要修改的项是 mapreduce.framework.name,该项告诉 hadoop 使用何种框架执行 map-reduce 任务。
另外该文件也有几个设及文件存放位置的配置项:
- mapreduce.cluster.local.dir
- mapreduce.jobtracker.system.dir
- mapreduce.jobtracker.staging.root.dir
- mapreduce.cluster.temp.dir
如有必要也应该做适当修改。
2.6 配置 ${HADOOP_HOME}/etc/hadoop/yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>YOUR-RESOURCE-MANAGER</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
yarn-site.xml 的各项默认配置可参考:http://hadoop.apache.org/docs/r2.2.0/hadoop-yarn/hadoop-yarn-common/yarn-default.xml 该文件必须修改的项有两个,基中 yarn.resourcemanager.hostname 项与 core-site.xml 的 fs.defaultFS 项类似,该项为所有的 nodemanager 指明了 resourcemanager,建立起 resourcemanager 与各 nodemanager 之间的通信。
另外该文件也有几个设及文件存放位置的配置项:
- yarn.nodemanager.local-dirs
- yarn.resourcemanager.fs.state-store.uri
如有必要也应该做适当修改。
2.7 配置 slave 结点列表
通常情况我们使用 start-dfs.sh 脚本来启动整个集群,查看该脚本可以知道,该脚本会基于配置文件在目标结点上启动 namenode,secondary namenode, 和 slave(datanode)结点,slave(datanode)的列表是在 ${HADOOP_HOME}/etc/hadoop/slaves 文件中配置的,一个结点一行。所以我们需要在此文件中添加所有的 datanode 机器名或 IP
2.8 将上述配置的 hadoop 安装程序重新打包复制到所有结点的对应位置再展开,同时记得修改每个结点的 /etc/profile
本文将基于 Hadoop 2.2.0 讲解其在 Linux 集群上的安装方法,并对一些重要的设置项进行解释
相关阅读:
Ubuntu 13.04 上搭建 Hadoop 环境 http://www.linuxidc.com/Linux/2013-06/86106.htm
Ubuntu 12.10 +Hadoop 1.2.1 版本集群配置 http://www.linuxidc.com/Linux/2013-09/90600.htm
Ubuntu 上搭建 Hadoop 环境(单机模式 + 伪分布模式)http://www.linuxidc.com/Linux/2013-01/77681.htm
Ubuntu 下 Hadoop 环境的配置 http://www.linuxidc.com/Linux/2012-11/74539.htm
单机版搭建 Hadoop 环境图文教程详解 http://www.linuxidc.com/Linux/2012-02/53927.htm
搭建 Hadoop 环境(在 Winodws 环境下用虚拟机虚拟两个 Ubuntu 系统进行搭建)http://www.linuxidc.com/Linux/2011-12/48894.htm
1. 网络设置
禁用防火墙
service iptables stop
禁用 IPv6
打开 /etc/modprobe.d/dist.conf,添加:
alias net-pf-10 off
alias ipv6 off
重新系统之后,可以通过命令:
lsmod|grep ipv6
查看 ipv6 模块是否已经不再加载
2. 安装与配置
2.1 安装前的准备
在安装 hadoop 前需要安装 ssh,配置各节点间的基于密钥的免密码登录,安装 jdk1.7 并配置 JAVA_HOME,关于这些操作请参考其他文档,本文不做赘述,只给出 /etc/profile 中关于 JAVA_HOME 和 HADOOP_HOME 的配置参考:
JAVA_HOME=/usr/java/jdk1.7.0_51
HADOOP_HOME=/usr/local/hadoop
PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export JAVA_HOME HADOOP_HOME PATH
注:为了方便起见,我们将 $HADOOP_HOME/sbin 也加入到了 PATH 中, 同时为了在输入命令时避免同名 cmd 文件的干扰,可以使用 rm -f $HADOOP_HOME/bin/*.cmd;rm -f $HADOOP_HOME/sbin/*.cmd; 删除 cmd 文件。
2.2 配置必要的环境变量
本文安装基于这样一个约定或者说偏好:安装程序位于 /usr/local(或者 /opt), 生成的文件和相关数据文件集中放置于 /var/hadoop, 将发行包解压至 /usr/local(或者 /opt)后,分别编辑 ${HADOOP_HOME}/etc/hadoop/hadoop-env.sh 和 ${HADOOP_HOME}/etc/hadoop/yarn-env.sh,在两个文件中找到并修改或者是添加下列环境变量:
export JAVA_HOME=/your/java/home
export HADOOP_LOG_DIR=/var/hadoop/logs
export HADOOP_COMMON_LIB_NATIVE_DIR=${HADOOP_PREFIX}/lib/native
export HADOOP_OPTS=”-Djava.library.path=$HADOOP_PREFIX/lib”
上述环境变量的配置都不是必须的,对于第一项配置原文件的写法是 export JAVA_HOME=${JAVA_HOME},但在集群环境下启动时可能会报 JAVA_HOME is not set and could not be found 错误,从该项的注释上我们了解到,在集群环境下即使各结点都正确地配置了 JAVA_HOME,这里最好还是显示地重新声明一遍 JAVA_HOME. 第二项配置是指定 log 的存放目录,默认位置是安装目录下的 logs 文件夹,按前文约定,本次安装将 log 文件置于 /var/hadoop/logs 下。对第三项和第四顶配置要视情况添加,如果出现 4.2 节所描述的问题则这两项是必须的!
2.3 配置 ${HADOOP_HOME}/etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://YOUR-NAMENODE:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/var/hadoop</value>
</property>
</configuration>
core-site.xml 的各项默认配置可参考:http://hadoop.apache.org/docs/r2.2.0/hadoop-project-dist/hadoop-common/core-default.xml
对于一个新集群来说,唯一必须修改的项是:fs.defaultFS,该项指明了文件系统的访问入口,实际上是告知所有的 datanode 它们的 namenode 是哪一个从而建立起 namenode 与各 datanode 之间的通信。
除此之外,按照前文约定,我们把 hadoop.tmp.dir 设置为 /var/hadoop。观察 core-default.xml 我们可以发现,在所有涉及目录的配置项上,默认都是在 ${hadoop.tmp.dir}之下建立子文件夹,所以本次安装我们只简单地将 hadoop.tmp.dir 的原默认值 /tmp/hadoop-${user.name}改为 /var/hadoop,将所有 hadoop 生成和使用的文件集中 /var/hadoop 下,避免与 /tmp 目录下若干其他文件混杂在一起。
更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2014-04/100934p2.htm
3. 启动
3.1 关于账户设置
在正式的部署环境上,我们推荐设置专有账户来运行 Hadoop,例如:创建用户 hdfs 用户来启动 namenode 和 datanode,创建 yarn 用户来启动 resourcemanager 和 nodemanager. 至于这些用户的用户组可以是同名用户组(这与 CDH 的做法一致的),也可以使用一个统一的用户组,如 hadoop 之类,这取决于你自己的喜好,但本质上这些用户彼此之间并没有必然的联系,让它们从属于同一个用户组并没有什么特殊的意味,所以我喜欢让每一个用户独立于自己的用户组。
需要特别提醒的是:如果配置专用账户启动 hadoop 相关服务需要将 hadoop 所使用的各种文件夹 (例如:dfs.namenode.name.dir 等等) 的 owner 和 owner group 改为专有用户,否则会导致专有用户因为没有足够的权限访问这些文件夹而导致服务启动失败。由于配置这些文件夹的 owner 和 owner group 相当繁琐,且启停这些服务时都需要切换至对应用户,对于日常开发来说是很不便的,所以如果你搭建的是本地开发环境可以简单地使用 root 帐号来启动 hadoop.
3.2 格式化集群
初启动前,需要首先格式化集群,执行命令:
hadoop namenode -format
3.3 启动 hdfs
执行:
start-dfs.sh
该命令可以任意结点上执行。不过需要注意的是如果配置文件中没有指明 secondary namenode(即在 hdfs-site.xml 中没有配置 dfs.namenode.secondary.http-address), 那么在哪个结点上执行该命令,该点将自动成为 secondary namenode.
以下单独启动某项服务的命令:
启动 namenode
hadoop-daemon.sh start namenode
启动 secondarynamenode
hadoop-daemon.sh start secondarynamenode
启动 datanode
hadoop-daemon.sh start datanode
启动之后,访问:
http://YOUR-NAMENODE:50070
检查 HDFS 各结点情况,如都能访问表示 HDFS 已无问题,如无法访问或缺少节点,可分析 log 的中的信息找出问题原因。
3.4 启动 yarn
执行:
start-yarn.sh
该命令可以任意结点上执行。其 slaves 结点与 hdfs 一样,读取的也是 ${HADOOP_HOME}/etc/hadoop/slaves 文件。
以下单独启动某项服务的命令:
启动 resourcemanager
yarn-daemon.sh start resourcemanager
启动 nodemanager
yarn-daemon.sh start nodemanager
启动之后,访问:
http://YOUR-RESOURCE-MANAGER:8088
检查 YARN 各结点情况,如都能访问表示 YARN 无问题,如无法访问或缺少节点,可分析 log 的中的信息找出问题原因。
4. 常见错误
4.1:Problem connecting to server: xxxx:9000
在确认关闭了 ipv6 和防火墙之后,在 namenode 上使用
netstat -ntlp|grep 9000
检查 namenode 服务端口的分配(特别是 local address 和 foreign address),确定是否存在配置上的问题,如有没有正确配置 /etc/hosts
4.2:libhadoop.so.1.0.0 which might have disabled stack guard
在使用./sbin/start-dfs.sh 或./sbin/start-all.sh 启动时会报出这样如下警告:
Java HotSpot(TM) 64-Bit Server VM warning: You have loaded library /usr/local/hadoop-2.2.0/lib/native/libhadoop.so.1.0.0 which might have disabled stack guard. The VM will try to fix the stack guard now.
….
Java: ssh: Could not resolve hostname Java: Name or service not known
HotSpot(TM): ssh: Could not resolve hostname HotSpot(TM): Name or service not known
64-Bit: ssh: Could not resolve hostname 64-Bit: Name or service not known
….
这个问题的错误原因会发生在 64 位的操作系统上,原因是从官方下载的 hadoop 使用的本地库文件 (例如 lib/native/libhadoop.so.1.0.0) 都是基于 32 位编译的,运行在 64 位系统上就会出现上述错误。解决方法之一是在 64 位系统上重新编译 hadoop,另一种方法是在 hadoop-env.sh 和 yarn-env.sh 中添加如下两行:
export HADOOP_COMMON_LIB_NATIVE_DIR=${HADOOP_PREFIX}/lib/native
export HADOOP_OPTS=”-Djava.library.path=$HADOOP_PREFIX/lib”
4.3:Error: JAVA_HOME is not set and could not be found.
虽然你已经在各个节点上正确的配置了 JAVA_HOME,但是启动时还是可能会报出上述错误,从 etc/hadoop/hadoop-env.sh 文件关于第一行配置:export JAVA_HOME=${JAVA_HOME}的注释上来看,对于一个分布式集群,这里 JAVA_HOME 最好显式地指明而不要使用默认的 ${JAVA_HOME}。对于 etc/hadoop/yarn-env.sh 也是如此!
更多 Hadoop 相关信息见Hadoop 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=13