大数据Hadoop(二)

NameNode的持久化(persistent)

HDFS元数据持久化的概念 hdfs元数据持久化过程_BigData

NameNode在运行时,把重要的元数据放置在内存中,如果内存出现问题,则元数据丢失,为了保证元数据安全,NameNode有对应的持久化机制,把元数据持久化到硬盘存储。
  1. FSImage 和 EditsLog 存储位置
#FSImage默认存储位置  /opt/install/hadoop-2.5.2/data/tmp/dfs/name
dfs.namenode.name.dir
#editslog默认存储位置
dfs.namenode.edits.dir
  1. 定制FSImage 和 EditsLog 的存储位置
hdfs-site.xml
<property>
    <name>dfs.namenode.name.dir</name>
    <value>file:///xxx/xxxx</value>
</property>
<property>
    <name>dfs.namenode.edits.dir</name>
    <value>file:///xxx/xxxx</value>
</property>
  1. 安全模式(safe mode)
每一次启动namenode时,hdfs都需要进行FSImage和EditsLog的整合,在这个过程中,不允许用户做写操作,把这个过程称之为安全模式(safe mode),默认30秒。
  1. safe mode相关命令
bin/hdfs dfsadmin -safemode [enter leave get]
  1. HDFS集群启动时,完整流程
HDFS集群启动 过程 (安全模式)
1. 整合 FSImage 和 EditsLog 生成新的EditsLog和FSImage,由新EditsLog接受用户写操作命令
2. DataNode都需要NameNode主动汇报健康情况(心跳) 3秒
3. 汇报块列表  通过校验和  检查块是否可用,并定期汇报  1小时
SecondaryNameNode【了解】

HDFS元数据持久化的概念 hdfs元数据持久化过程_hadoop_02

自定义SecondaryNameNode  拉取数据的周期
hdfs-site.xml
dfs.namenode.checkpoint.period   3600秒
dfs.namenode.checkpoint.txns     1000000
secondaryNameNode启动方式:sbin/start-dfs.sh
						sbin/hadoop-daemon.sh start secondarynamenode
定制secondarynamenode 启动的节点
hdfs-site.xml
dfs.namenode.secondary.http-address    0.0.0.0:50090
dfs.namenode.secondary.https-address   0.0.0.0:50091
HANameNode集群

HDFS元数据持久化的概念 hdfs元数据持久化过程_BigData_03


HDFS元数据持久化的概念 hdfs元数据持久化过程_大数据_04

#HANameNode集群的搭建
1. zookeeper集群
   1.1 解压缩
       tar -zxvf zookeeper-xxx-tar.gz -C /opt/install
   1.2 创建数据文件夹
       mdkir  zookeeper_home/data
   1.3 conf目录修改zookeeper的配置文件
       修改zoo_sample.cfg 为 zoo.cfg
       mv zoo_sample.cfg zoo.cfg
       编辑内容
       dataDir=/opt/install/zookeeper-3.4.5/data

       server.0=hadoop2:2888:3888
       server.1=hadoop3:2888:3888
       server.2=hadoop4:2888:3888
   1.4 zookeeper_home/data
       myid文件    0          hadoop2
       myid文件    1          hadoop3
       myid文件    2          hadoop4
   1.5 scp -r 命令  同步集群中所有节点  并 修改对应的myid文件内容
   1.6 主节点  ssh  其他节点
   1.7 启动zk服务
       bin/zkServer.sh start | stop | restart
       bin/zkServer.sh status 查看集群状态 【必须集群完整启动完成】
       
       bin/zkCli.sh [只能在leader执行]
       
2. HA-HDFS集群
   删除 data/tmp
   2.1 core-site.xml
       <property>		
			<name>fs.defaultFS</name>
			<value>hdfs://ns</value>
	   </property>
	   <property>
			<name>hadoop.tmp.dir</name>
			<value>/opt/install/hadoop-2.5.2/data/tmp</value>
	   </property>
	   <property>
		    <name>ha.zookeeper.quorum</name>
	<value>hadoop2:2181,hadoop3:2181,hadoop4:2181</value>
	  </property>
   2.2 hdfs-site.xml
 	<property>
		   <name>dfs.permissions.enabled</name>
		   <value>false</value>
	</property>
		
	<!--指定hdfs的nameservice为ns,需要和core-site.xml中的保持一致 -->
	<property>
		  <name>dfs.nameservices</name>
		  <value>ns</value>
	</property>
	<!-- ns下面有两个NameNode,分别是nn1,nn2 -->
	<property>
		  <name>dfs.ha.namenodes.ns</name>
		  <value>nn1,nn2</value>
	</property>
  	<!-- nn1的RPC通信地址 -->
	<property>
		  <name>dfs.namenode.rpc-address.ns.nn1</name>
		  <value>hadoop2:8020</value>
	</property>
	<!-- nn1的http通信地址 -->
	<property>
		  <name>dfs.namenode.http-address.ns.nn1</name>
		  <value>hadoop2:50070</value>
	</property>
  	<!-- nn2的RPC通信地址 -->
	<property>
		  <name>dfs.namenode.rpc-address.ns.nn2</name>
		  <value>hadoop3:8020</value>
	</property>
	<!-- nn2的http通信地址 -->
	<property>
		  <name>dfs.namenode.http-address.ns.nn2</name>
		  <value>hadoop3:50070</value>
	</property>

	<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
	<property>
		<name>dfs.namenode.shared.edits.dir</name>
		<value>qjournal://hadoop2:8485;hadoop3:8485;hadoop4:8485/ns</value>
	</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
	<property>
		<name>dfs.journalnode.edits.dir</name>
		<value>/opt/install/hadoop-2.5.2/journal</value>
	</property>
	<!-- 开启NameNode故障时自动切换 -->
	<property>
		<name>dfs.ha.automatic-failover.enabled</name>
		<value>true</value>
	</property>
    <!-- 配置失败自动切换实现方式 -->
	<property>
		<name>dfs.client.failover.proxy.provider.ns</name>
		<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
	</property>
	<!-- 配置隔离机制,如果ssh是默认22端口,value直接写sshfence即可 -->
	<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>

   2.3 yarn-env.sh 添加如下内容
       export JAVA_HOME=/usr/java/jdk1.7.0_71

   2.4
    首先启动各个节点的Zookeeper,在各个节点上执行以下命令:
    bin/zkServer.sh start

    在某一个namenode节点执行如下命令,创建命名空间
    bin/hdfs zkfc -formatZK

    在每个journalnode节点用如下命令启动journalnode
    sbin/hadoop-daemon.sh start journalnode

    在主namenode节点格式化namenode和journalnode目录
    bin/hdfs namenode -format ns

    在主namenode节点启动namenode进程
    sbin/hadoop-daemon.sh start namenode

    在备namenode节点执行第一行命令,这个是把备namenode节点的目录格式化并把元数据从主namenode节点copy过来,并且这个命令不会把journalnode目录再格式化了!然后用第二个命令启动备namenode进程!

    bin/hdfs namenode -bootstrapStandby
    sbin/hadoop-daemon.sh start namenode

    在两个namenode节点都执行以下命令
    sbin/hadoop-daemon.sh start zkfc

    在所有datanode节点都执行以下命令启动datanode
    sbin/hadoop-daemon.sh start datanode

    日常启停命令
    sbin/start-dfs.sh
    sbin/stop-dfs.sh
Hadoop源码编译:
apache官方网站上提供的二进制文件,是基于32位操作系统进行编译的,不适合于64位操作系统,需要自己编译。
  1. 源码编译过程
1. hadoop源码
2. maven  linux版本
3. 安装相关依赖软件
   1. jdk
   2. maven  并设置 环境变量 (apache-maven-3.0.5-bin.tar.gz)
      /etc/profile
      MAVEN_HOME
      M2_HOME
      PATH
   3. linux相关的软件
   	    yum install wget
        yum install autoconf automake libtool cmake
        yum install ncurses-devel
        yum install openssl-devel
        yum install lzo-devel  zlib-devel  gcc gcc-c++
   4. 安装protobuf
       解压:
       tar -zxvf protobuf-2.5.0.tar.gz
       编译安装:
       进入安装目录,进行配置,执行命令:  
       ./configure 
       安装命令:
       make
       make check
       make install
   5. 安装findbugs
       下载: findbugs-1.3.9.tar.gz 
       解压:
       tar –zxvf findbugs-1.3.9.tar.gz
       设置环境变量(/etc/profile):
       export FINDBUGS_HOME=/opt/modules/findbugs-1.3.9
       export PATH=$PATH:$ FINDBUGS_HOME/bin
       执行命令:source /etc/profile   
       验证:findbugs -version
4. Hadoop源码编译
   export MAVEN_OPTS="-Xms256m -Xmx512m"
   mvn package -DskipTests -Pdist,native -Dtar 执行在Hadoop2.5.0的源码包中  
5. 编译成功  hadoop_src_home/hadoop-dist/target

HDFS元数据持久化的概念 hdfs元数据持久化过程_BigData_05


2. 出现问题

1. maven版本过高
2. 错误
   [ERROR] Failed to execute goal   org.apache.maven.plugins:maven-antrun-plugin:1.7:run (dist) on project hadoop-hdfs-httpfs: An Ant BuildException has occured: exec returned: 2
[ERROR] around Ant part ...<exec dir="/home/pory/workplace/hadoop-2.4.1-src/hadoop-hdfs-project/hadoop-hdfs-httpfs/target" executable="sh" failοnerrοr="true">... @ 10:134 in /home/pory/workplace/hadoop-2.4.1-src/hadoop-hdfs-project/hadoop-hdfs-httpfs/target/antrun/build-main.xml
[ERROR] -> [Help 1]

这是因为/home/pory/workplace/hadoop-2.4.1-src/hadoop-hdfs-project/hadoop-hdfs-httpfs/downloads目录下的文件没有下载完全,可以手动下一份匹配版本的文件放在下面,在http://archive.apache.org/dist/tomcat/tomcat-6/v6.0.36/bin/

然后重新执行命令
  1. 编译完成后使用
需要应用64位hadoop替换32位hadoop  /opt/install/hadoop-2.5.2/lib/native 的内容
#  替换一定在linux系统中直接替换
HDFS相关内容的总结
  1. 概念

HDFS元数据持久化的概念 hdfs元数据持久化过程_MapReduce_06

  1. 编码
1. HDFS shell 命令
2. java  API
   Configuration
   FileSystem
   IOUtils
   Path
MapReduce
  1. 什么是MapReduce
# 后续  Spark完成类似的工作
MapReduce是Hadoop体系下的一种计算模型(计算模型),主要功能是用于操作,处理HDFS上的大数据级数据。
  1. MapReduce的构建思想

HDFS元数据持久化的概念 hdfs元数据持久化过程_HDFS元数据持久化的概念_07

  1. 启动yarn
1. 配置相关的配置文件  etc/hadoop
   yarn-site.xml  mapred-site.xml
2. 启动yarn
   2.1 伪分布式
       sbin/yarn-daemon.sh start resourcemanager
       sbin/yarn-daemon.sh start nodemanager
   2.2 集群方式
       mapred-site.xml 
       <property>	 	        		
              <name>mapreduce.framework.name</name>
              <value>yarn</value>
       </property>
       
       yarn-site.xml  
        <property>
           <name>yarn.nodemanager.aux-services</name>
           <value>mapreduce_shuffle</value>
       </property>
       <!--指定resourcemanager所对应的节点--> 【分布式环境新加】
        <property>
           <name>yarn.resourcemanager.hostname</name>
           <value>hadoop12</value>
       </property>
       
       slaves
          datanode 同时又是 nodemanager
       同步集群的每一个节点
       正常启动hdfs
          namenode格式化
          sbin/start-dfs.sh
       集群的方式启动yarn
          建议 namenode 不要和 resourcemanager放置在同一个点
          # ssh相关的机器,避免yes
         在集群环境下,yarn启动的命令,需要在resourcemanager所在的节点执行
         sbin/start-yarn.sh 
         sbin/stop-yarn.sh
         验证:
             jps看进程
             http://hadoop12:8088
  1. MapReduce程序开发结构

HDFS元数据持久化的概念 hdfs元数据持久化过程_BigData_08

  1. MapReduce第一个程序分析

HDFS元数据持久化的概念 hdfs元数据持久化过程_MapReduce_09

  1. MapReduce的第一个程序开发
1. 准备  HDFS中上传文件
   suns  sb
   huxz  xiaojr
   liuh  xiaowb

pom.xml

<dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-common</artifactId>
      <version>2.5.2</version>
    </dependency>

    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-hdfs</artifactId>
      <version>2.5.2</version>
    </dependency>

    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-client</artifactId>
      <version>2.5.2</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-mapreduce-client-core -->
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-mapreduce-client-core</artifactId>
      <version>2.5.2</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-yarn-common -->
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-yarn-common</artifactId>
      <version>2.5.2</version>
    </dependency>

编码

# MapReduce编程中,一定会涉及到序列化的操作,基本进行了封装
  String  ---  Text
  int     ---  IntWritable
  Long    ---  LongWritable
  
# 打成jar ,上传到yarn集群(resourcemanager)
  bin/yarn jar hadoop-mr.jar