[TOC]


HDFS(Hadoop Distributed File System):分布式存储

    NameNode    是整个文件系统的管理节点。它维护着整个文件系统的文件目录树,文件/目录的元信息和每个文件对应的数据块列表。接收用户的操作请求。文件包括:1)fsimage:元数据镜像文件。存储某一时段NameNode内存元数据信息。2)edits:操作日志文件。3)fstime:保存最近一次checkpoint的时间以上这些文件是保存在linux的文件系统中。查看NameNode内容bin/hdfs oiv -p XML -i  fsimage-path  -o fsimage.xmlbin/hdfs oev -p XML -i  edits-path  -o edits.xml主要配置选项:hdfs-site.xml的<property><name>dfs.namenode.name.dir</name><value>/opt/hadoop-repo/name</value></property>通过HDFS命令查看fsimage文件:hdfs oiv -p XML -i fsimage_0000000000000000115 -o fsimage.xml查看hdfs://uplooking:9000/hello<inode><id>16386</id><type>FILE</type><name>hello</name><replication>1</replication><mtime>1499706594113</mtime><atime>1499706593097</atime><perferredBlockSize>134217728</perferredBlockSize>//128M<permission>root:supergroup:rw-r--r--</permission><blocks><block><id>1073741825</id><genstamp>1001</genstamp><numBytes>29</numBytes></block></blocks></inode>通过HDFS命令查看edits操作文件hdfs oev -p XML -i edits_0000000000000000004-0000000000000000115 -o edits.xml

DataNode

    提供真实文件数据的存储服务。文件块(block):最基本的存储单位。对于文件内容而言,一个文件的长度大小是size,那么从文件的0偏移开始,按照固定的大小,顺序对文件进行划分并编号,划分好的每一个块称一个Block。HDFS默认Block大小是128MB,以一个256MB文件,共有256/128=2个Block。不同于普通文件系统的是,HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间Replication。多复本。默认是三个。hdfs是专门为大文件设计文件系统,而不是为小文件设计的问题。hdfs不适合存储小文件?因为hdfs需要在内存中存放datanode中数据的元数据信息,如果存放过多的小文件的话,会极大的浪费内存开销

HDFS Shell操作

    hdfs dfs -ls hdfs://uplooking:9000/ --->(hdfs的根目录)hdfs dfs -ls /hdfs文件权限说明-  rw-  r--  r--    1   root supergroup      29     2017-07-10 10:09        hdfs://uplooking01:9000/hellod  rwx  r-x  r-x    -   root supergroup      0      2017-07-10 10:12        hdfs://uplooking01:9000/output文 文件 文件 其它  备   文件  用户      文件      修改时间                文件在hdfs上面的路径件 用户 用户 用户  份   用户  所在      大小类 权限 组   权限 数           组型      权限-表示文件类型为文件d表示文件类型为目录用户权限有:r(read 读 4) w(write 写 2) x(execute 执行 1)rwx:7如果一个文件的权限是755:rwxr-xr-x-ls 浏览hdfs的具体目录hdfs dfs -ls [-R] /    --->-R递归浏览/目录查看文件内容:-cat 浏览hdfs上的一个文件内容,和linux本地的cat命令一样 hdfs dfs -cat /input/hadoop/hdfs/data.log-text  hdfs dfs -text /input/hadoop/hdfs/data.log-tail  hdfs dfs -tail /input/hadoop/hdfs/data.log创建目录:-mkdir:在hdfs上面创建一个目录,如果创建的是多级目录:使用 -mkdir -peg. hdfs dfs -mkdir -p /input/hadoop/hdfs文件移动:-copyFromLocal [-f] [linux_src_path hdfs_dest_path] 将linux本地的文件拷贝/上传到hdfs其中-f参数是强制上传,如果hdfs_dest_path已经存在,则覆盖之eg.hdfs dfs -copyFromLocal /hello /hello-1-copyToLocal-moveFromLocal-moveToLocal以上四个命令,都是用于在linux本地和hdfs之前传递文件,不是工作中最常用的命令-put-->就相当于-copyFromLocal---》从linux本地上传文件到hdfshdfs dfs -put data.log /input/hadoop/hdfs/-get-->就相当于-copyToLocal---》从hdfs下载文件到linux本地hdfs dfs -get /input/hadoop/hdfs/data.log aaa-cp--->从hdfs上面的路径A,拷贝相关目录到hdfs上面的路径Bhdfs dfs -cp /input/hadoop/hdfs/data.log /input/hadoop/hdfs/data.1.log-mv--->从hdfs上面的路径A,移动相关目录到hdfs上面的路径Bhdfs dfs -mv /input/hadoop/hdfs/data.log /input/hadoop/hdfs/data.2.log文件删除:-rm [-f] [-r|-R] hdfs目录:删除hdfs上面的指定目录eg. hdfs dfs -rm -R /out 删除hdfs上面的文件夹/out   

HDFS读写过程分析

HDFS读文件

1.首先调用FileSystem对象的open方法,其实是一个DistributedFileSystem的实例。

2.DistributedFileSystem通过rpc获得文件的第一个block的locations,同一block按照副本数会返回多个locations,这些locations按照hadoop拓扑结构排序,距离客户端近的排在前面。

3.前两步会返回一个FSDataInputStream对象,该对象会被封装成DFSInputStream对象,DFSInputStream可以方便的管理datanode和namenode数据流。客户端调用read方法,DFSInputStream最会找出离客户端最近的datanode并连接。

4.数据从datanode源源不断的流向客户端。

5.如果第一块的数据读完了,就会关闭指向第一块的datanode连接,接着读取下一块。这些操作对客户端来说是透明的,客户端的角度看来只是读一个持续不断的流。

6.如果第一批block都读完了,DFSInputStream就会去namenode拿下一批blocks的location,然后继续读,如果所有的块都读完,这时就会关闭掉所有的流。

如果在读数据的时候,DFSInputStream和datanode的通讯发生异常,就会尝试正在读的block的排第二近的datanode,并且会记录哪个datanode发生错误,剩余的blocks读的时候就会直接跳过该datanode。DFSInputStream也会检查block数据校验和,如果发现一个坏的block,就会先报告到namenode节点,然后DFSInputStream在其他的datanode上读该block的镜像。

该设计的方向就是客户端直接连接datanode来检索数据并且namenode来负责为每一个block提供最优的datanode,namenode仅仅处理block location的请求,这些信息都加载在namenode的内存中,hdfs通过datanode集群可以承受大量客户端的并发访问。

HDFS写文件

1.客户端通过调用DistributedFileSystem的create方法创建新文件

2.DistributedFileSystem通过RPC调用namenode去创建一个没有blocks关联的新文件,创建前,namenode会做各种校验,比如文件是否存在,客户端有无权限去创建等。如果校验通过,namenode就会记录下新文件,否则就会抛出IO异常.

3.前两步结束后会返回FSDataOutputStream的对象,象读文件的时候相似,FSDataOutputStream被封装成DFSOutputStream.DFSOutputStream可以协调namenode和datanode。客户端开始写数据到DFSOutputStream,DFSOutputStream会把数据切成一个个小packet,然后排成队列data quene。

4.DataStreamer会去处理接受data queue,他先问询namenode这个新的block最适合存储的在哪几个datanode里,比如副本数是3,那么就找到3个最适合的datanode,把他们排成一个pipeline.DataStreamer把packet按队列输出到管道的第一个datanode中,第一个datanode又把packet输出到第二个datanode中,以此类推。

5.DFSOutputStream还有一个对列叫ack queue,也是有packet组成,等待datanode的收到响应,当pipeline中的所有datanode都表示已经收到的时候,这时akc queue才会把对应的packet包移除掉。

如果在写的过程中某个datanode发生错误,会采取以下几步:1) pipeline被关闭掉;2)为了防止丢包ack queue里的packet会同步到data queue里;3)把产生错误的datanode上当前在写但未完成的block删掉;4)block剩下的部分被写到剩下的两个正常的datanode中;5)namenode找到另外的datanode去创建这个块的复制。当然,这些操作对客户端来说是无感知的。

6.客户端完成写数据后调用close方法关闭写入流

7.DataStreamer把剩余得包都刷到pipeline里然后等待ack信息,收到最后一个ack后,通知datanode把文件标示为已完成。

​ 另外要注意得一点,客户端执行write操作后,写完得block才是可见的,正在写的block对客户端是不可见的,只有调用sync方法,客户端才确保该文件被写操作已经全部完成,当客户端调用close方法时会默认调用sync方法。是否需要手动调用取决你根据程序需要在数据健壮性和吞吐率之间的权衡。

HDFS的常见运维命令

hdfs dfs -du -h /   --->查看根目录下每一个子目录文件的大小
hdfs dfs -df /      --->查看hdfs的磁盘占用情况du -lh --max-depth=1 linux_path(比如/)    ---->在linux下面查看linux_path目录的每一个第一级子目录大小

转载于:https://blog.51cto.com/xpleaf/2145099

Hadoop笔记整理(二):HDFS相关推荐

  1. Deep Learning(深度学习)学习笔记整理(二)

    本文整理了网上几位大牛的博客,详细地讲解了CNN的基础结构与核心思想,欢迎交流 [1]Deep learning简介 [2]Deep Learning训练过程 [3]Deep Learning模型之: ...

  2. Hadoop笔记整理(三):Zookeeper

    [TOC] 为了方便知识的管理,把zk归到hadoop知识中来进行整理. zookeeper基础知识 zookeeper概述 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Go ...

  3. 【Beetl笔记整理二】定义变量

    版权声明:本文为 小异常 原创文章,非商用自由转载-保持署名-注明出处,谢谢! 本文网址:https://sunkuan.blog.csdn.net/article/details/114737252 ...

  4. 老笔记整理二:网页小问题汇总

    最近有一些小问题.想在这里写出来.一是方便大家排错,再是自己也整理一下. 1.很傻的小问题...参数提交方式有一个应该是form而不是from.(英语老师,我对不起你...) 2.用超链接传参数,在? ...

  5. 【微信公众号开发(Java版)笔记整理二】消息处理

    版权声明:本文为 小异常 原创文章,非商用自由转载-保持署名-注明出处,谢谢! 本文网址:https://sunkuan.blog.csdn.net/article/details/117574310 ...

  6. hadoop 2 java hdfs_Hadoop2.6.0学习笔记(二)HDFS访问

    鲁春利的工作笔记,谁说程序员不能有文艺范? 通过hadoop shell与java api访问hdfs 工作笔记之Hadoop2.6集群搭建已经将集群环境搭建好了,下面来进行一些HDFS的操作 1.H ...

  7. HBase笔记整理(二)

    [TOC] HBase笔记整理(二) 逻辑结构 RowKey第一位ColumnFamilyColumnQuiauervalue(TimeStamps)Cell 物理结构 HMaster -----&g ...

  8. Hadoop笔记(1)——hdfs命令访问方式

    2019独角兽企业重金招聘Python工程师标准>>> 之前的CDH5.8.3安装部署就算是前菜.今天开始写正式的系列第一篇,给自己个完整的笔记整理. 其实目前随便找一本hadoop ...

  9. Deep Learning(深度学习)学习笔记整理系列之(二)

    Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...

最新文章

  1. Load data local infile 实验报告
  2. Acwing第 28 场周赛【完结】
  3. 2018年JavaWeb和移动程序员学习的12个框架
  4. 多分类可以分成多个独立的模型来训练
  5. Web 趋势榜:上周不可错过的最热门的 10 大 Web 项目 - 210416
  6. win10下装win7双系统_3步安装电脑双系统,win7+win10自由选择进入,你学会了吗?...
  7. Java开发笔记(一百零三)线程间的通信方式
  8. 快速检查REST API是否有效的方法-从清单文件中获取详细信息
  9. 外包以小时计算金额的费用_2020年初级会计各大税种的计算公式,请收藏!
  10. 通信服务器系统安装,pxe网络安装操作系统
  11. http-server搭建web服务器
  12. 史上最强三千六百道脑筋急转弯(5)
  13. 本地上传文件至Linux虚拟机报错“复制时发生出错“
  14. 计算机主机usb端口使用不了,电脑usb接口不能用怎么办
  15. 揭秘京东文件系统JFS的前世今生,支持双11每秒约10万个对象同时读写
  16. 解决nginx emerg bind to 80 failed 98 Address alrea
  17. outlook 默认打开ie_如何使用OUTLOOK联系人取代手机联系人,实现电脑和手机联系人、日历、待办的同步...
  18. 希捷移动硬盘Backup Plus Portable初始化及加密
  19. shader基础学习摘要(二) 兰伯特光照模型
  20. 手机如何拍出中背景模糊虚化的拍摄技巧

热门文章

  1. python string_Python String casefold()
  2. kotlin运行_Kotlin允许,运行,也适用于
  3. MIT 6.828 main.c文件分析
  4. C++基础new和delete运算符,new和delete简介
  5. 如何创建线程?如何实现Runnable接口?
  6. Shiro自定义realm实现密码验证及登录、密码加密注册、修改密码的验证
  7. 智能语音市场有多大? 阿里巴巴将如何破局后来者居上?
  8. (转载)构建public APIs与CORS
  9. 安裝MAVEN插件(轉)
  10. 宏、函数、宏和函数的区别