这里使用7台机器安装分布式
前奏
1.创建一台虚拟机
2.配置静态Ip
3.安装jdk,配置环境变量
卸载之前的jdk 查看:rpm -qa | gerp java ;卸载: rpm -e 包名
环境变量:
export JAVA_HOME=/app/jdk1.7.0_67
export PATH=
JAVAHOME/bin:
J
A
V
A
H
O
M
E
/
b
i
n
:
PATH
export CLASSPATH=.:
JAVAHOME/lib/dt.jar:
J
A
V
A
H
O
M
E
/
l
i
b
/
d
t
.
j
a
r
:
JAVA_HOME/lib/tools.jar
4. 关闭防火墙
5.克隆多台机器
6.修改各个机器的主机名:/etc/sysconfig/network,注:这里因为是克隆出来的机器,所以配置静态ip会出问题,参看解决办法。
7.在一台机器上修改ip和主机名映射关系:/etc/hosts文件
8.远程拷贝hosts文件到其他别的机器上:scp -r /etc/hosts root@xxx:/etc/hosts
9.设置免密码登录
a.生成lx1的公钥和密钥:在lx1上执行,ssh-keygen -t rsa
b.把lx1的公钥追加到另外7台机器的authorized_keys文件中
ssh-copy-id lx1
….
ssh-copy-id lx7
c.和b步骤一样,设置另外六台机器到其他机器上的免密码登录
其实,不用全部都拷贝,原则如下:
①.启动hdfs的时候,是通过lx1上执行start-dfs,sh
会启动几个机器:
lx1上的namenode
lx2上的namenode
lx5,lx6,lx7上的datanode
这个启动方式是ssh远程启动,所以需要配置lx1到lx1,lx2,lx5,lx6,lx7上的免登陆。
②.启动yarn的时候,是在lx3和lx4上分别本地启动,
在启动lx3的时候会同时远程启动lx5,lx6,lx7上的nodemanager
所以,需要配置lx3到lx5,lx6,lx7上的免登陆
服务器规划
lx1 namenode zkfc
lx2 namenode zkfc
lx3 resourcemanager
lx4 resourcemanager
lx5 datanode nodemanager journalnode zookeeper
lx6 datanode nodemanager journalnode zookeeper
lx7 datanode nodemanager journalnode zookeeper
或者我们可以根据进程进行划分:
namenode: lx1,lx2
因为zkfc是用来监控namenode的,所以zkfc也放在lx1和lx2
resourcemanager:lx3,lx4
datanode:lx5,lx6,lx7
对于nodemanager,是yarn的小弟,用来处理mr任务的,为了达到就近取资源的效果,一般和datanode部署在一起
zookeeper:lx5,lx6,lx7
journalnode和zkfc都是依赖zookeeper的,理论上讲,应该放在另外的服务器上,这里机器限制,和datanode放在一起
jounlnode:lx5,lx6,lx7. 轻量级进程,没必要单独使用服务器,所以可以随意挑选机器就可以了,这里随便选出三台。
安装Hadoop
①.解压hadoop
②.配置hadoop环境变量
修改/etc/profile
内容:
export HADOOP_HOME=/app/hadoop-2.8.0
export PATH=
HADOOPHOME/bin:
H
A
D
O
O
P
H
O
M
E
/
b
i
n
:
HADOOP_HOME/sbin:
JAVAHOME/bin:
J
A
V
A
H
O
M
E
/
b
i
n
:
PATH
③.修改配置文件
a. 修改 hadoop_env.sh
export JAVA_HOME=/app/jdk1.7.0_67
b.修改 core-site.xml
fs.defaultFS
hdfs://ns1
hadoop.tmp.dir
/program/hadoop-2.6.0/tmp
ha.zookeeper.quorum
hadoop5:2181,hadoop6:2181,hadoop7:2181
c. 修改hdfs-site.xml
dfs.nameservices
ns1
dfs.ha.namenodes.ns1
nn1,nn2
dfs.namenode.rpc-address.ns1.nn1
hadoop1:9000
dfs.namenode.http-address.ns1.nn1
hadoop1:50070
dfs.namenode.rpc-address.ns1.nn2
hadoop2:9000
dfs.namenode.http-address.ns1.nn2
hadoop2:50070
dfs.namenode.shared.edits.dir
qjournal://hadoop5:8485;hadoop6:8485;hadoop7:8485/ns1
dfs.journalnode.edits.dir
/devesoft/hadoop-2.6.0/journaldata
dfs.ha.automatic-failover.enabled
true
dfs.client.failover.proxy.provider.ns1
org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider实现方式
dfs.ha.fencing.methods
sshfence
shell(/bin/true)
dfs.ha.fencing.ssh.private-key-files
/root/.ssh/id_rsa
dfs.ha.fencing.ssh.connect-timeout
30000
d. 修改mapred-site.xml,需要使用mapred-site.xml.template改名
mapreduce.framework.name
yarn
e. 修改yarn-site.xml
yarn.resourcemanager.ha.enabled
true
yarn.resourcemanager.cluster-id
1602b
yarn.resourcemanager.ha.rm-ids
rm1,rm2
yarn.resourcemanager.hostname.rm1
hadoop3
yarn.resourcemanager.hostname.rm2
hadoop4
yarn.resourcemanager.zk-address
hadoop5:2181,hadoop6:2181,hadoop7:2181
yarn.nodemanager.aux-services
mapreduce_shuffle
f.修改slaves文件
slaves是指定子节点的位置,因为要在lx1上启动HDFS、在lx3启动yarn,所以lx1上的slaves文件指定的是datanode的位置,lx3上的slaves文件指定的是nodemanager的位置
内容如下:
slave05
slave06
slave07
注意:一般情况下,DN和NM都是用了相同的机器,如果不是的话,请在拷贝了hadoop的jar包之后,重新修改lx3上的slaves文件
④.使用scp拷贝hadoop到其他6台机器,
这里直接拷贝app目录,把jdk和hadoop都拷贝了
为了省事,可以拷贝配置文件/etc/profiles
安装ZooKeeper
①.在lx5上解压zookeeper,
②.修改配置文件zoo.cfg(使用zoo-example.cfg修改得到)
③.去data里面创建myid,里面写入自己的id 1
④.配置环境变量,
⑤.复制zookeeper到lx6,lx7,当然可以把/etc/profile再复制一遍,然后注意修改lx6,lx7上的myid内容
启动
注意:一定要严格按照顺序启动
①.启动zookeeper
分别在lx5,lx6,lx7上分别执行命令:zkServer.sh start
验证:执行zkServer.sh status,如果能看到下面的界面,证明zookeeper启动了,
使用jps,能够看到QuorumPeerMain进
②.启动journalnode【2.8版本不需要自己手动启动,启动hdfs的时候会自动启动】
分别在lx5,lx6,lx7上分别执行命令:hadoop-daemon.sh start journalnode
验证:使用jps查看到JournalNode进程就可以了
③.格式化HDFS(注意,格式化HDFS之前,必须启动journalnode)
在lx1上执行命令:hdfs namenode -format
然后,scp把tmp拷贝到lx2的hadoop里面,这样才能保证两个NN都有
④.格式化ZKFC
在lx1上执行hdfs zkfc -formatZK就可以了
⑤.启动hdfs
在lx1上执行start-dfs.sh
⑥.启动yarn
在lx3上执行start-yarn.sh在lx4上执行yarn-daemon.sh start resourcemanager(这个需要手动启动)
注意事项:
如果多次格式化,那么格式化之前,必须把所有的机器上的/tmp文件都删除掉,否则datanode上会保存一个之前的namespaceID,不一致,导致datanode启动不了
可以执行hadoop-daemon.sh start namenode来单独启动namenode
可以执行hadoop-daemon.sh start datanode来单独启动datanode
测试与验证
①.查看各个机器上的进程,需要是下面这个样子
lx1
lx2
lx3
lx4
lx5
lx6
lx7
②.查看网页
分别查看lx1和lx2的namenode的状态
lx1
lx2
③.验证hdfs
上传一个文件,结果如下
④.验证mr
执行一个mr任务看能否成功,比喻计算PI ,在运行的时候去nodemanager上执行jps查看进程(lx5,lx6,lx7)
如果发现下面的错误:
This token is expired. current time is 1497735640102 found 1497517037948
Note: System times on machines may be out of sync. Check system time and time zones.
解决办法是:向所有的XShell窗口发送下面的命令:
date -s “2012-11-03 10:25:25”
⑤.验证hdfs的ha
a.在lx1上杀死namenode进程,
再查看lx2的网页
效果如下:
再次启动lx1上的namenode后,发现是standby了
b.关闭active namenode所在的机器,查看,发现也自动切换了
注意:即便正在上传文件的时候,lx1挂掉了,一样可以继续工作,很强大。
⑥.验证RM的HA
杀死lx3上的RM进程,
再执行一个Mr任务,发现结果如下
……
发现还是完成了MR任务,
注意:MR的HA,如果任务执行一般的时候,lx3挂掉,任务会失败。没有hdfs的ha强大。