此步骤是 U盘给Linux上挂载显示,如无此需求请忽略此步。java
... Device Boot Start End Blocks Id System /dev/sdb1 * 1 2668 128016 6 FAT16
# 先建立一个挂载目录 $ mkdir /mnt/usb # 若是是U盘文件格式为 fat32,就用命令: $ mount -t vfat /dev/sdb1 /mnt/usb # 若是是U盘文件格式为 ext2格式,就用命令: $ mount -t ext2 /dev/sda1 /mnt/usb # 若是是U盘文件格式为 ntfs,就用命令: # 先安装ntfs-3g: $ yum install ntfs-3g $ mount -t ntfs-3g /dev/sda1 /ntfs
$ df –lh
$ cd /mnt/usb
$ umount /mnt/usb
节点名称 | IP地址 | 安装服务 |
---|---|---|
hadoop001 | 192.168.0.10 | NameNode、DFSZKFailoverController(ZKFC) |
hadoop002 | 192.168.0.11 | DataNode、NodeManager、JournalNode、QuorumPeerMain、ZooKeeper |
hadoop003 | 192.168.0.12 | DataNode、NodeManager、JournalNode、QuorumPeerMain、ZooKeeper |
hadoop004 | 192.168.0.13 | ResourceManager |
hadoop005 | 192.168.0.14 | DataNode、NodeManager |
hadoop006 | 192.168.0.15 | DataNode、NodeManager |
hadoop007 | 192.168.0.16 | NameNode、DFSZKFailoverController(ZKFC) |
hadoop008 | 192.168.0.17 | DataNode、NodeManager、JournalNode 、QuorumPeerMain 、zookeeper --- JN用来同步两个NN之间的数据,standbay的NN至关于SNN |
hadoop009 | 192.168.0.18 | ResourceManager |
hadoop010 | 192.168.0.19 | DataNode、NodeManager |
hadoop011 | 192.168.0.20 | DataNode、NodeManager |
hadoop012 | 192.168.0.21 | DataNode、NodeManager |
关于为何没有secondarynamenode,由于standby状态的NameNode能够完成checkpoint操做,所以不必配置Secondary NameNode、CheckpointNode、BackupNode。若是真的配置了,还会报错。node
$ cd /hadoop/zookeeper-3.4.6/conf/ $ cp zoo_sample.cfg zoo.cfg $ vim zoo.cfg #修改如下内容长度 dataDir=/hadoop/zookeeper-3.4.6/tmp #在最后添加: server.1=hadoop104:2888:3888 server.2=hadoop105:2888:3888 server.3=hadoop106:2888:3888 #保存退出 注:2888是leader和follower通讯的端口,3888是投票用的端口
$ mkdir /hadoop/zookeeper-3.4.6/tmp
$ touch /hadoop/zookeeper-3.4.6/tmp/myid
#hadoop104机器: $ echo 1 > /hadoop/zookeeper-3.4.6/tmp/myid #hadoop105机器: $ echo 2 > /hadoop/zookeeper-3.4.6/tmp/myid #hadoop106机器: $ echo 3 > /hadoop/zookeeper-3.4.6/tmp/myid
2.1 配置$HADOOP_HOME/etc/hadoop目录下的配置文件 core-site.xmlapache
$ vim core-site.xml #全部设置的文件夹都要提早建好(很重要) #【这里的值指的是默认的HDFS路径。当有多个HDFS集群同时工做时,集群名称在这里指定!该值来自于hdfs-site.xml中的配置】 <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://myha</value> </property> #【这里的路径默认是NameNode、DataNode、JournalNode等存放数据的公共目录。用户也能够本身单独指定这三类节点的目录。】 <property> <name>hadoop.tmp.dir</name> <value>file:///home/hadoop/tmp</value> </property> #【io数据块大小】 <property> <name>io.file.buffer.size</name> <value>131072</value> </property> #【FSImage文件和EditsLog文件能够经过ID来互相关联。在参数dfs.namenode.name.dir设置的路径下,会保存FSImage文件和EditsLog文件,若是是QJM方式HA的话,EditsLog文件保存在参数dfs.journalnode.edits.dir设置的路径下。】 <property> <name>dfs.journalnode.edits.dir</name><value>/home/hadoop/journaldata</value> #注意,不要加file </property> #【这里是ZooKeeper集群的地址和端口。注意,数量必定是奇数,且很多于三个节点】 <property> <name>ha.zookeeper.quorum</name> <value>hadoop002:2181,hadoop003:2181,hadoop008:2181</value> </property> </configuration>
$ vim hdfs-site.xml #【指定DataNode存储block的副本数量。默认值是3个,咱们如今有4个DataNode,该值不大于4便可。】 <configuration> <property> <name>dfs.replication</name> <value>3</value> </property> #【使用federation时,HDFS集群别名。名字能够随便起,多个集群时相互不重复便可】 <property> <name>dfs.nameservices</name> <value>myha</value> </property> #【指定该集群的namenode的机器】 <property> <name>dfs.ha.namenodes.myha</name> <value>hadoop001,hadoop007</value> </property> #【指定hadoop100的RPC地址】 <property> <name>dfs.namenode.rpc-address.myha.hadoop001</name> <value>hadoop001:9000</value> </property> #【指定hadoop100的http地址】 <property> <name>dfs.namenode.http-address.cluster1.hadoop001</name> <value>hadoop001:50070</value> </property> #【指定hadoop101的RPC地址】 <property> <name>dfs.namenode.rpc-address.myha.hadoop101</name> <value>hadoop101:9000</value> </property> #【指定hadoop101的http地址】 <property> <name>dfs.namenode.http-address.myha.hadoop101</name> <value>hadoop101:50070</value> </property> #【指定该集群的两个NameNode共享edits文件目录时,使用的JournalNode集群信息】 <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://hadoop002:8485;hadoop003:8485;hadoop008:8485/myha</value> </property> #【指定该集群是否启动自动故障恢复,即当NameNode出故障时,是否自动切换到另外一台NameNode】 <property> <name>dfs.ha.automatic-failover.enabled.myha</name> <value>true</value> </property> #【指定该集群出故障时,哪一个实现类负责执行故障切换】 <property> <name>dfs.client.failover.proxy.provider.myha</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> #【一旦须要NameNode切换,使用ssh方式进行操做】 <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> </property> #【若是使用ssh进行故障切换,使用ssh通讯时用的密钥存储的位置】 <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>file:///root/.ssh/id_rsa</value> </property> #【connect-timeout链接超时】 <property> <name>dfs.ha.fencing.ssh.connect-timeout</name> <value>30000</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:///home/hadoop/tmp/dfs/name</value> </property> #【设置】 <property> <name>dfs.datanode.data.dir</name> <value>file:///home/hadoop/tmp/dfs/data</value> </property> </configuration>
$ vim mapred-site.xml <configuration> #【指定运行mapreduce的环境是yarn,与hadoop1大相径庭的地方】 <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
$ vim yarn-site.xml <configuration> #【启动HA高可用性】 <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> #【指定resourcemanager的名字,不能与zookeeper的命名相同】 <property> <name>yarn.resourcemanager.cluster-id</name> <value>yrc</value> </property> #【使用了2个resourcemanager,分别指定Resourcemanager的地址】 <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> #【自定ResourceManager1的地址】 <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>hadoop102</value> </property> #【自定ResourceManager2的地址】 <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>hadoop103</value> </property> #【制定Zookeeper机器】 <property> <name>yarn.resourcemanager.zk-address</name> <value>hadoop104:2181,hadoop105:2181,hadoop106:2181</value> </property> #【默认】 <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>
注:若是在启动的时候报bootstrap
#WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
能够在hadoop/etc/hadoop/log4j.properties 文件中添加vim
log4j.logger.org.apache.hadoop.util.NativeCodeLoader=ERRO
注意:
在 hadoop/etc/hadoop 下记得创建 slave 文件bash
1) 启动zookeeper集群(在主机名hadoop00二、hadoop00三、hadoop008上启动)app
$ cd cd /home/hadoop/apps/zookeeper/ $ bin/zkServer.sh start (逐个启动) #查看状态:一个leader,两个follower bin//zkServer.sh status
$ cd $HADOOP_HOME $ sbin/hadoop-daemon.sh start journalnode
3) 验证ssh
$ jps #显示JouralNode + QuorumpeerMain
$ hdfs namenode -format
$ hdfs zkfc -formatZK
6) NameNode从hadoop001同步到hadoop007
1.在hadoop007执行 hdfs namenode bootstrapstandby
2.验证 tmp下生成dfs
3.若是1失败(在hadoop001执行) ide
ssh-keygen -f "~/.ssh/known_hosts" -R hadoop007
4.验证 tmp下生成dfs
5.或者直接拷贝 tmp 目录到 hadoop007oop
$ start-dfs.sh #验证 jps
8) 启动yarn(在hadoop004执行)
$ start-yarn.sh #验证: jps #显示ResourceManager + NodeManager
$ hadoop-daemon.sh start zkfc #验证 jps #显示DFSZKFailoverController
两台nomenode在 start-all.sh的时候,50070都是现实standby,在启动zkfc的时候 nn1 显示为active
Hadoop使用的是log4j记录日志,咱们理所固然会想到去修改${HADOOP_HOME}/etc/hadoop/log4j.properties,可是改完重启,你会发现然并卵!!!
尼玛,这是为啥,认真看了下log4j.properties的配置说明,发现一个关键点:
# Define some default values that can be overridden by system properties hadoop.root.logger=WARN,console
意思就是说,这里的配置会被系统属性覆盖!
因而乎,查了下可能会设置系统属性的脚本,发现须要修改如下2个文件,才能把默认的日志级别改掉(我这里只改的HDFS的,Yarn的自行参考便可):
第一处是${HADOOP_HOME}/etc/hadoop/hadoop-env.sh,把INFO改成WARN便可:
# Command specific options appended to HADOOP_OPTS when specifiedexport HADOOP_NAMENODE_OPTS="-Xmx30720m -Dhadoop.security.logger=${HADOOP_SECURITY_LOGGER:-WARN,RFAS} -Dhdfs.audit.logger=${HDFS_AUDIT_LOGGER:-WARN,NullAppender} $HADOOP_NAMENODE_OPTS"
还有一处藏的比较深,是启动脚本${HADOOP_HOME}/sbin/hadoop-daemon.sh,也须要这样改一下:
export HADOOP_ROOT_LOGGER=${HADOOP_ROOT_LOGGER:-"WARN,RFA"}
最后在重启下NameNode就能够了。
线上配合Zookeeper作了HA,因此能够平滑重启,直接使用如下命令先重启standby的NameNode,在将standby切换为active,在重启另外一台NameNode就能够了。
先重启standbycd ${HADOOP_HOME}/sbin
./hadoop-daemon.sh stop namenode ./hadoop-daemon.sh start namenode
切换active节点,这里的nn2将被切换为active节点
hdfs haadmin -failover <nn1> <nn2>
最后重启nn2就完事了,重启方式同上
本文来自 QQ群的大佬 @托马斯维德 分享的。我就给整理 copy 过来了。谢谢大佬,谢谢你们!