HDFS概述

一、HDFS概述

1. 什么是HDFS

   HDFS 全称是Hadoop Distributed File System hadoop分布式(cluser)文件存储系统.

2. HDFS基本架构

1、hadoop1体系 64M一个快(少)
hadoop2体系 128M一个块(默认)
8TB (3TB/3TB/2TB)n=X/128 个快
提高数据读写效率(利于并行读取数据)

2、冗余存储 (24TB 动态扩充 ,保证数据安全)
3、校验和(确定块是否完整 是否损坏)
	原理:实现思想(加密算法MD5 不可逆)
	         可对二进制加密,128M加密----> 32个字符串(16进制0F) 
	         元不变(加密结果也不会改变)
	         datanode 定期检查块 (向nameNode汇报块是否损坏)。
NameNode 的持久化?:

在这里插入图片描述

3. 搭建[HDFS]

/opt/models   原始文件
/opt/install  安装文件放置的位置  
1. linux服务器的基本配置
   设置ip,关闭防火墙,关闭selinux,配置主机名,主机与ip映射
2. 安装jdk 1.7+ 
   rpm -ivh jdk-7u71-linux-x64.rpm  默认安装位置 /usr
   环境变量的配置
       vi /etc/profile   环境变量 linux 所有用户生效
       
       vi ~/.bash_profile 环境变量 当前用户生效
       vi ~/.bashrc
        JAVA_HOME=/usr/java/jdk1.7.0_71
        CLASSPATH=.
        PATH=$JAVA_HOME/bin:$PATH:$HOME/bin

        export JAVA_HOME
        export CLASSPATH
        export PATH
        
        source .bash_profile

在这里插入图片描述

4. 安装hadoop

   tar -zxvf hadoop-2.5.2.tar.gz -C /opt/install

5. hadoop配置文件的配置 etc/hadoop

   1.1 hadoop-env.sh
       export JAVA_HOME=/usr/java/jdk1.7.0_71
   1.2 core-site.xml
       <!--用于设置namenode并且作为Java程序的访问入口--->
        <property>		
           <name>fs.defaultFS</name>
           <value>hdfs://hadoop.baizhiedu.com:8020</value>
        </property>
       <!--存储NameNode持久化的数据,DataNode块数据——>
       <!--手工创建$HADOOP_HOME/data/tmp-->
        <property>
	       <name>hadoop.tmp.dir</name>
	       <value>/opt/install/hadoop-2.5.2/data/tmp</value>
         </property>
   1.3 hdfs-site.xml
       <!--设置副本数量 默认是3 但是单节点测试,改成1-->
        <property>		
          <name>dfs.replication</name>
          <value>1</value>
        </property>
   1.4 mapred-site.xml
       <!--yarn 与 MR相关-->
           <property>	 	        		
              <name>mapreduce.framework.name</name>
              <value>yarn</value>
           </property>
   1.5 yarn-site.xml
       <property>
           <name>yarn.nodemanager.aux-services</name>
           <value>mapreduce_shuffle</value>
       </property>
   1.6 slaves
       hadoop2.baizhiedu.com

6. namenode的格式化

【第一次搭建hdfs集群时需要使用】
      目的作用:格式化hdfs系统,并且生成存储数据块的目录
      bin/hdfs namenode -format

7. 启动hadoop守护进程

      sbin/hadoop-daemon.sh start namenode
      sbin/hadoop-daemon.sh start datanode
      sbin/yarn-daemon.sh start resourcemanager
      sbin/yarn-daemon.sh start nodemanager
      
      sbin/hadoop-daemon.sh stop namenode
      sbin/hadoop-daemon.sh stop datanode
      sbin/yarn-daemon.sh stop resourcemanager
      sbin/yarn-daemon.sh stop nodemanager

8. 测试验证安装成果

ps -ef | grep java
      jps 查看相关4个进程
      通过网络进行访问测试
           浏览器 http://hadoop2.baizhiedu.com:50070 hdfs
                 http://hadoop2.baizhiedu.com:8088  yarn

9. Hadoop HDFS运行过程中的错误分析#

   1. 查看日志
      tail -nxxx 文件名
      $HADOOP_HOME/logs 
      [hadoop-用户名-namenode-主机名.log]
      hadoop-root-namenode-hadoop2.baizhiedu.com.log
      hadoop-root-datanode-hadoop2.baizhiedu.com.log
      yarn-root-resourcemanager-hadoop2.baizhiedu.com.log
      yarn-root-nodemanager-hadoop2.baizhiedu.com.log

10、HDFS的client访问

在这里插入图片描述

1. 查看目录结构
   bin/hdfs dfs -ls 路径
   bin/hdfs dfs -ls /
2. 创建文件夹
   bin/hdfs dfs -mkdir /suns
   bin/hdfs dfs -mkdir -p /liuh/xiaojr
3. 本地上传文件到hdfs中
   bin/hdfs dfs -put /root/hdfs/data /suns
   bin/hdfs dfs -put local_path hdfs_path
4. 查看文件内容
   bin/hdfs dfs -text /suns/data
   bin/hdfs dfs -cat /suns/data
5. 删除
   bin/hdfs dfs -rm /suns/data
   注意事项:可以修改垃圾桶的存活时间
   core-site.xml
   	<property>
		   <name>fs.trash.interval</name>
		   <value>10</value>
    </property>
    垃圾桶的位置:/user/root/.Trash/190522010000/suns/data
    hdfs:有权限:
    hdfs-site.xml
    <property>
		   <name>dfs.permissions.enabled</name>
		   <value>false</value>
    </property>
6. 删除非空文件夹 
   bin/hdfs dfs -rmr /suns
7. 从hdfs下载文件到本地
   bin/hdfs dfs -get hdfs_path local_path
8. cp mv

11.指定 Hadoop的启停脚本


shell脚本 当前目录执行方式  ./hadoop-start.sh
         绝对路径执行shell /opt/install/hadoo-2.5.2/hadoop-start.sh

linux  hadoop-start.sh
       sbin/hadoop-daemon.sh start namenode
       sbin/hadoop-daemon.sh start datanode
       sbin/yarn-daemon.sh start resourcemanager
       sbin/yarn-daemon.sh start nodemanager
    
       hadoop-stop.sh
       sbin/hadoop-daemon.sh stop namenode
       sbin/hadoop-daemon.sh stop datanode
       sbin/yarn-daemon.sh stop resourcemanager
       sbin/yarn-daemon.sh stop nodemanager
 sbin/yarn-daemon.sh start nodemanager
    
       hadoop-stop.sh
       sbin/hadoop-daemon.sh stop namenode
       sbin/hadoop-daemon.sh stop datanode
       sbin/yarn-daemon.sh stop resourcemanager
       sbin/yarn-daemon.sh stop nodemanager

二、NameNode的持久化(persistent)

在这里插入图片描述

NameNode在运行时,元数据放置在内存中。
	如果内存出现问题,则元数据丢失。
	为了保证元数据安全,NameNode有对应的持久化机制,把元数据持久化到硬盘存储。

1. FSImage和EditsLog

1、FSImage(文件系统镜像二进制)
  存储某一个时间点(checkPoint)的NameNode镜像数据
  默认存储位置  /opt/install/hadoop-2.5.2/data/tmp/dfs/name
   dfs.namenode.name.dir
   
 2、EditsLog 
   可编辑日志二进制 记录(检查点以后的所有写操作)
   默认存储位置 dfs.namenode.edits.dir

3、 定制FSImage和EditsLog的存储位置
   ~~~markdown
   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>

2、 安全模式(safe mode)

  每一次启动namenode时,hdfs都需要进行FSImage和EditsLog的整合,
在这个过程中,不允许用户做写操作,把这个过程称之为安全模式(safe mode),默认30秒
 (1). safe mode相关命令
      bin/hdfs dfsadmin -safemode [enter leave get] 
 (2). HDFS集群启动是,完成流程
      HDFS集群启动 过程 (安全模式)
      1,整合 FSImage和EditsLog 生成新的EditsLog 和 FSImage,由新EditsLog接收用户写操作命令
      2, DataNode都需NameNode主动汇报健康情况(心跳)3秒
      3, 汇报块列表  通过校验和 检查块是否可用,并定期1小时汇报。

3、SecondaryNameNode作用

在这里插入图片描述

自定义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	

4、HANameNode集群(高可用)


zookeeper:选主过程
   1 ,2,3,4,5,按编号依次启动:
	 服务器1启动,给自己投票,发投票信息,由于其它机器还没有启动所以它收
不到反馈信息,服务器1的状态一直属于Looking(选举状态)。
     服务器2启动,给自己投票,同时与之前启动的服务器1交换结果,由于服务器2的编号大
所以服务器2胜出,但此时投票数没有大于半数,所以两个服务器的状态依然是LOOKING。
	服务器3启动,给自己投票,同时与之前启动的服务器1,2交换信息,由于服务器3
的编号最大所以服务器3胜出,此时投票数正好大于半数,所以服务器3成为领导者,服务器1,2成为小弟。
服务器4启动,给自己投票,同时与之前启动的服务器1,2,3交换信息,尽管服务器4的编号大,但之前服务器3已经胜出,所以服务器4只能成为小弟。
      服务器5启动,后面的逻辑同服务器4成为小弟。	
      
	LOOKING,竞选状态。
	FOLLOWING,随从状态,同步leader状态,参与投票。
	OBSERVING,观察状态,同步leader状态,不参与投票。
	LEADING,领导者状态。

zookeeper 集群高可靠 (奇数台)
  作用:
   1、选主namenode(投票)active/standby
   2、管理EdisLog(QJN),将EdisLog同步给Standby(NameNode)

standyBy(Namenode)
	作用:
	  1、从zookerper上拉取edisLog 进行整合成 FSImage 替换原有的FSImage
	  2、接受dataNode 的元数据信息。
	  3、当activeNameNode 宕机时,全权接管 activeNameNode的所有功能,对外进行服务

在这里插入图片描述
在这里插入图片描述

5、 hdfs写文件的步骤

	(1)client向NameNode申请上传…/xxx.txt文件
	(2)NN向client响应可以上传文件
	(3)ClientNameNode申请DataNode
	(4)NN向Client返回DN1,DN2,DN3
	(5)Client向DN1,DN2,DN3申请建立文件传输通道
	(6)DN3,DN2,DN1依次响应连接

在这里插入图片描述

6、 hdfs读取文件步骤

	(1)client向NN请求下载…/xxx.txt文件
	(2)NN向client返回文件的元数据
	(3)Client向DN1请求访问读数据blk_1
	(4)DN1向Client传输数据
	(5)Client向DN2请求访问读数据blk_2
	(6)DN2向Client传输数据

在这里插入图片描述

7、hadoop的shuffle过程

1)、Map的输出会先写到内存缓冲区中
	(2)、达到 阀值(100M)/0.8产生溢写
	(3)、产生临时文件,写到本地磁盘
	(4)、多个file1 临时文件  marge排序合并(按分区、排序) ,个数为分区个数。
		   存在本地linux服务器端。

		(1)、reduce 通过 http 找nodemanager 
		(2)、主动拉去数据到 内存 环形缓冲区(分组排序 group sort)
		(3)、产生溢写——多个临时文件
		(4)、临时文件merge汇总(分组 、排序)交给——reduce

在这里插入图片描述

8、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.baizhiedu.com:2888:3888
       server.1=hadoop3.baizhiedu.com:2888:3888
       server.2=hadoop4.baizhiedu.com:2888:3888
   1.4 zookeeper_home/data
       myid文件    0          hadoop2.baizhiedu.com
       myid文件    1          hadoop3.baizhiedu.com
       myid文件    2          hadoop4.baizhiedu.com
   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.baizhiedu.com:2181,hadoop3.baizhiedu.com:2181,hadoop4.baizhiedu.com: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.baizhiedu.com:8020</value>
	  </property>
	  <!-- nn1的http通信地址 -->
	  <property>
		  <name>dfs.namenode.http-address.ns.nn1</name>
		  <value>hadoop2.baizhiedu.com:50070</value>
	  </property>
  <!-- nn2的RPC通信地址 -->
	  <property>
		  <name>dfs.namenode.rpc-address.ns.nn2</name>
		  <value>hadoop3.baizhiedu.com:8020</value>
	  </property>
	  <!-- nn2的http通信地址 -->
	  <property>
		  <name>dfs.namenode.http-address.ns.nn2</name>
		  <value>hadoop3.baizhiedu.com:50070</value>
	  </property>

	<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
	<property>
		<name>dfs.namenode.shared.edits.dir</name>
		<value>qjournal://hadoop2.baizhiedu.com:8485;hadoop3.baizhiedu.com:8485;hadoop4.baizhiedu.com: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

    首先启动各个节点的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

HDFS,全称为Hadoop Distributed File System,是一个分布式文件系统,特别适用于大规模数据处理。以下是关于HDFS架构的详细介绍: **一、HDFS概述** HDFS的设计目标是提供高吞吐量的数据访问,适合于大量的批处理任务,而不是实时交互。它采用了主从(Master-Slave)架构,由NameNode作为全局命名空间管理者和DataNodes作为大量数据块的存储节点。 **二、HDFS存储体系结构** 1. **NameNode**: 主要负责元数据管理,如文件系统的目录树结构、文件属性和块到DataNode映射等信息。它是一台中心化的服务器,对整个集群进行全局状态维护。 2. **DataNodes**: 存储实际的数据块。每个DataNode都有自己的内存缓存,并通过心跳报文向NameNode报告存活状态和块的位置信息。 **三、HDFS文件写流程** 1. **客户端发起写操作**: 客户端首先创建一个新的文件,这会生成一个元数据块并记录在NameNode中。 2. **分块与复制**: 文件被切分成多个固定大小的数据块(默认64MB),然后客户端随机选择若干个DataNodes将这些块存储起来。通常会选择三个副本,保证冗余和容错性。 3. **数据写入**: 数据块被逐个写入DataNodes,客户端并不直接控制具体的DataNode,而是通过NameNode获取写入地址。 4. **确认写入**: DataNodes完成写入后,会更新自身的块列表并将此消息发送给NameNode,NameNode确认所有副本都已写入后,返回成功信号给客户端。 5. **最终持久化**: NameNode定期同步各个DataNode的块位置信息,当大部分副本存活时,这个文件被认为持久化了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值