阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

深入浅出Hadoop之HDFS

166次阅读
没有评论

共计 4296 个字符,预计需要花费 11 分钟才能阅读完成。

Hadoop 生态系统一直是大数据领域的热点,其中包括今天要聊的 HDFS,和计划以后想聊的 yarn, mapreduce, spark, hive, hbase, 已经聊过的 zookeeper,等等。

深入浅出 Hadoop 之 HDFS

今天主聊 HDFS,hadoop distributed file system, 起源于 Google 的 GFS,只不过 GFS 是用 c ++ 写的,Hadoop 是 Doug Cutting 在 yahoo 用 Java 写的。2008 年 Hadoop 成为 Apache top-level project。

应用

HDFS 适用于什么场景呢?非常大的文件存储,比如以 G 或 T 为单位,因为 HDFS 内部的 block 的基本单位已经是 128MB。注意这里有一个小文件问题,误区是说怕 1K 的小文件也能占用 128MB 的硬盘,其实不是的,它还是占用 1K 硬盘,但是小文件问题的 bottle neck 是在 name node 里,因为 name node 要存储文件和 block 的相关信息在内存里,文件数量一多,name node 的内存就不够了(比如,百万小文件要占用 300MB 内存),当然 hdfs federation 能够通过 sharding 的方式解决 name node 内存不够用的问题,接下来会细说。HDFS 还适用于“write once,read-many”的场景,而且它的写是 append only,所以想改也没法改。如果是多次写的话,应该考虑一下 cassandra(参见我的上一篇文章)。同时 HDFS 的文件通常只能允许 single writer 写入(是通过 lease 的方式来保证只有一个 writer 能够当前写某个文件)。HDFS 因为只需要普通的 commodity hardware 而不需要昂贵的高可用硬件而被企业欢迎。HDFS 不适用于需要 low latency 的数据访问方式,因为 HDFS 是拿延迟交换高 throughput。

概念

Blocks

HDFS 里,文件是被分割成 block 大小的 chunk,每个 block 是 128MB,有人会问了,为什么非要搞这么大,主要是要缩短寻道时间在总硬盘读写时间中的比例,比如寻道时间需要 5 ms,而寻到时间只能占总时间 0.5% 的比例,那么硬盘读写时间差不多在 1s 左右,1s 中能穿多少文件呢,如果硬盘的读写为 128MB/s,那么就能传 128MB,所以 block 大小就定义为 128MB,这样可以保证硬盘操作的时间有效的应用在读写上而不是花费在寻道上。当然太大了也不行,mapreduce 的 map 通常是以 block 为单位,如果 block 太少,mapreduce 的效率会比较低。

hdfs fsck $path -files -blocks -locations

上面的命令可以用来提供文件的 block 信息,比如 block 在哪台机器,名字是什么,方便你进一步查询 block 的具体信息。

Namenodes and datanodes

深入浅出 Hadoop 之 HDFS

namenode 管理 namespace,管理文件系统树状结构和文件/目录的 metadata,这些信息以如下方式持久化在硬盘里:namespace image 和 edit log。同时 block 的 metadata 也存放在 namd node,存放于内存中。前面提到过百万小文件,会占用 300MB 内存的例子。block 信息为什么不持久化呢,因为它会变动,系统重启的时候会从 datanode 那里重新构建。

name node 的备份有几种方式,一种是把持久化存放于硬盘的信息既写到本地硬盘也同时写到远程 NFS mount。另一种方式是运行 secondary namenode,它其实并没有扮演 namenode 的角色,而是周期性的 merge namesapce image 以及 edit log 来防止 edit log 过大。它会保存一份 merged namespace image,一旦 primary fail 了,就把 NFS 上的 metadata copy 到 secondary namenode 上,这样 secondary 就成为了新的 primary。

具体过程如下图所示,edit log 和 fsimage 都是在硬盘中,edit log 就是 WAL(cassandra 写操作也用到了 WAL 的手段,WAL 很流行,可以单拉出来讲一次),fsimage 是 check point of the filesystem metadata。写的时候先写 edit log,然后 update in-memory representation of filesystem metadata(用来 serve 读请求),图中没有画出这部分操作。

深入浅出 Hadoop 之 HDFS

 

有没有更好的方法呢?上述方法没能提供 HA,namenode 仍然是 single point of failure。新的 primary 需要(1)load namespace image into memory(2)replay edit log(3)从 datanode 那边接收足够的 block reports(前文提到 block 信息是在内存中的)。这个过程有可能会话费 30 分钟或更久。client 等不了啊~~

Hadoop 2 提供了 HA 的 support。namenode 采用 active-standby 的配置方式:

  • namenodes 使用高可用共享存储来存 edit log。active 每次写入都会被 standby 读出并 synchronize 到自己的内存中。
  • datanodes 在发送 block reports 时会同时发给所有的 name nodes,记住 block mapping 是在内存中。
  • 客户端需要配置来 handle namenode failover,其实就是 watch zookeeper 的 leader election(参见我之前讲的 zookeeper)
  • 这样就不需要 secondary namenode 啦,standby 取代了它的作用会周期性的产生 check points

上面提到的共享存储主要指的是 QJM(quorum journal manager),通常配置 3 个(当然我也见过 50 个 node 配 5 个 journal nodes),写的时候需要满足 quorum。

这样当 active namenode fail 时,standby 可以马上扛住,因为 latest edit log 和 up-to-date block mapping 都在内存中。

HDFS write

深入浅出 Hadoop 之 HDFS

HDFS read

深入浅出 Hadoop 之 HDFS

CLI Example

touch test.txt
hdfs dfs -mkdir /user/qingge/testdir
hdfs dfs -copyFromLocal ./test.txt /user/qingge/testdir/
hdfs dfs -ls /user/qingge/testdir/test.txt
hdfs dfs -chmod o-r /user/qingge/testdir/test.txt hdfs dfs -cat /user/qingge/testdir/test.txt | head -10
hdfs dfs -mv /user/qingge/testdir/test.txt /user/qingge/testdir/test2.txt

hdfs fsck /data/lalala -files -blocks -locations
hdfs fsck -blockId blk_10101010

HTTP 访问

(1) direct access: HDFS daemons server HTTP requests, embedded web servers in the name node and datanodes act as WebHDFS endpoionts.

深入浅出 Hadoop 之 HDFS

(2) proxy access: 中间有多个 HDFS proxy,for strictr firewall and bandwidth-limiting policies, proxy 和 node 之间使用 RPC request 和 block request。

深入浅出 Hadoop 之 HDFS

HDFS Federation

相当于 namenode sharding 了,如果不想用 HA,然后 namenode 内存又要爆了怎么办,答分区呀,每个 namenode 从根目录下划走几个子目录,无线分区无线扩充,每个 namenode 之间井水不犯河水,一个爆了或废了丝毫不影响另一个。

思考题:

如果 HDFS 有 1PB 容量,每个 block 大小是 64MB,平均的 metadata 大小是每个 block300B,replication factor 是 3,那么 namenode 最小的内存是多少呢?

答:差不多需要 1.56G,1024*1024*1024 MB/(64MB*3)*300B/(1024 * 1024 * 1024) = 1.56 GB

好,今天差不多就到这了~~ happy HDFS!

Hadoop2.3-HA 高可用集群环境搭建  http://www.linuxidc.com/Linux/2017-03/142155.htm

Hadoop 项目之基于 CentOS7 的 Cloudera 5.10.1(CDH)的安装部署  http://www.linuxidc.com/Linux/2017-04/143095.htm

Hadoop2.7.2 集群搭建详解(高可用)http://www.linuxidc.com/Linux/2017-03/142052.htm

使用 Ambari 来部署 Hadoop 集群(搭建内网 HDP 源)http://www.linuxidc.com/Linux/2017-03/142136.htm

Ubuntu 14.04 下 Hadoop 集群安装  http://www.linuxidc.com/Linux/2017-02/140783.htm

CentOS 6.7 安装 Hadoop 2.7.2  http://www.linuxidc.com/Linux/2017-08/146232.htm

Ubuntu 16.04 上构建分布式 Hadoop-2.7.3 集群  http://www.linuxidc.com/Linux/2017-07/145503.htm

CentOS 7 下 Hadoop 2.6.4 分布式集群环境搭建  http://www.linuxidc.com/Linux/2017-06/144932.htm

Hadoop2.7.3+Spark2.1.0 完全分布式集群搭建过程  http://www.linuxidc.com/Linux/2017-06/144926.htm

更多 Hadoop 相关信息见 Hadoop 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=13

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2018-02/150811.htm

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-21发表,共计4296字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中