官网配置
超详细Hadoop HA高可用集群搭建及常见问题处理
查询报java.net.UnknownHostException
集群规划表
主机名 | Java进程 |
---|---|
nn1 | QuorumPeerMain、journalnode、namenode、DFSZKFailoverController |
nn2 | QuorumPeerMain、journalnode、namenode、DFSZKFailoverController |
dn1 | QuorumPeerMain、journalnode、datanode |
dn2 | QuorumPeerMain、journalnode、datanode |
基础环境配置
- 关闭防火墙/selinux
- 配置各个机器的主机名
- 配置ip/hostname映射
- ssh免密
- 安装JDK并配置环境变量
搭建Zookeeper集群
- 下载解压Zookeeper软件包
- 配置zoo.cfg文件
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/data/zookeeper
dataLogDir=/opt/log/zookeeper
clientPort=2181
autopurge.purgeInterval=1
#集群配置
server.1=nn1:2888:3888
server.2=nn2:2888:3888
server.3=dn1:2888:3888
server.4=dn2:2888:3888
- 创建/opt/data/zookeeper目录并创建myid文件,在里面写入标识
- nn1标识为1,nn2标识为2,以此类推…
- 配置zookeeper环境变量
- 启动zookeeper
zkServer.sh start
搭建Hadoop HDFS HA环境
- 下载解压Hadoop软件包
- 配置hadoop-env.sh文件里面的JAVA_HOME
- 配置hdfs-site.xml文件
<configuration>
<!--选择此名称服务的逻辑名称,例如“ mycluster”,然后将此逻辑名称用作此配置选项的值。您选择的名称是任意的。它既可以用于配置,也可以用作集群中绝对HDFS路径的权限组件。 -->
<property>
<name>dfs.nameservices</name>
<value>halin</value>
</property>
<!-- 使用逗号分隔的NameNode ID列表进行配置。DataNode将使用它来确定集群中的所有NameNode。例如,如果您以前使用“ mycluster”作为名称服务ID,并且想要使用“ nn1”,“ nn2”作为NameNode的各个ID,则可以这样配置 -->
<property>
<name>dfs.ha.namenodes.halin</name>
<value>nn1,nn2</value>
</property>
<!-- 每个NameNode监听的标准RPC地址 -->
<property>
<name>dfs.namenode.rpc-address.halin.nn1</name>
<value>nn1:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.halin.nn2</name>
<value>nn2:8020</value>
</property>
<!-- 每个NameNode监听的标准HTTP地址 -->
<property>
<name>dfs.namenode.http-address.halin.nn1</name>
<value>nn1:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.halin.nn2</name>
<value>nn2:50070</value>
</property>
<!-- 标识NameNode将在其中写入/读取编辑内容的JN组的URI -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://nn1:8485;nn2:8485;dn1:8485;dn2:8485/halin</value>
</property>
<!-- JournalNode守护程序将存储其本地状态的路径 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/data/journalnode</value>
</property>
<!-- HDFS客户端用于联系活动NameNode的Java类 -->
<property>
<name>dfs.client.failover.proxy.provider.halin</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 脚本或Java类的列表,这些列表将用于在故障转移期间隔离Active NameNode -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!-- 自动故障转移 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置Zookeeper地址-->
<property>
<name>ha.zookeeper.quorum</name>
<value>nn1:2181,nn2:2181,dn1:2181,dn2:2181</value>
</property>
<!-- 文件在HDFS中的备份数(小于等于NameNode) -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 关闭HDFS的访问权限 -->
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
</configuration>
- 配置core-site.xml文件
<configuration>
<property>
<name> fs.defaultFS </name>
<value>hdfs://halin</value>
</property>
<!-- 开启Hadoop的回收站机制,当删除HDFS中的文件时,文件将会被移动到回收站(/usr/<username>/.Trash),在指定的时间过后再对其进行删除,此机制可以防止文件被误删除 -->
<property>
<name>fs.trash.interval</name>
<!-- 单位是分钟 -->
<value>1440</value>
</property>
</configuration>
- 启动HDFS HA高可用集群
- 分别启动 journalnode
hadoop-daemon.sh start journalnode
- 格式化nn1的namenode并启动
hdfs namenode -format
hadoop-daemon.sh start namenode
- nn2的namenode同步nn1的namenode并启动
hdfs namenode -bootstrapStandby
hadoop-daemon.sh start namenode
- 格式化zookeeper,在其中一台namenode上执行
hdfs zkfc -formatZK
- 重启HDFS集群
stop-dfs.sh
start-dfs.sh
模拟NameNode宕机,手动杀死进程。
- 注意:有些机器默认没有psmisc包,所以要手动安装,否则会报错未找到fuser命令,导致zkfc通过ssh执行shell命令时无法使用fuser导致将NameNode升为active时失败。
yum install psmisc -y