之前有篇讲解了下Hadoop的简介以及HDFS,接下来我将如何配置hadoop集群给大家讲解一下,这是本人经过在自己电脑上配置多次后所得到的完整版配置步骤,相关的软件压缩包可以在官网下载或者在CSDN上搜索。在这里,我所使用的是CentOS6.5版本的,Hadoop是2.7.2版本的,jdk为1.8。
前提条件
- 准备几台虚拟机,最少三台
- 将机器的网络配置好,如果后面几台机器的是克隆的话,需要进行下面3、4、5、6步,若不是克隆的就跳过。
- 需要修改/etc/udev/rules.d/70-persistent-net.rules 将eth0网卡删除,再将eth1改为eth0,复制mac地址
- vi /etc/sysconfig/network 中的hostname
- vi /etc/sysconfig/network-scripts/ifcfg-eth0 将HWADDR改为刚才复制的mac地址,IPADDR修改ip地址。
- vi /etc/hosts 对主机名进行ip映射。
- 装好JDK和Hadoop,在/etc/profile下配置/jdk/bin和/hadoop/bin以及/hadoop/sbin
- 关闭防火墙,service iptables stop
- 开启免密登录。通过ssh-keygen 生成私钥和公钥,再用ssh-copy-id将公钥拷给需要免密登录的机器。
单机版
只需要将jdk配置好,hadoop解压后,在hadoop/etc/hadoop/hadoop-env.sh中配置下jdk的路径,这样就实现了单机版的配置。
伪分布式
修改core-site.xml
<!-- 指定HDFS 中 NameNode 的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop101:9000</value>
</property>
<!-- 指定 hadoop 运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.2/data/tmp</value>
</property>
修改hdfs-site.xml
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
全分布式
-
cd /usr/local/hadoop/etc/hadoop/ 进入该路径中配置hadoop文件
-
vi hadoop-env.sh / yarn-env.sh / mapred-env.sh 在这三个文件中添加JAVA_HOME路径
-
mv mapred-site.xml.template mapred-site.xml 将文件改名
-
vi core-site.xml (以下红色的均为看实际情况可变的)
<property> <name>fs.defaultFS</name> <value>hdfs://hadoop01:9000</value> </property> <!-- 指定 hadoop 运行时产生文件的存储目录 --> <property> <name>hadoop.tmp.dir</name> <value>/usr/local/hadoop-2.7.2/data/tmp</value> </property>
-
vi hdfs-site.xml
<!--文本副本数为3--> <property> <name>dfs.replication</name> <value>3</value> </property> <!--SecondaryNameNode地址--> <property> <name>dfs.namenode.secondary.http-address</name> <value>hadoop03:50090</value> </property>
-
vi yarn-site.xml
<property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 指定 YARN 的 ResourceManager 的地址 --> <property> <name>yarn.resourcemanager.hostname</name> <value>hadoop02</value> </property> <!-- 日志聚集功能使能 --> <property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <!-- 日志保留时间设置 7 天 --> <property> <name>yarn.log-aggregation.retain-seconds</name> <value>604800</value> </property>
-
vi mapred-site.xml
<property> <name>mapreduce.jobhistory.address</name> <value>hadoop02:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>hadoop02:19888</value> </property> <!-- 指定 mr 运行在 yarn 上 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
高可用HA
-
配置hdfs-site.xml
<preoperty> <name>dfs.replication</name> <value>3</value> </property> <!--配置nameservice--> <property> <name>dfs.nameservices</name> <value>mycluster</value> </property> <!--myucluster下的名称节点两个id --> <property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2</value> </property> <!--配置每个nn的rpc地址--> <property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>hadoop01:8020</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>hadoop02:8020</value> </property> <!--配置webui端口--> <property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>hadoop01:50070</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>hadoop02:50070</value> </property> <!--名称节点共享编辑目录--> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/mycluster</value> </property> <!--java类,client使用它判断哪个节点是激活态--> <property> <name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <!--脚本列表或者java类,在容灾保护激活态的nn--> <property> <name>dfs.ha.fencing.methods</name> <value> sshfence shell(/bin/true) </value> </property> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/root/.ssh/id_rsa</value> </property> <!--配置JN存放edit的本地路径--> <property> <name>dfs.journalnode.edits.dir</name> <value>/usr/local/hadoop-2.7.2/data/jn</value> </property> <!-- 访问代理类:client,mycluster,active 配置失败自动切换实现方式--> <property> <name>dfs.client.failover.proxy.provider.mycluster</name> <value> org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider </value> </property> <!-- 关闭权限检查--> <property> <name>dfs.permissions.enable</name> <value>false</value> </property>
-
配置core-site.xml
<property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property> <!-- 指定 hadoop 运行时产生文件的存储目录 --> <property> <name>hadoop.tmp.dir</name> <value>/usr/local/hadoop-2.7.2/data/tmp</value> </property>
-
同步core-site.xml和hdfs-site.xml
-
检测
1)在jn节点分别启动jn进程 hadoop-daemon.sh start journalnode 2)启动jn之后,在两个NN之间进行disk元数据同步 a)如果是全新集群,先format文件系统,只需要在一个nn上执行。 $>hadoop namenode -format b)如果将非HA集群转换成HA集群,复制原NN的metadata到另一个nn. 1.步骤一 在hadoop01中 $>scp -r /usr/local/hadoop-2.7.2/data/tmp/dfs/name hadoop02:/usr/local/hadoop-2.7.2/data/tmp/dfs/ 2.步骤二 在新的nn(未格式化的nn)上运行一下命令,实现待命状态引导。 在[nn2]上,同步 nn1 的元数据信息: $>hdfs namenode -bootstrapStandby //需要hadoop01的namenode为启动状态,提示是否格式化,选择N. 3)在一个NN上执行以下命令,完成edit日志到jn节点的传输。 $>hdfs namenode -initializeSharedEdits 4)启动所有节点. 在hadoop02中 $>hadoop-daemon.sh start namenode //启动名称节点 $>hadoop-daemons.sh start datanode //启动所有数据节点 在hadoop02中 $>hadoop-daemon.sh start namenode //启动名称节点
hdfs haadmin -transitionToActive nn1 //切成激活态
hdfs haadmin -transitionToStandby nn1 //切成待命态
hdfs haadmin -transitionToActive --forceactive nn2//强行激活
hdfs haadmin -failover nn1 nn2 //模拟容灾演示,从nn1切换到nn2
hdfs haadmin -getServiceState nn1 //查看状态
配置 HDFS-HA 自动故障转移
-
在hdfs-site.xml中
<property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> 在core-site.xml中 <property> <name>ha.zookeeper.quorum</name> <value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value> </property>
-
同步!!!
-
启动
(1) 关闭所有 HDFS 服务:
sbin/stop-dfs.sh
(2) 启动 Zookeeper 集群:
bin/zkServer.sh start
(3) 初始化HA 在 Zookeeper 中状态:
bin/hdfs zkfc -formatZK 成都
(4) 启动HDFS 服务:
sbin/start-dfs.sh
(5) 在各个 NameNode 节点上启动 DFSZK Failover Controller,先在哪台机器启动,哪个机器的NameNode 就是 Active NameNode
sbin/hadoop-daemon.sh start zkfc
(6) 验证
(1) 将 Active NameNode 进程 kill kill -9 namenode 的进程 id
(2) 将 Active NameNode 机器断开网络 service network stop
YARN的高可用
-
在yarn-site.xml中
<property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 指定 YARN 的 ResourceManager 的地址 <property> <name>yarn.resourcemanager.hostname</name> <value>hadoop02</value> </property>--> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <property> <name>yarn.resourcemanager.cluster-id</name> <value>cluster1</value> </property> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>hadoop01</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>hadoop03</value> </property> <property> <name>yarn.resourcemanager.webapp.address.rm1</name> <value>hadoop01:8088</value> </property> <property> <name>yarn.resourcemanager.webapp.address.rm2</name> <value>hadoop03:8088</value> </property> <property> <name>yarn.resourcemanager.zk-address</name> <value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value> </property> <!--启用自动恢复--> <property> <name>yarn.resourcemanager.recovery.enabled</name> <value>true</value> </property> <!--指定 resourcemanager 的状态信息存储在zookeeper 集群--> <property> <name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> </property> <!-- 日志聚集功能使能 --> <property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <!-- 日志保留时间设置 7 天 --> <property> <name>yarn.log-aggregation.retain-seconds</name> <value>604800</value> </property>
-
同步yarn-site.xml
-
先启动hdfs
-
启动 yarn
(1) 在 hadoop102 中执行:
sbin/start-yarn.sh
(2) 在 hadoop103 中执行:
sbin/yarn-daemon.sh start resourcemanager
(3) 查看服务状态
bin/yarn rmadmin -getServiceState rm1
补充:如果没有配置高可用的话,namenode出现故障了怎么办???
在主namenode发生故障时 ( 假设 没 有 及 时 备 份 数 据 ) ,可以 从SecondaryNameNode 恢复数据。
方法一:将 SecondaryNameNode 中数据拷贝到 namenode 存储数据的目录;
方法 二: 使用 -importCheckpoint 选项 启动 namenode 守 护 进 程 ,从而将SecondaryNameNode 中数据拷贝到 namenode 目录中。
一、手动拷贝 SecondaryNameNode 数据:
模拟 namenode 故障,并采用方法一,恢复 namenode 数据
1) kill -9 namenode 进程
jps查看一下
2) 删除 namenode 存储的数据(data/tmp/dfs/name)
rm -rf name
3) 拷贝 SecondaryNameNode 中数据到原 namenode 存储数据目录
scp -r root@hadoop04:/usr/local/hadoop-2.7.2/data/tmp/dfs/namesecondary/* 拷贝到原来name地方
namesecondary 改名name 并把current in_use.lock删除掉。
4) 重新启动 namenode
sbin/hadoop-daemon.sh start namenode
二、采用 importCheckpoint 命令拷贝 SecondaryNameNode 数据
模拟 namenode 故障,并采用方法二,恢复 namenode 数据
修改 hdfs-site.xml 中的
<property>
<name>dfs.namenode.checkpoint.period</name>
<value>120</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/usr/local/hadoop-2.7.2/data/tmp/dfs/name</value>
</property>
1) kill -9 namenode 进程
2) 删除 namenode 存储的数据(data/tmp/dfs/name) 一般上namenode都是name下的
rm -rf /etc/local/hadoop-2.7.2/data/tmp/dfs/name/*
3 )如果 SecondaryNameNode 不和 Namenode 在 一个 主机 节点上,需要将 SecondaryNameNode 存储数据的目录拷贝到 Namenode 存储数据的平级目录, 并删除 in_use.lock 文件。
scp -r root@hadoop04:/usr/local/had../data/tmp/dfs/namesecondary ./
rm -rf in_use.lock
4)导入检查点数据(等待一会 ctrl+c 结束掉)
bin/hdfs namenode -importCheckpoint
5)启动 namenode
sbin/hadoop-daemon.sh start namenode
以上就是我所整理的配置全步骤,希望对你的学习有所帮助。
summed up by JiaMingcan
转载请署名:JiaMingcan