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就完事了,重启方式同上


https://blog.51cto.com/2226894115/2058998