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 官网文档的一个结构图,其中主要描述的就是三大块。

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 版权协议,转载请附上原文出处链接及本声明。
相关推荐
猜你还喜欢这些内容,不妨试试阅读一下评论与留言
以下内容均由网友提交发布,版权与真实性无法查证,请自行辨别。微信订阅号
扫码关注「任霏博客」微信订阅号- 大佬 引入jar包那里的 driver class 怎么选的?
- 我也遇到了这个问题,已经解决了,在此分享一下 1、宿主机也要创建kingbase的用户和用户组,并且要查看一下用户和用户组的ID(这个很重要) 2、把data目录的用户和用户组设置为kingbase 3、先不要把data路径挂载到宿主机上,这时就可以正常启动,启动后进入容器,查看一下容器内的kingbase的用户和用户组ID是多少,和第一步的ID是否一致,如果ID一致,那正常挂载目录就行;如果ID不一致,那就需要修改Dockerfile文件,在构建镜像时,修改容器内的用户和用户组ID,必须和宿主机的保持一致。然后重新构建镜像,就可以正常挂载宿主机目录了 4、其实直接修改宿主机的用户和用户组ID也是可以的,但是容器内的ID一般是1000,但是宿主机的这个ID很可能已经被占用了,无法修改,就只能修改容器内的ID
- 接口已经允许跨域请求,也就是说你可以在你的页面上调用,获取用户的公网 IP。 如果你还需要其他需求,可以提交 Issue 给我。
- V008R003C002B0320 这个对应的jdbc链接驱动你在哪里找到的?我也遇到了这个问题。
- WARNING: max_connections should be less than orequal than 10 (restricted by license) HINT: the value of max_connect is set 10 WARNING: max_connections should be less than orequal than 10 (restricted by license) HINT: the value of max_connect is set 10 kingbase: superuser_reserved_connections must be less than max_connections 我按照文档修改了以后,不知道如何重启。
- 然后把数字都改成 1 再启动。 如何重新启动?
- ksql: could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/tmp/.s.KINGBASE.54321"
- 进入容器查看一下日志,是不是启动失败了,日志文件在:/opt/kingbase/logfile
- ksql: could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/tmp/.s.KINGBASE.54321"?
- 先通过 docker exec -it 容器名/id /bin/bash 进入容器,然后在容器中使用 ksql 客户端进行连接数据库:/opt/kingbase/Server/bin/ksql -U system test
- 免费.ml域名10年委托合同到期被马里共和国收回域名经营权
- 从极狐Gitlab看各种中间件技术选型
- 时隔十年首次收到 Google AdSense 的付款
- ga域名被加蓬共和国从Freenom公司手中收回域名经营权
- Freenom 被 Meta(Facebook) 起诉导致暂停 .tk/.ga/.ml/.cf/.gq 等新域名注册
- 生花妙笔信手来 – 基于 Amazon SageMaker 使用 Grounded-SAM 加速电商广告素材生成 [1]
- github.renfei.net 不再完整代理 Github 页面改为代理指定文件
- 优雅的源代码管理(三):本地优雅的使用 Git Rebase 变基
- 优雅的源代码管理(二):Git 的工作原理
- 优雅的源代码管理(一):版本控制系统 VCS(Version Control System)与软件配置管理 SCM(Software Configuration Management)