配置Hadoop集群

版权声明:Designed By JiaMingcan https://blog.csdn.net/qq_41571900/article/details/84192871

之前有篇讲解了下Hadoop的简介以及HDFS,接下来我将如何配置hadoop集群给大家讲解一下,这是本人经过在自己电脑上配置多次后所得到的完整版配置步骤,相关的软件压缩包可以在官网下载或者在CSDN上搜索。在这里,我所使用的是CentOS6.5版本的,Hadoop是2.7.2版本的,jdk为1.8。

前提条件

  1. 准备几台虚拟机,最少三台
  2. 将机器的网络配置好,如果后面几台机器的是克隆的话,需要进行下面3、4、5、6步,若不是克隆的就跳过。
  3. 需要修改/etc/udev/rules.d/70-persistent-net.rules 将eth0网卡删除,再将eth1改为eth0,复制mac地址
  4. vi /etc/sysconfig/network 中的hostname
  5. vi /etc/sysconfig/network-scripts/ifcfg-eth0 将HWADDR改为刚才复制的mac地址,IPADDR修改ip地址。
  6. vi /etc/hosts 对主机名进行ip映射。
  7. 装好JDK和Hadoop,在/etc/profile下配置/jdk/bin和/hadoop/bin以及/hadoop/sbin
  8. 关闭防火墙,service iptables stop
  9. 开启免密登录。通过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>

全分布式

  1. cd /usr/local/hadoop/etc/hadoop/ 进入该路径中配置hadoop文件

  2. vi hadoop-env.sh / yarn-env.sh / mapred-env.sh 在这三个文件中添加JAVA_HOME路径

  3. mv mapred-site.xml.template mapred-site.xml 将文件改名

  4. 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>
    
  5. 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>
    
  6. 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>
    
  7. 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

  1. 配置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>
    
  2. 配置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>
    
  3. 同步core-site.xml和hdfs-site.xml

  4. 检测

     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 自动故障转移

  1. 在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>
    
  2. 同步!!!

  3. 启动
    (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的高可用

  1. 在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>
    
  2. 同步yarn-site.xml

  3. 先启动hdfs

  4. 启动 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

猜你喜欢

转载自blog.csdn.net/qq_41571900/article/details/84192871