一、HDFS入门
HDFS:Hadoop Distribute File System Hadoop分布式文件系统
1. 底层设计思想
- 如何解决大数据存储不下的问题?---------------------分布式存储
- 如何解决分布式存储浏览文件便捷的问题?---------元数据管理,记录文件对应信息
- 如何解决数据过大上传下载耗时的问题?------------分块存储
- 如何解决机器故障导致数据丢失的问题?------------副本机制
- 如何方便用户浏览操作文件系统?---------------------抽象成为目录树结构
2. HDFS设计目标
- 故障的检测和自动快速恢复是HDFS的核心架构目标。
- HDFS上的应用主要是以流式读取数据。HDFS被设计成适合批量处理,而不是用户交互式的。相较于数据访问的访问时间,更注重数据访问的高吞吐量。
- 支持大文件。应该提供很高的聚合数据带宽。
- 大部分HDFS应用对文件的要求是write-one-read-many访问模型。一个文件一旦创建、写入、关闭之后就不需要修改了。这一假设简化了数据一致性问题,使高吞吐量的数据访问成为可能。
- 移动计算的代价比移动数据的代价低。
- 在异构的硬件和软件平台上的可移植性。
3. HDFS重要特性
首先,它是一个文件系统,用于存储文件,通过统一的命名空间目录树来定位文件。
其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。
-
主从结构:
master/slave架构
主角色:namenode:管理文件系统的元数据(目录树命名空间)
从角色:datanode:负责具体的的数据块的存储
二者各司其职共同配合,对外提供文件存储服务。
一般一个HDFS集群是有一个NameNode和一定数目的DataNode组成。 -
分块存储
HDFS中的文件在物理上是分块存储(block)的,块的大小可以通过配置参数来规定。
hadoop 2.x 默认128M
hadoop 1.x 默认64M -
名字空间(NameSpace)
HDFS支持传统的层次型文件组织结构。
NameNode负责维护文件系统的名字空间。 -
NameNode元数据管理
我们把目录结构及文件分块位置信息叫做元数据。NameNode负责维护整个hdfs文件系统的目录树结构,以及每一个文件所对应的block块信息(block的id,及所在的datanode服务器)。 -
DataNode数据存储
文件的各个block的具体存储管理由datanode节点承担。datanode需要定时向NameNode汇报自己持有的block信息。
存储多个副本(副本数量可以通过参数设置dfs.replication,默认是3)。 -
副本机制
-
hadoop默认3副本存储、(总共副本数 1+2=3)
-
一次写入多次读取
不支持文件的修改,适合大数据离线分析
4. hdfs shell命令
格式:hadoop fs <args>
至于操作的是什么类型的文件系统,取决于后续url的schema信息。
hadoop fs -ls hdfs://node01:9000/ hdfs文件系统
hadoop fs -ls file:/// 本地文件系统
hadoop fs -ls gfs://node01:6688/ 谷歌文件系统
hadoop fs -ls / 访问默认的文件系统,取决于环境的配置
(本人已在core-site.xml设置为hdfs,其原本默认为local)
shell常用命令
命令 | 格式 | 说明 |
---|---|---|
-ls | hadoop fs -ls [-R] [-h] <args> | 查看指定路径的当前目录结构 |
-mkdir | hadoop fs -mkdir [-p] <paths> | 创建空白文件夹 |
-put | hadoop fs -put [-f] [-p] [-| <localsrc1>…] <dest> | 从本地文件系统上传至目标文件系统(-f 覆盖,-p保留访问和修改时间、所有权和时限)。客户端在哪里,哪里的机器就是本地文件系统。 |
-get | hadoop fs -get [-ignorecrc] [-crc] [-p] [-f] <src> <localdst> | 下载文件(-ignorecrc跳过对下载文件的CRC检查,-crc为下载的文件写CRC校验和) |
-appendToFile | hadoop fs -appendToFile <localsrc> … <dist> | 追加一个文件内容到已经存在的文件末尾。适合于小文件合并 |
-cat | hadoop fs -cat [-ignoreCrc] URI [URI…] | 查看文件 |
-tail | hadoop fs -tail [-f] URI | 查看文件的最后一千字节内容。-f选项将在文件增长时输出附加数据 |
-chmod | hadoop fs -chmod [-R] URI | 改变文件的权限 |
-cp | hadoop fs -cp URI URI | 从hdfs的一个路径拷贝到hdfs的另一个路径 |
-mv | hadoop fs -mv URI URI | 在hdfs目录中移动文件 |
-rm | hadoop fs -rm [-r] URI | 删除 |
-getmerge | hadoop fs -getmerge URI URI | 合并下载多个文件到指定路径 |
-df | hadoop fs -df [-h] | 统计文件系统的可用空间信息 |
-du | hadoop fs -du URI | 显示目录中所有文件大小,当只指定一个文件时,显示此文件的大小 |
-setrep | hadoop fs -setrep -w 副本数 [-R] URI | 改变一个文件的副本系数。-R 选项用于递归改变目录下所有文件的副本系数 |
-chgrp | hadoop fs -chgrp [-R] GROUP URI [URI …] | 更改文件组的关联。用户必须是文件的所有者,否则是超级用户 |
-chown | hadoop fs -chown [-R] URI URI | 改变文件的拥有者。使用-R 将使改变在目录结构下递归进行 |
–copyFromLocal | hadoop fs -copyFromLocal URI | 从本地文件系统中拷贝文件到 hdfs 路径去 |
-copyToLocal | hadoop fs -copyToLocal URI | 从 hdfs 拷贝到本地 |
注:
① CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码
② 企业中一个文件存储多少副本最好上传之前决定 避免集群上修改造成集群性能的影响
示例:
hadoop fs -ls -R-h
hadoop fs -mkdir -p /input
hadoop fs -put file:///root/1.txt hdfs://node01:9000/input
hadoop fs -put 1.txt 2.txt /input (上传当前目录下的文件)
hadoop fs -get hdfs://node01:9000/input/1.txt file:///root/
hadoop fs -get /nput/1.txt ./ (下载到当前目录下)
hadoop fs -appendToFile 2.txt 3.txt /input/1.txt
hadoop fs -cat /input/1.txt
hadoop fs -tail /input/1.txt
hadoop fs -chmod 777 /input/1.txt
hadoop fs -cp /hadoopinput/wordcount.txt /input/words.txt
hadoop fs -mv /input/words.txt /hadoopinput/
hadoop fs -rm -r /hadoopinput
hadoop fs -getmerge /input/*.txt ./xxx.txt
hadoop fs -getmerge /input/log.* ./log.sum
hadoop fs -df -h /
hadoop fs -du -h /input
hadoop fs -setrep -w 3 -R /input
hadoop fs -setrep -w 3 /input/1.txt
hadoop fs -chgrp othergroup /hadoop/hadoopfile
hadoop fs -chown someuser:somegrp /hadoop/hadoopfile
hadoop fs -copyFromLocal /root/1.txt /
hadoop fs -copyToLocal /aaa/jdk.tar.gz