--HDFS环境 hadoop-env.sh
export JAVA_HOME=/opt/apps/jdk1.8.0_141
--core-site.xml 配置程序操作的文件系统
<property>
<name>fs.defaultFS</name>
<value>hdfs://linux01:8020</value>
</property>
--hdfs-site.xml HDFS常用参数
<!-- 集群的namenode的位置 datanode能通过这个地址注册-->
<property>
<name>dfs.namenode.rpc-address</name>
<value>linux01:8020</value>
</property>
<!-- namenode存储元数据的位置 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>/opt/hdpdata/name</value>
</property>
<!-- datanode存储数据的位置 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>/opt/hdpdata/data</value>
</property>
<!-- secondary namenode机器的位置-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>linux02:50090</value>
</property>
--yarn常用参数 yarn-site.xml
<!-- resource,manager主节点所在机器 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>linux01</value>
</property>
<!-- 为mr程序提供shuffle服务 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 一台NodeManager的总可用内存资源 -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>4096</value>
</property>
<!-- 一台NodeManager的总可用(逻辑)cpu核数 -->
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>4</value>
</property>
<!-- 是否检查容器的虚拟内存使用超标情况 -->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<!-- 容器的虚拟内存使用上限:与物理内存的比率 1G 600M -->
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>2.1</value>
</property>
--MR参数 mapred-site.xml
<--!MR程序默认运行在yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<description> 跨平台运行 If enabled, user can submit an application cross-platform
i.e. submit an application from a Windows client to a Linux/Unix server or
vice versa.
</description>
<name>mapreduce.app-submission.cross-platform</name>
<value>false</value>
</property>
<--!提交程序的主机要设置-->
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=/opt/apps/hadoop-3.1.1</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=/opt/apps/hadoop-3.1.1</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=/opt/apps/hadoop-3.1.1</value>
</property>
--HDFS HA 高可用模式 core-site.xml
<configuration>
<!-- HA模式 -->
<!-- 把两个NameNode)的地址组装成一个集群mycluster -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mydfs</value>
</property>
<!-- 指定hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/ha/hadoop-3.1.1/data/tmp</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>linux01:2181,linux02:2181,linux03:2181</value>
</property>
</configuration>
--hdfs-site.xml
<configuration>
<!-- HA模式 -->
<!-- 完全分布式集群名称 -->
<property>
<name>dfs.nameservices</name>
<value>mydfs</value>
</property>
<!-- 集群中NameNode节点都有哪些 -->
<property>
<name>dfs.ha.namenodes.mydfs</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mydfs.nn1</name>
<value>linux01:8020</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mydfs.nn2</name>
<value>linux02:8020</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.mydfs.nn1</name>
<value>linux01:9870</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.mydfs.nn2</name>
<value>linux02:9870</value>
</property>
<!-- 指定NameNode元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://linux01:8485;linux02:8485;linux03:8485/mydfs</value>
</property>
<!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 使用隔离机制时需要ssh无秘钥登录-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!-- 声明journalnode服务器存储目录-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/ha/hadoop-3.1.1/data/jn</value>
</property>
<!-- 关闭权限检查-->
<property>
<name>dfs.permissions.enable</name>
<value>false</value>
</property>
<!-- 访问代理类:client,mydfs,active配置失败自动切换实现方式-->
<property>
<name>dfs.client.failover.proxy.provider.mydfs</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
</configuration>
部署细节
在设置了所有必要的配置选项之后,您必须在将运行它们的机器集上启动 JournalNode 守护程序。这可以通过运行命令“ hdfs --daemon start journalnode ”并等待守护程序在每台相关机器上启动来完成。
JournalNodes 启动后,必须首先同步两个 HA NameNodes 的磁盘元数据。
-
如果要设置新的 HDFS 集群,则应首先在其中一个 NameNode 上运行格式命令 ( hdfs namenode -format )。
-
如果您已经格式化了 NameNode,或者正在将未启用 HA 的集群转换为启用 HA,您现在应该通过运行命令将 NameNode 元数据目录的内容复制到其他未格式化的 NameNode hdfs namenode -bootstrapStandby ”在未格式化的 NameNode 上。运行此命令还将确保 JournalNode(由dfs.namenode.shared.edits.dir配置)包含足够的编辑事务,以便能够启动两个 NameNode。
-
如果要将非 HA NameNode 转换为 HA,则应运行命令“ hdfs namenode -initializeSharedEdits ”,它将使用本地 NameNode 编辑目录中的编辑数据初始化 JournalNodes。
此时,您可以像通常启动 NameNode 一样启动所有 HA NameNode。
您可以通过浏览它们配置的 HTTP 地址来分别访问每个 NameNode 的网页。您应该注意到,配置地址旁边将是 NameNode 的 HA 状态(“备用”或“活动”)。每当 HA NameNode 启动时,它最初处于备用状态。