|
hadoop0 |
hadoop1 |
hadoop2 |
hadoop3 |
是NameNode吗? |
是,属集群cluster1 |
是,属集群cluster1 |
是,属集群cluster2 |
是,属集群cluster2 |
是DataNode吗? |
否 |
是 |
是 |
是 |
是JournalNode吗? |
是 |
是 |
是 |
否 |
是ZooKeeper吗? |
是 |
是 |
是 |
否 |
是ZKFC吗? |
是 |
是 |
是 |
是 |
编译方法:见www.superwu.cn
在hadoop-2.2.0-src/hadoop-dist/target/ 下的hadoop-2.2.0
Cp -r hadoop-2.2.0 /usr/local
然后重命名 mv hadoop-2.2.0 hadoop
2的配置文件都在 hadoop/etc/hadoop下了。
要在3个节点上启动zookeeper 在zookeeper/bin/下 执行 zkServer.sh start
检查zookeeper是 zkServer.sh status
export JAVA_HOME=/usr/local/jdk
【这里的值指的是默认的HDFS路径。当有多个HDFS集群同时工作时,用户如果不写集群名称,那么默认使用哪个哪?在这里指定!该值来自于hdfs-site.xml中的配置。在节点hadoop0和hadoop1中使用cluster1,在节点hadoop2和hadoop3中使用cluster2】
【这里的路径默认是NameNode、DataNode、JournalNode等存放数据的公共目录。用户也可以自己单独指定这三类节点的目录。】
【这里是ZooKeeper集群的地址和端口。注意,数量一定是奇数,且不少于三个节点】
该文件只配置在hadoop0和hadoop1上。
【指定DataNode存储block的副本数量。默认值是3个,我们现在有4个DataNode,该值不大于4即可。】
【使用federation时,使用了2个HDFS集群。这里抽象出两个NameService实际上就是给这2个HDFS集群起了个别名。名字可以随便起,相互不重复即可】
【指定NameService是cluster1时的namenode有哪些,这里的值也是逻辑名称,名字随便起,相互不重复即可】
【指定hadoop0的RPC地址】
【指定hadoop0的http地址】
【指定hadoop1的RPC地址】
【指定hadoop1的http地址】
【指定cluster1的两个NameNode共享edits文件目录时,使用的JournalNode集群信息】
【指定cluster1是否启动自动故障恢复,即当NameNode出故障时,是否自动切换到另一台NameNode】
【指定cluster1出故障时,哪个实现类负责执行故障切换】
【指定NameService是cluster2时,两个NameNode是谁,这里是逻辑名称,不重复即可。以下配置与cluster1几乎全部相似,不再添加注释】
【指定JournalNode集群在对NameNode的目录进行共享时,自己存储数据的磁盘路径】
【一旦需要NameNode切换,使用ssh方式进行操作】
【如果使用ssh进行故障切换,使用ssh通信时用的密钥存储的位置】
hadoop1
hadoop2
hadoop2
Scp -rq hadoop hadoop1:/usr/local 还有hadoop2和hadoop3
fs.defaultFS的值改为hdfs://cluster2
把cluster1中关于journalnode的配置项删除,增加如下内容
在hadoop0、hadoop1、hadoop2上执行sbin/hadoop-daemon.sh start journalnode
在hadoop0、hadoop2上执行bin/hdfs zkfc -formatZK
bin/hdfs namenode -format
sbin/hadoop-daemon.sh start namenode
bin/hdfs namenode -bootstrapStandby
sbin/hadoop-daemon.sh start namenode
sbin/hadoop-daemon.sh start zkfc
我们的hadoop0、hadoop1有一个节点就会变为active状态。
格式化namenode在hadoop2上 hadoop下执行 /bin/hdfs namenode -format
就是执行1.4.3.3到1.4.3.5步内容,hadoop0的执行内容变成hadoop2的, hadoop1 的执行内容变成hadoop3的
(注:如果hadoop3的NameNode没有起来,就在hadoop目录下rm -rf logs/
再rm -rf tmp/,然后在格式化一下 bin/hdfs namenode -bootstrapStandby 然后 在启动 sbin/hadoop-daemon.sh start namenode)
在hadoop0上执行命令sbin/hadoop-daemons.sh start datanode
在hadoop0上 hadoop fs -put xxx / 是把文件上传到cluster1上了
要在hadoop0上上传数据到cluster2的话 就要 hadoop fs -put xxx hdfs://cluster2/xx
不写hdfs://cluster2就是默认上传到当前集群,或者写hdfs://hadoop2也能上传到cluster2
在hadoop2上上传文件是上传到cluster2了,因为hadoop2是属于cluster2
HA高可靠集群,就是如果hadoop0死了,比如kill -9 namenode杀掉hadoop0的namenode进程,那hadoop1就会从standby变成active,依然可以往hdfs里面读写数据。但是再次启动hadoop0 sbin/hadoop-daemon.sh start namenode 的时候,hadoop0就变成standby了。
在hadoop0的etc/hadoop下,如果mapred-site.xml是mapred-site.xml.template就要修改它的名字
【自定ResourceManager的地址,还是单点,这是隐患】
然后在hadoop0 上把这两个配置文件复制给其他节点
Scp etc/hadoop/mapred-site.xml etc/hadoop/yarn-site.xml hadoop1:/usr/local/hadoop/etc/hadoop/
在hadoop0上执行sbin/start-yarn.sh
启动了有一个ResourceManager进程
它的端口是 hadoop0:8088
跑个例子,hadoop2自身带的,在hadoop下执行
Bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar wordcount /hadoop /out
输入的数据就是/hadoop,输出到out