HDFS简介与部署

序言

      使用HDFS的主要目的,是为了解决大批量的数据运算。因为很多计算框架都是基于HDFS的cuiyaonan2000@163.com。本次的hadoop为最新的稳定版本hadoop-3.3.0.tar.gz。

简介

Hadoop分布式文件系统(HDFS)是指被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统(Distributed File System)。

它和现有的分布式文件系统有很多共同点。但同时,它和其他的分布式文件系统的区别也是很明显的。

  • HDFS是一个高度容错性的系统适合部署在廉价的机器上
  • HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。
  • HDFS放宽了一部分POSIX约束,来实现流式读取文件系统数据的目的。HDFS在最开始是作为Apache Nutch搜索引擎项目的基础架构而开发的。HDFS是Apache Hadoop Core项目的一部分。
  • HDFS有着高容错性(fault-tolerant)的特点,并且设计用来部署在低廉的(low-cost)硬件上。而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求(requirements)这样可以实现流的形式访问(streaming access)文件系统中的数据

体系结构

HDFS采用主从(Master/Slave)结构模型,一个HDFS集群是由一个NameNode和若干个DataNode组成的(在最新的Hadoop2.2版本已经实现多个NameNode的配置-百度的HDFS该更新内容了cuiyaonan2000@163.com)。

NameNode作为主服务器,管理文件系统命名空间和客户端对文件的访问操作。DataNode管理存储的数据。HDFS支持文件形式的数据。

从内部来看,文件被分成若干个数据块,这若干个数据块存放在一组DataNode上。NameNode执行文件系统的命名空间,如打开、关闭、重命名文件或目录等,也负责数据块到具体DataNode的映射。DataNode负责处理文件系统客户端的文件读写,并在NameNode的统一调度下进行数据库的创建、删除和复制工作。NameNode是所有HDFS元数据的管理者,用户数据永远不会经过NameNode----数据不经过NameNode很重要
 


 

HDFS 架构

文件写入:

   1)  Client向NameNode发起文件写入的请求。

   2)  NameNode根据文件大小和文件块配置情况,返回给Client它管理的DataNode的信息。

   3)  Client将文件划分为多个block,根据DataNode的地址,按顺序将block写入DataNode块中。

文件读取:

   1)  Client向NameNode发起读取文件的请求。

   2)  NameNode返回文件存储的DataNode信息。

   3)  Client读取文件信息。

文件块的放置(如下的Block表示一个文件的一部分,即HDFS会将文件拆成多个块存储cuiyaonan2000@163.com)

  • 一个Block会有三份备份,一份在NameNode指定的DateNode上,
  • 一份放在与指定的DataNode不在同一台机器的DataNode上,
  • 一份放在指定的DataNode在同一Rack上的DataNode上。
  • 备份的目的是为了数据安全,采用这种方式是为了考虑到同一Rack失败的情况,以及不同数据拷贝带来的性能的问题。

特点和目标

硬件故障

硬件故障是常态,而不是异常。整个HDFS系统将由数百或数千个存储着文件数据片段的服务器组成。实际上它里面有非常巨大的组成部分,每一个组成部分都很可能出现故障,这就意味着HDFS里的总是有一些部件是失效的,因此,故障的检测和自动快速恢复是HDFS一个很核心的设计目标。

数据访问

运行在HDFS之上的应用程序必须流式地访问它们的数据集(流式的访问数据集),它不是运行在普通文件系统之上的普通程序。

HDFS被设计成适合批量处理的,而不是用户交互式的。重点是在数据吞吐量,而不是数据访问的反应时间。------如此这般指向很明确,跟MySql和Oracle的区别明显。那HBase所提倡的时效比较高的查询,也并不能解决业务系统的高要求。cuiyaonan2000@163.com

,POSIX的很多硬性需求对于HDFS应用都是非必须的,去掉POSIX一小部分关键语义可以获得更好的数据吞吐率

大数据集

运行在HDFS之上的程序有很大量的数据集。典型的HDFS文件大小是GB到TB的级别。所以,HDFS被调整成支持大文件。它应该提供很高的聚合数据带宽,一个集群中支持数百个节点,一个集群中还应该支持千万级别的文件。

简单一致性模型-----实现该原理即所有的操作都是追加插入更新时间戳,或者查出标记

大部分的HDFS程序对文件操作需要的是一次写多次读取的操作模式。一个文件一旦创建、写入、关闭之后就不需要修改了。----Hbase的所有操作都是追加插入操作,所以完美适应,但是会造成历史数据非常的多。

这个假定简单化了数据一致的问题,并使高吞吐量的数据访问变得可能。一个Map-Reduce程序或者网络爬虫程序都可以完美地适合这个模型。

移动计算比移动数据更经济-------------该功能促使HDFS成为所有大数据计算的基础的原因cuiyaonan2000@163.com

在靠近计算数据所存储的位置来进行计算是最理想的状态,尤其是在数据集特别巨大的时候。这样消除了网络的拥堵,提高了系统的整体吞吐量。一个假定就是迁移计算到离数据更近的位置比将数据移动到程序运行更近的位置要更好。HDFS提供了接口,来让程序将自己移动到离数据存储更近的位置。

异构软硬件平台间的可移植性

HDFS被设计成可以简便地实现平台间的迁移,这将推动需要大数据集的应用更广泛地采用HDFS作为平台。

快照

快照支持在一个特定时间存储一个数据拷贝,快照可以将失效的集群回滚到之前一个正常的时间点上。HDFS已经支持元数据快照。

数据块

  1. HDFS的设计是用于支持大文件的。

  2. 运行在HDFS上的程序也是用于处理大数据集的。-----这个才是最想要的

这些程序仅写一次数据一次或多次读数据请求,并且这些读操作要求满足流式传输速度。HDFS支持文件的一次写多次读操作。HDFS中典型的块大小是64MB,一个HDFS文件可以被切分成多个64MB大小的块,如果需要,每一个块可以分布在不同的数据节点上。---默认块的大小是128M

 HDFS是设计来存储和管理大数据的,因此典型的HDFS块大小明显比平时我们看到的传统文件系统块大得多,块大小的设置用来将大文件切割成一个数据块,再将这些数据块分发到集群上,

例如集群的块大小设置为64MB,一个128MB的文件上传到HDFS上,HDFS会将这个文件切分成2(128/64)个数据块,再将这两块数据分发到集群的数据节点上。

  • 设置块大小:打开hdfs-site.xml,(在hadoop安装目录下的conf文件夹里)
  • 操作步骤:设置hdfs-site.xml下面的属性值:


<property>
<name>dfs.block.size</name>
<value>134217728</value>    --修改为128M
<description>Block size</description>
</property>


hdfs-site.xml是HDFS的配置文件,修改hdfs-site.xml配置文件的dfs.block.size属性值就会改变上传到HDFS所有文件的默认块大小。修改这个值并不会对HDFS上现存的任何文件的块大小产生影响,只会改变新上传文件的块大小。

存储空间回收

文件删除和恢复删除

当一个文件被用户或程序删除时,它并没有立即从HDFS中删除。HDFS将它重新命名后转存到/trash目录下这个文件只要还在/trash目录下保留就可以重新快速恢复。文件在/trash中存放的时间是可配置的。存储时间超时后,名字节点就将目标文件从名字空间中删除,同时此文件关联的所有文件块都将被释放。注意,用户删除文件的时间和HDF系统回收空闲存储之间的时间间隔是可以估计的。

删除一个文件之后,只要它还在/trash目录下,用户就可以恢复删除一个文件。如果一个用户希望恢复删除他已经删除的文件,可以查找/trash目录获得这个文件。/trash目录仅保存最新版本的删除文件。/trash目录也像其他目录一样,只有一个特殊的功能,HDFS采用一个特定的策略去自动地删除这个目录里的文件,当前默认的策略是删除在此目录存放超过6小时的文件。以后这个策略将由一个定义好的接口来配置。

减少复制因子

当文件的复制因子减少了,名字节点选择删除多余的副本(这个删除的信号有点奇怪),下一次的心跳包的回复就会将此信息传递给数据节点。

然后,数据节点移除相应的块,对应的空闲空间将回归到集群中,需要注意的就是,在setReplication函数调用后和集群空闲空间更新之间会有一段时间延迟。

文件命名空间

HDFS支持传统的继承式的文件组织结构

  • 一个用户或一个程序可以创建目录,存储文件到很多目录之中
  • 文件系统的名字空间层次和其他的文件系统相似。可以创建、移动文件,将文件从一个目录移动到另外一个,或重命名。
  • HDFS还没有实现用户的配额和访问控制。
  • HDFS还不支持硬链接和软链接。然而,HDFS结构不排斥在将来实现这些功能。

名字节点维护文件系统的命名空间,任何文件命名空间的改变和或属性都被名字节点记录。应用程序可以指定文件的副本数文件的副本数被称作文件的复制因子,这些信息由命名空间来负责存储。

数据复制-----即一个文件被分成多块,且每块有默认3个备份

HDFS设计成能可靠地在集群中大量机器之间存储大量的文件,它以块序列的形式存储文件。文件中除了最后一个块,其他块都有相同的大小。属于文件的块为了故障容错而被复制。块的大小和复制数是以文件为单位进行配置的,应用可以在文件创建时或者之后修改复制因子。HDFS中的文件是一次写的,并且任何时候都只有一个写操作-------啥子意思

名字节点负责处理所有的块复制相关的决策。它周期性地接受集群中数据节点的心跳和块报告。一个心跳的到达表示这个数据节点是正常的一个块报告包括该数据节点上所有块的列表

HDFS运行在跨越大量机架的集群之上。两个不同机架上的节点是通过交换机实现通信的,在大多数情况下,相同机架上机器间的网络带宽优于在不同机架上的机器。

3.0.0环境搭建(单机版)

根据官网的说明,选择的是最新的文抵挡版本hadoop-3.3.0.tar.gz,官网地址:

免密登录

举例A机器要免密登录B机器。则首先需要把A机器的公钥id_rsa.pub 传送给B机器,B机器将A机器的公钥内容放置本机的文件authorized_keys中。然后就可以在A机器上使用命令 “ssh 机器名”进行访问了。

涉及到的命令如下:

#hostname用于显示或者设置该主机的名字
[root@cuiyaonan2000 soft] hostname 机器名字

#安装工具
[root@cuiyaonan2000 soft] yum install -y ssh-keygen

#安装工具
[root@cuiyaonan2000 soft] yum install -y ssh-copy-id

#生成本机的公钥与私钥
[root@cuiyaonan2000 soft] ssh-keygen -t rsa

#转移到公钥私钥目录
[root@cuiyaonan2000 soft] cd ~/.ssh/

#生成authorized_keys 文件用于存储公钥内容
[root@cuiyaonan2000 soft] touch authorized_keys

#修改权限
[root@cuiyaonan2000 soft] chmod 600 authorized_keys


#将其它主机的公钥内容 追加到authorized_keys 中
[root@cuiyaonan2000 soft] cat id_rsa.pub >> authorized_keys

提前的准备

根据官网:Apache Hadoop 3.3.1 – Hadoop: Setting up a Single Node Cluster.  的要求我们可以看到起详细的需求

如下是为Hadoop配置环境变量,jdk就不包含在内了。

#下载hadoop,建议使用迅雷下载,比较大有500m左右
[root@cuiyaonan2000 soft] wget https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/stable/hadoop-3.3.0.tar.gz


#解压hadoop
[root@cuiyaonan2000 soft] tar -zxvf hadoop-3.3.0.tar.gz

#编辑profile文件
[root@cuiyaonan2000 soft] vi /etc/profile

#增加如下的内容
export HADOOP_HOME=/soft/hadoop/hadoop-3.3.0
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-DJava.library.path=$HADOOP_HOME/lib"
export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native


[root@cuiyaonan2000 soft] source /etc/profile

#查看hadoop 是否配置成功
[root@cuiyaonan2000 soft] hadoop version


修改配置文件(这些配置文件全都在etc/hadoop 中)

hadoop-env.sh(这个总是忘记)

进入目录:hadoop-3.3.0/etc/hadoop 修改 hadoop-env.sh 文件 ,增加内容 export JAVA_HOME=/soft/jdk/jdk1.8.0_271
 

core-site.xml

进入目录:hadoop-3.3.0/etc/hadoop 修改 core-site.xml 文件,并在<configuration>中增加如下的内容

如下的hadoop.tmp.dir的配置要注意。

<!--

1.配置默认采用的文件系统。
(由于存储层和运算层松耦合,要为它们指定使用hadoop原生的分布式文件系统hdfs。
value填入的是uri,参数是 分布式集群中主节点的地址 : 指定端口号)

2.其中localhost可以换成机器名称
 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000/</value>
</property>


<!-- 
配置hadoop的公共目录
(指定hadoop进程运行中产生的数据存放的工作目录,NameNode、DataNode等就在本地工作目录下建子目录存放数据。但事实上在生产系统里,NameNode、DataNode等进程都应单独配置目录,而且配置的应该是磁盘挂载点,以方便挂载更多的磁盘扩展容量)
-->
<property>
<name>hadoop.tmp.dir</name>
<value>/soft/data_hadoop</value>
</property>

hdfs-site.xml

##设置文件拆分成blocks副本备份的数量
<property>
<name>dfs.replication</name>
<value>2</value>
</property>


  #设置NameNode数据存储目录
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>file:/soft/namenode</value>
  </property>
 
	#设置DataNode数据存储目录
   <property>
    <name>dfs.datanode.data.dir</name>
    <value>file:/soft/datanode</value>
   </property>


 #这里在不加的话 hdfs的网站访问不了
   <property>
    <name>dfs.http.address</name>
    <value>0.0.0.0:50070</value>
   </property>

#这里可以考虑取消写入权限限制否则只能通过命令hadoop fs -chmod 777 /soft/hadoop/warehouse/student 来增加针对某个目录的写权限

<property>
       <name>dfs.permissions</name>
        <value>false</value>
   </property>

mapred-site.xml

<!--
指定MapReduce程序应该放在哪个资源调度集群上运行。若不指定为yarn,那么MapReduce程序就只会在本地运行而非在整个集群中运行。
-->

<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>

yarn-site.xml

<!-- 1.指定yarn集群中的老大(就是本机) -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>localhost</value>
</property>


<!-- 2.配置yarn集群中的重节点,指定map产生的中间结果传递给reduce采用的机制是shuffle
-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>

<!-- 这个就是配置yarn的管理界面 -->
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>mzdapip:8088</value>
<description>配置外网只需要替换外网ip为真实ip,否则默认为 localhost:8088</description>
</property>

启动Hadoop(命令都在sbin文件夹下)

格式化HDFS中的数据(从命令上看是清除namenode上存储的数据)

必须在启动的时候先执行namenode 的格式化。否则会有问题

[root@cuiyaonan2000 soft] hadoop namenode -format

启动hdfs和yarn

  1. start-dfs.sh :启动dfs,对应的关闭是stop-dfs.sh,   启动后可以访问管理界面:http://10.1.80.187:50070/dfshealth.html#tab-overview
  2. start-yarn.sh :启动yarn,对应的关闭是stop-yarn.sh   启动后可以访问管理界面:http://10.1.80.187:8088/cluster
  3. yarn-daemon.sh start resourcemanager : 启动yarn管理节点
  4. yarn-daemon.sh start nodemanager: 启动yarn运算节点
  5. start-all.sh :一键全部启动

如果遇到如下的问题

对于start-dfs.sh和stop-dfs.sh文件,添加下列参数:

HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root


#如果是高可用启动需要增加如下内容
HDFS_JOURNALNODE_USER=root
HDFS_ZKFC_USER=root

对于start-yarn.sh和stop-yarn.sh文件,添加下列参数:

#!/usr/bin/env bash
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root

成功启动dfs的进程截图如下所示:

成功启动yarn的进程截图如下所示:

3.0.0环境搭建(分布式集群)

修改配置文件(这些配置文件全都在etc/hadoop 中)

hadoop-env.sh(这个总是忘记)

进入目录:hadoop-3.3.0/etc/hadoop 修改 hadoop-env.sh 文件 ,增加内容 export JAVA_HOME=/soft/jdk/jdk1.8.0_271

core-site.xml

<!--

1.配置默认采用的文件系统。
(由于存储层和运算层松耦合,要为它们指定使用hadoop原生的分布式文件系统hdfs。
value填入的是uri,参数是 分布式集群中主节点的地址 : 指定端口号)

2.其中localhost可以换成机器名称
 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000/</value>
</property>


<!-- 
配置hadoop的公共目录
(指定hadoop进程运行中产生的数据存放的工作目录,NameNode、DataNode等就在本地工作目录下建子目录存放数据。但事实上在生产系统里,NameNode、DataNode等进程都应单独配置目录,而且配置的应该是磁盘挂载点,以方便挂载更多的磁盘扩展容量)
-->
<property>
<name>hadoop.tmp.dir</name>
<value>/soft/data_hadoop</value>
</property>

hdfs-site.xm

这里就是将原来的内容进行增删.单机的话是同时存在 DataNode 和 NameNode 的.现在是多机。所以现在2者并不需要并存--------------那是否预示着如果存在dfs.datanode.data.dir就表示有datanode,没有就不会创建datanode????

<property>
    <!-- 主节点地址 -->
    <name>dfs.namenode.http-address</name>
    <value>mzdapip:50070</value>
</property>


##设置文件拆分成blocks副本备份的数量
<property>
<name>dfs.replication</name>
<value>2</value>
</property>


  #设置NameNode数据存储目录
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>file:/soft/namenode</value>
  </property>
 
	#设置DataNode数据存储目录
   <property>
    <name>dfs.datanode.data.dir</name>
    <value>file:/soft/datanode</value>
   </property>


 #这里在不加的话 hdfs的网站访问不了
   <property>
    <name>dfs.http.address</name>
    <value>0.0.0.0:50070</value>
   </property>

mapred-site.xml----注意这里增加主机的指向

<!--
指定MapReduce程序应该放在哪个资源调度集群上运行。若不指定为yarn,那么MapReduce程序就只会在本地运行而非在整个集群中运行。
-->

<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>

<property>
	<name>mapred.job.tracker</name>
    <value>mzdapip:54311</value>
</property>

<property>
          <name>mapreduce.jobhistory.address</name>
          <value>mzdapip:10020</value>
  </property>

  <property>
          <name>mapreduce.jobhistory.address</name>
          <value>mzdapip:19888</value>
</property>

yarn-site.xml

#指定yarn的ResourceManager管理界面的地址,不配的话,Active Node始终为0 
#这里必须添加
<property>
     <name>yarn.resourcemanager.hostname</name> 
     <value>mzdapip</value>
</property>


<!-- 2.配置yarn集群中的重节点,指定map产生的中间结果传递给reduce采用的机制是shuffle
-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>


<!-- 这个就是配置yarn的管理界面 -->
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>mzdapip:8088</value>
<description>配置外网只需要替换外网ip为真实ip,否则默认为 localhost:8088</description>
</property>

workers------从主节点上启动,会去启动这里面包含的子节点。

这里增加工作节点的ip或者机器名,如:

并且主节点上只会启动如下的服务:

子节点上启动的服务如下所示:----只有DataNode,NodeManager

启动

无论有多少台服务器,他们的hadoop存放的绝对路径必须一致,否则不能从主节点上去启动其它的服务。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cuiyaonan2000

给包烟抽吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值