版权声明:本文为博主原创文章,未经博主允许不得转载。
目录-[-]
1 先决条件
2 实验环境搭建
21 准备工作
22 安装JDK
23下载创建用户
24 安装ssh和配置
摸索了一下发现网上关于2.5的都不怎么全面自己研究了一下
参照这两个帖子基本可以成功。
这个帖子比较全面不过是2.2的http://blog.csdn.NET/bluishglc/article/details/24591185
前期准备内容参照http://blog.csdn.Net/flyqwang/article/details/7244552/
1. 前期准备
1 先决条件
确保在你集群中的每个节点上都安装了所有必需软件:sun-JDK ,ssh,Hadoop
JavaTM
1.5.x,必须安装,建议选择Sun公司发行的Java版本。
ssh 必须安装并且保证 sshd一直运行,以便用Hadoop 脚本管理远端Hadoop守护进程。
2 实验环境搭建
2.1 准备工作
操作系统:Ubuntu 部署:Vmvare 在vmvare安装好一台Ubuntu虚拟机后,可以导出或者克隆出另外两台虚拟机。
先修改主机名方便识别/etc/hostname"文件修改其中"HOSTNAME"
如master机将HOSTNAME改为master
slave1机改为slave1依次类推 说明: 保证虚拟机的ip和主机的ip在同一个ip段,这样几个虚拟机和主机之间可以相互通信。 为了保证虚拟机的ip和主机的ip在同一个ip段,虚拟机连接设置为桥连。
IP设置成固定IP
准备机器:一台master,若干台slave,配置每台机器的/etc/hosts保证各台机器之间通过机器名可以互访,例如:
192.168.0.199 master(node1) 192.168.0.200 slave1(node2) 192.168.0.201 slave2(node3) 主机信息:
机器名 | IP地址 | 作用 |
---|---|---|
Node1 | 192.168.0.199 | NameNode、JobTracker |
Node2 | 192.168.0.200 | DataNode、TaskTracker |
Node3 | 192.168.0.201 | DataNode、TaskTracker |
为保证环境一致先安装好JDK和ssh:
2.2 安装JDK
安装JDK$ sudo apt-get install sun-java6-jdk1.2.3 这个安装,java执行文件自动添加到/usr/bin/目录。验证 shell命令 :java -version 看是否与你的版本号一致。
2.3下载、创建用户
$ useradd hadoop$ cd /home/hadoop
在所有的机器上都建立相同的目录,也可以就建立相同的用户,最好是以该用户的home路径来做hadoop的安装路径。例如在所有的机器上的安装路径都是:/home/hadoop/hadoop,这个不需要mkdir,在/home/hadoop/下解压hadoop包的时候,会自动生成)(当然可以安装/usr/local/目录下,例如/usr/local/hadoop/ chown -R hadoop /usr/local/hadoop/ chgrp -R hadoop /usr/local/hadoop/)(最好不要使用root安装,因为不推荐各个机器之间使用root访问 )
2.4 安装ssh和配置
1) 安装:sudo apt-get install ssh
这个安装完后,可以直接使用ssh命令 了。 执行$ netstat -nat 查看22端口是否开启了。 测试:ssh localhost。 输入当前用户的密码,回车就ok了。说明安装成功,同时ssh登录需要密码。 (这种默认安装方式完后,默认配置文件是在/etc/ssh/目录下。sshd配置文件是:/etc/ssh/sshd_config):
注意:在所有机子都需要安装ssh。
2) 配置:
在Hadoop启动以后,Namenode是通过SSH(Secure Shell)来启动和停止各个datanode上的各种守护进程的,这就须要在节点之间执行指令的时候是不须要输入密码的形式,故我们须要配置SSH运用无密码公钥认证的形式。以本文中的三台机器为例,现在node1是主节点,他须要连接node2和node3。须要确定每台机器上都安装了ssh,并且datanode机器上sshd服务已经启动。
( 说明:hadoop@hadoop~]$ssh-keygen -t rsa这个命令将为hadoop上的用户hadoop生成其密钥对,询问其保存路径时直接回车采用默认路径,当提示要为生成的密钥输入passphrase的时候,直接回车,也就是将其设定为空密码。生成的密钥对id_rsa,id_rsa.pub,默认存储在/home/hadoop/.ssh目录下然后将id_rsa.pub的内容复制到每个机器(也包括本机)的/home/hadoop/.ssh/authorized_keys文件中,如果机器上已经有authorized_keys这个文件了,就在文件末尾加上id_rsa.pub中的内容,如果没有authorized_keys这个文件,直接复制过去就行.)
3) 首先设置namenode的ssh为无需密码的、自动登录。
切换到hadoop用户( 保证用户hadoop可以无需密码登录,因为我们后面安装的hadoop属主是hadoop用户。)
$ su hadoop
cd /home/hadoop
$ ssh-keygen -t rsa
然后一直按回车完成后,在home跟目录下会产生隐藏文件夹.ssh
$ cd .ssh
#之后ls 查看文件
cp id_rsa.pub authorized_keys
测试:
$ssh localhost
或者:
$ ssh master
第一次ssh会有提示信息:
The authenticity of host ‘master (10.64.56.76)’ can’t be established.RSA key fingerprint is 03:e0:30:cb:6e:13:a8:70:c9:7e:cf:ff:33:2a:67:30.Are you sure you want to continue connecting (yes/no)?
输入 yes 来继续。这会把该服务器添加到你的已知主机的列表中
发现链接成功,并且无需密码。
4 ) 复制authorized_keys到node2 和node3 上
为了保证node1可以无需密码自动登录到node2和node3,先在node2和node3上执行****
$ su hadoop
cd /home/hadoop
$ ssh-keygen -t rsa
一路按回车.然后回到node1,复制authorized_keys到node2 和node3 [hadoop@hadoop .ssh]$ scp authorized_keys slave1:/home/hadoop/.ssh/
[hadoop@hadoop .ssh]$ scp authorized_keys slave2:/home/hadoop/.ssh/
这里会提示输入密码,输入hadoop账号密码就可以了。改动你的 authorized_keys 文件的许可权限[hadoop@hadoop .ssh]$chmod 644 authorized_keys
测试:ssh node2或者ssh node3(第一次需要输入yes)。如果不须要输入密码则配置成功,如果还须要请检查上面的配置能不能正确。
还不好使删除用户重试或者参考这个帖子
http://blog.csdn.net/joe_007/article/details/8298814
之后的内容参照2.2版的就可以
2. 安装与配置
2.1 安装前的准备
先关闭防火墙
sudo ufw disable
在安装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/s****bin/.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目录下若干其他文件混杂在一起。
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
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
启动之后,访问:
检查HDFS各结点情况,如都能访问表示HDFS已无问题,如无法访问或缺少节点,可分析log的中的信息找出问题原因。
3.4 启动yarn
执行:start-yarn.sh
该命令可以任意结点上执行。其slaves结点与hdfs一样,读取的也是${HADOOP_HOME}/etc/hadoop/slaves文件。
以下单独启动某项服务的命令:启动resourcemanageryarn-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也是如此!