2021-03-12 11:58:59

Hadoop入门教程(五):HDFS 分布式文件系统


Hadoop入门教程(五):HDFS 分布式文件系统

HDFS是指 Hadoop Distributed File System,Hadoop分布式文件系统。HDFS是一个高度容错性的系统,适合部署在廉价的机器上。HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。

HDFS的特点

任何事物都有优缺点,世界上没有完美的东西,大数据使用 Hadoop 并不是说它很完美,而是暂时没有找到比它更好的解决方案。

HDFS的优点

HDFS的设计天生就是数据冗余的,所以数据会很安全,有很高的容错性,即使其中一个节点整个丢失也不会影响数据安全,因为数据将被分布在多个节点,并且存储多份,所以我们可以使用廉价的机器来存储我们宝贵的数据。

同时分布式的设计可以让集群拥有非常大的存储容量,可以是GB、TB、PB甚至是EB的容量。

HDFS的缺点

因为它的优点就会带来缺点,因为文件被分布在多个节点,所以获取文件的延迟就很严重,不像是单硬盘中获取数据那样毫秒级的读写数据。

同时因为 HDFS 是采用分布式存储,这就需要 NameNode 的帮助来记录文件分布在哪里,如果你有大量的小文件存储需求,也是不适合的,这会给 NameNode 带来非常大的压力。

不支持文件并发写和随机修改,也就是说 HDFS 并不能像硬盘那样随时修改数据,而是只能追加文件或者写入以后只进行读取操作。

HDFS的组成

这里引用 Hadoop 官网文档的一个结构图,其中主要描述的就是三大块。

HDFS的组成

NameNode

NameNode是Master主管,它负责管理 HDFS、副本策略、数据块(Block)映射信息、处理客户端的读写请求。

DataNode

DataNode是Slave从属,它负责存储实际的数据块(Block)、读写数据

Client

Client是客户端,客户端对数据进行切分成多个数据块(Block)进行上传,与 NameNode 交互获取文件数据块(Block)的位置信息,与 DataNode 交互读写数据,主要通过客户端对 NameNode 下达命令。

HDFS的Block

HDFS 文件系统跟我们日常使用的硬盘还有个最大的不同之处就是数据块(Block),HDFS 并不是存储一个一个的文件,而是一个一个的数据块(Block),然后把数据块(Block)一个一个的存储在不同的集群节点中,需要提取文件的时候再从各个集群节点中提取出数据块(Block),恢复成我们原始的文件。

数据块(Block)的大小可以通过配置进行改变,但默认 Hadoop2.x 是128MB,Hadoop1.x 是64MB。

为什么是128M呢

我们需要先关注一下读取文件都发生了什么?

1.去询问 NameNode 我需要的文件都在哪里,这个叫寻址

2.去对应的 DataNode 读取数据块(Block),这里才是实际传输数据

假设我们的数据块(Block)很小,那么就会产生非常多的数据块(Block),在第一步寻址就会花费很长时间;那加入数据块(Block)很大呢,虽然数据块(Block)数量会减少,寻址会很快,但第二步可能就会很慢,因为硬盘的IO性能也是有限的。

目前市面上的机械硬盘读取速度都在 100MB/S 左右,如果将数据块(Block)设置成128M基本就是每秒读取一个数据块(Block),而寻址时间基本是10ms左右,这样搭配更合理一些,所以如果你的磁盘性能比较高的话可以将数据块(Block)调大,反之调小。我们使用默认的就可以。

HDFS的Shell命令

关于 HDFS 的 Shell 命令,我就不说太多了,因为我讲的话也是去抄官方文档,不如直接去看官方文档:https://hadoop.apache.org/docs/r2.10.1/hadoop-project-dist/hadoop-hdfs/HDFSCommands.html。

我只讲几个常用的给起个头,剩下的就得自己看文档了。其实 HDFS 的操作和 Linux 中的操作十分像,所以上手会很快,来举个例子。

bin/hadoop fs 具体命令

显示目录信息:hadoop fs -ls /

创建文件夹:hadoop fs -mkdir -p /renfei/test

显示文件内容:hadoop fs -cat /renfei/test/hadoop.txt

是不是和 Linux 的操作一样的命令?所以我就不再啰嗦了,直接看官方文档吧。下一篇我们将使用编程的方式操作 HDFS。



商业用途请联系作者获得授权。
版权声明:本文为博主「任霏」原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://www.renfei.net/posts/1003462
评论与留言
以下内容均由网友提交发布,版权与真实性无法查证,请自行辨别。

本站有缓存策略,时间约2小时后能看到您的评论。本站使用自动审核机制,如果您的内容包含广告/谩骂/恐怖/暴力/涉政等不和谐内容将无法展示!


本站有缓存策略,时间约2小时后能看到您的评论。本站使用自动审核机制,如果您的内容包含广告/谩骂/恐怖/暴力/涉政等不和谐内容将无法展示!

关注任霏博客
扫码关注「任霏博客」微信订阅号
微博:任霏博客网
Twitter:@renfeii
Facebook:任霏
最新留言 优先级低的并不代表一定要等到优先级高的运行完才能运行,只是cpu分配的资源少了而已。 /lib64/ld-linux-x86-64.so.2: No such file or directory 报了这个错误,怎么解决呢 对于一个布道 DevOps 多年的选手来讲,看到这个报告,还是想继续布道布道。虽然是各种对比哈,但是我感觉与 DevOps 太像了(可能是职业病犯了哈)。首先声明本人不是GitLab 用户(因为不免费,没法薅羊毛啊),本人是 GitHub 忠实用户。 首先,你这是田忌赛马的对比,中文对比一事,着实有点可笑 1 土生土长和外来户能立马拉到同一个起跑线上吗? 2 一个真正的开发者应该去提升自己的英语能力,而不是拿全部是中文文档说事。大家都知道现在开源非常热,开发者是开源的主力军,如果要贡献优秀的开源项目(诸如Linux 内核,Kubernetes),英语就是个硬门槛。如果我是你,我倒希望公司内部的系统是英文的,最起码能让我锻炼英语,在看开源项目文档的时候不至于看不懂,提 PR 的时候不至于提交代码的内容描述不清楚而没法被 Merge。 其次,阿里云效、Coding 大家都知道背后站的是谁,很容易造成厂商绑定,现在很多企业都希望不要被厂商绑定。 再者,有一个点需要明白,GitLab 是一个 DevOps 平台,什么叫做 DevOps 平台(DevOps 走到现在,确切的说应该叫做 DevSecOps)?就是覆盖了软件开发生命周期全阶段的,从项目管理到代码托管到安全再到日志监控、甚至包含现在的云原生能力。不仅仅是说一个 CI/CD 就能概括的了的。这一点是 DevOps 布道的真正误区,我见过太多了,我在这儿再布道一哈,CI/CD 不等于 DevOps,他只是 DevOps 落地实践的核心能力。仅凭借一个 CI/CD 能有现成模版就判断出哪个好坏,过于牵强了吧。相信大家真正到项目用的时候,模版是满足不了要求的吧,毕竟大家都很特性化。 最后,还是一个很热的话题,开源,open source。GitLab 是开源的,Coding 和 云效这方面我没看到相关的开源内容(可能是我孤陋寡闻)。大家可以看看国内有多少用 GitLb 的,GitLab 的 CE 版,然后私有化部署,就是很多公司的代码托管 + DevOps 解决方案。 个人愚见,做一些对比报告的时候,还是先需要明白这个产品的定位,去深入挖掘一些真正有意义的对比,这样的对比报告才能有意义。作为一个常年写博客、文章的人来说。你写的每个字、每篇文章,你要想到你的思想会影响到别人。有可能因为你的片面之词,让别人错失一些学习的好机会。 docker run 那一长串后,出来一个字符串,然后去 docker containers 下面看 显示 exited(1);logs 下就一行错误 initdb failed 感谢🙏,第一个问题是空格的问题应该,我逐字敲完后可以构建了.第二个问题是我docker环境的问题,docker更新为最新版后需要重置配置文件.现已经正常使用,再次感谢您的分享和您的细心解答,期待下次相遇😄 还有一个问题可以请教下吗?就是我在容器里建文件夹没有权限,su root后密码不知道是多少,sudo mkdir xxx 提示我,没有sudo命令,请问有好的解决方法吗?谢谢解答 -v 后面可以指定文件吗 我的也是报错,还有。我执行了这个:@localhost kingbase-es-v8-r3-docker % docker run -d --name kingbase -p 54321:54321 -e SYSTEM_PWD=SYSTEM -v /opt/kingbase/data:/opt/kingbase/data -v /opt/kingbase:/opt/kingbase/Server/bin kingbase:v8r3 docker: 'run -d --name kingbase -p 54321:54321 -e SYSTEM_PWD=SYSTEM -v /opt/kingbase/data:/opt/kingbase/data -v /opt/kingbase:/opt/kingbase/Server/bin kingbase:v8r3' is not a docker command. See 'docker --help' 麻烦帮忙看下,是不是我写的命令有问题,还是版本问题,谢谢啦 请问我build的时候一直报错,是资源没了吗?failed to solve with frontend dockerfile.v0: failed to create LLB definition: failed to do request: Head "https://reg-mirror.qiniu.com/v2/library/centos/manifests/7?ns=docker.io": Moved Permanently 能不能在代码那里详细解释一下啊,没完全懂呀 en 按照路径上的来操作的,但是启动时一直报:zsh: no such file or directory: docker run -d --name kingbase -p 54321:54321 -e SYSTEM_PWD=SYSTEM -v /Volumes/installation/opt/kingbase/data:/opt/kingbase/data -v /Volumes/installation/opt/kingbase/bin/license.dat:/opt/kingbase/Server/bin/license.dat kingbase:v8r3 错误