Hadoop 12节点集群搭建
U盘挂载操作如下:
此步骤是 U盘给Linux上挂载显示,如无此需求请忽略此步。
- 1) 插入U盘
- 2) 输入 fdisk -l 查看输出结果,比如我的是这样的:
... Device Boot Start End Blocks Id System /dev/sdb1 * 1 2668 128016 6 FAT16
- 3) 看了上面的输出就知道U盘所在的设备了,比如我的就是/dev/sdb1,接着便是挂载了
# 先创建一个挂载目录 $ 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
- 4) 可以查看挂载情况
$ df –lh
- 5) 打开/mnt/usb 就可以看到你的U盘里的东西了!
$ cd /mnt/usb
- 6) 卸载命令则为:
$ 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。如果真的配置了,还会报错。
配置步骤:
- 1.1 首先配置zookeeper (hadoop002,hadoop003,hadoop008)
$ 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是投票用的端口
- 1.2 然后创建一个tmp文件夹
$ mkdir /hadoop/zookeeper-3.4.6/tmp
- 1.3 再创建一个空文件
$ touch /hadoop/zookeeper-3.4.6/tmp/myid
- 1.4 最后向该文件写入ID,填入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.xml
$ 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>
- 2.2 修改配置文件 core-site.xml
$ 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>
- 2.3 修改配置文件 mapred-site.xml
$ vim mapred-site.xml
<configuration>
#【指定运行mapreduce的环境是yarn,与hadoop1截然不同的地方】
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
- 2.4 修改配置文件 yarn-site.xml
$ 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>
-
- 2.5 在hadoop-env.sh 和 yarn-env.sh 中配置JAVA_HOME
启动报错:
注:如果在启动的时候报
#WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
可以在hadoop/etc/hadoop/log4j.properties 文件中添加
log4j.logger.org.apache.hadoop.util.NativeCodeLoader=ERRO
注意:
在 hadoop/etc/hadoop 下记得建立 slave 文件
启动过程:
-
1) 启动zookeeper集群(在主机名hadoop002、hadoop003、hadoop008上启动)
$ cd cd /home/hadoop/apps/zookeeper/ $ bin/zkServer.sh start (逐个启动) #查看状态:一个leader,两个follower bin//zkServer.sh status
- 2) 启动journalnode(分别在在主机名hadoop002、主机名hadoop003、主机名hadoop008上执行)
$ cd $HADOOP_HOME $ sbin/hadoop-daemon.sh start journalnode
-
3) 验证
$ jps #显示JouralNode + QuorumpeerMain
- 4) 格式化namenode(hadoop001)
$ hdfs namenode -format
- 5) 格式化ZKFC(在hadoop001上执行)
$ hdfs zkfc -formatZK
-
6) NameNode从hadoop001同步到hadoop007
1.在hadoop007执行 hdfs namenode bootstrapstandby
2.验证 tmp下生成dfs
3.如果1失败(在hadoop001执行)ssh-keygen -f "~/.ssh/known_hosts" -R hadoop007
4.验证 tmp下生成dfs
5.或者直接拷贝 tmp 目录到 hadoop007 - 7) 启动NameNode和DataNode
注意:每次启动前都要先启动zookeeper$ start-dfs.sh #验证 jps
-
8) 启动yarn(在hadoop004执行)
$ start-yarn.sh #验证: jps #显示ResourceManager + NodeManager
- 9) 启动ZookeeperFailoverController(hadoop001和007执行)
$ hadoop-daemon.sh start zkfc #验证 jps #显示DFSZKFailoverController
两台nomenode在 start-all.sh的时候,50070都是现实standby,在启动zkfc的时候 nn1 显示为active
怎么设置默认的日志级别为WARN呢?
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 过来了。谢谢大佬,谢谢大家!
转载于:https://blog.51cto.com/2226894115/2058998