HDFS是可扩展、容错、高性能的分布式文件系统,异步复制,一次写入多次读取,专门存储超大数据文件,为整个hadoop生态圈提供了基础的存储服务
1.认识HDFS
HDFS可在许多服务器上运行,根据需要HDFS可轻松扩展到数千个节点和PB量级的数据。HDFS设置容量越大,某些磁盘(每个磁盘都有默认的数据块大小,这是磁盘在对数据进行读和写时要求的最小单位)、服务器或网络交换机出故障的概率越高(可通过在多个服务器之间复制数据来修复故障),HDFS会自动检测给定组件是否发生故障,并采取一种透明方式进行必要的恢复操作
HDFS是为存储数百兆字节或数千兆字节的大型文件设计的,它提供高吞吐量的流式数据访问,一次写入多次读取。HDFS不允许修改文件内容,只支持在文件末尾追加数据
如果需使用图形界面与HDFS交互,可查看免费的开源HUE(Hadoop用户体验)。包含一个方便的“文件浏览器”组件,允许浏览HDFS文件和目录并执行基本操作,也可使用HUE的上传按钮,直接从计算机上传文件到HDFS
2.HDFS架构
HDFS由在选定集群节点上安装和运行下列进程组成:
1.namenode:是一个(只有一个)在HDFS架构中单独机器上运行的组件(在HDFS内部提供元数据管理|存储|检索服务),负责管理文件系统命名空间(文件名、权限、所有权、上次修改日期等)+外部客户机访问的主进程,控制对存储在HDFS中数据的访问。若namenode关闭则无法访问数据(但可配置多个namenode,以确保此关键HDFS过程的高可用性)
2.datanodes:是一个(可有多个)在HDFS架构中单独机器上运行的组件,安装在负责存储+处理数据的集群工作节点上的从进程(在namenode的统一调度下进行数据块的创建、复制和删除),数据节点通常以机架的形式组织,机架通过一个交换机将所有系统连接起来。数据节点响应来自hdfs客户机的读写请求,也响应来自namenode的创建、删除和复制数据块命令,名称节点依赖来自每个数据节点的定期心跳信息(每条信息包含一个块报告,namenode可根据这个报告验证块映射和其他文件系统元数据)
3.secondary namenode:namenode的助手节点
说明:上图是在一个4节点的集群中安装HDFS,一个主机节点为namenode进程,其他三个节点是DataNode进程。namenode和DataNode是在Linux操作系统之上运行的Java进程,它们使用本地磁盘空间存储HDFS数据
3.HDFS文件上传
文件在客户端时会被分为5个块,为了负载均衡,所以每个节点有3个块(默认3复本管理)
1.客户端将上传文件按128M的大小分块(目的是最小化寻址开销)
2.客户端向namenode发送写数据请求
3.namenode记录每个DataNode信息,并返回可用的DataNode列表
4.客户端直接向DataNode发送分隔后的文件夹,发送过程以流式写入
5.DataNode向namenode发送消息,更新元数据
4.HDFS读取
client通过file system的open函数打开文件,distributed file system用RPC调用namenode名称节点,得到文件的数据块信息。对于每一个数据块,namenode节点返回保存数据块的数据节点地址。Distributed file system返回FSDataInputStream给客户端,用来读取数据,客户端调用stream的read()函数开始读取数据,DFSInputStream连接保存此文件第一个数据块的最近数据节点。DataNode从数据节点读到client,当该数据块读取完毕时,DFSInputStream关闭与此数据节点的连接,然后连接该文件下一个数据块最近的数据节点。当客户端读取完毕数据,则调用FSDataInputStream的close函数
在读取数据的过程中,如果客户端与数据节点的通信出现错误,则尝试连接包含该数据块的下一个数据节点,失败的数据节点将被记录,以后不再连接
5.复本管理策略
复本管理策略是运行客户端的节点上放一个副本(如果客户端运行在集群之外,则随机选择一个节点),第二个复本会放在与第一个不同且随机选择的机架中节点,第三个复本会放在与第二个复本机架相同且随机选择的另一个节点
所存的其他复本则存放在集群中随机选择的节点上,不过系统会尽量避免在相同机架上存放太多复本
6.不适合HDFS场景
1)低延迟
HDFS不适用于实时查询这种对延迟要求高的场景,如股票实盘。往往应对低延迟数据访问场景需要通过数据库访问索引的方案来解决,Hadoop生态圈中的Hbase具有这种随机读、低延迟等特点
2)大量小文件
对于Hadoop系统,小文件通常定义为远小于HDFS的block size(默认64MB)的文件,由于每个文件都会产生各自的MetaData元数据,Hadoop通过Namenode来存储这些信息,若小文件过多容易导致Namenode存储出现瓶颈
3)多用户更新
为了保证并发性,HDFS需要一次写入多次读取,目前不支持多用户写入,若要修改,也是通过追加的方式添加到文件末尾处,出现太多文件需要更新的情况,Hadoop是不支持的
针对有多人写入数据的场景,可以考虑采用Hbase
4)结构化数据
HDFS适合存储半结构化和非结构化数据,若有严格的结构化数据存储场景,可以考虑采用Hbase
5)数据量并不大
通常Hadoop适用于TB、PB数据,若待处理的数据只有几十GB的话,不建议使用Hadoop,因为没有任何好处
7.HDFS基本命令
URI格式:scheme:/authority/path,对于分布式文件系统scheme为hdfs,对于本地文件系统scheme为file,scheme+authority如果没有指定则使用配置中指定的scheme
相对路径总是引用执行命令的用户主目录,HDFS没有"当前"目录的概念即没有cd命令
列出HDFS文件操作命令+用法,注hdfs dfs和hadoop fs效果相同
hadoop fs
显示当前目录结构
hadoop fs -ls /user/tuoming/test/
查看HDFS系统下根目录文件
hadoop fs -ls /
递归显示当前目录结构
hadoop fs -ls -R /user/tuoming/test/
创建目录(可同时创建多个)
hadoop fs -mkdir /user/tuoming/test/beifen
hadoop fs -ls /user/tuoming/test/
hadoop fs -mkdir -p /newpkg/newpkg1/newpkg2 #同时创建父级目录
删除文件-也可删除目录下的文件
hadoop fs -rm /user/tuoming/test/beifen
hadoop fs -rm /*.txt #删除全部txt文件
递归删除目录+文件
hadoop fs -rm -R /user/tuoming/test/beifen
从本地加载文件(也可以是文件夹)到HDFS目录
hadoop fs -put file:/root/test.txt hdfs:/ #上传本地test.txt文件到HDFS根目录
hadoop fs -put /tmp/test.txt /user/tuoming/test/beifen
hadoop fs -ls -R /user/tuoming/test/
从HDFS导出文件到本地
hadoop fs -get hdfs:/test.txt file:/root/
检查文件或目录是否存在
hadoop fs -test -e /user/tuoming/test/beifen/tian.txt
检查文件内容
hadoop fs -text /user/tuoming/test/beifen/tian.txt
hadoop fs -cat /user/tuoming/test/beifen/tian.txt
hadoop fs -cat hdfs://host1:port1/file1 hdfs://host2:port2/file2
hadoop fs -cat file:///file1
统计目录下各文件大小-单位字节,-h显示单位
hadoop fs -du (-h) /user/tuoming/test/beifen
汇总目录下文件大小
hadoop fs -du -s /user/tuoming/test/
复制文件
hadoop fs -cp [src] [dst]
hadoop fs -cp /user/merge /user/search
将merge文件夹下面的所有文件(包括merge文件夹)复制到search目录下
移动文件
hadoop fs -mv [src] [dst]
更改文件权限
hadoop fs -chmod 700 /user/adam/songs.txt
清空回收站
hadoop fs -expunge
创建空文件
hadoop fs -touchz /newfile.txt