HDFS的基本概念(一)

  • 数据存入HDFS中时需要对其进行分片(split)、压缩等操作。
  • HDFS使用Block(存储块)对文件的存储进行操作,Block是HDFS的基本存储单元,默认大小是64MB(Block较大的优点:可以减少用户与节点之间的通信需求;Namenode利用率高)。每个Block的默认副本数为3。
  • HDFS数据存储的目标有两个:最大化数据可靠性(每个数据块有默认3个副本);最大化利用网络带宽资源。
  • 数据节点之间的距离:同一节点(0);同一机架上不同节点(3);同一数据中心不同节点上(6);不同数据中心(9)。该距离的计算,由网络中的交换机的位置计算,该距离值是读取数据时读取节点的位置计算依据。
  • HDFS上的副本存放位置要对带宽以及传输速率进行衡量。
  • 对于数据量较庞大而安全性不太高的数据,可以较少副本数目,或者关闭HDFS复制而采用硬盘Raid模式。
  • HDFS副本(3个副本的情况)存放:第一个副本存放在当前节点上;第二个副本存放在不同的机架上;第三个副本存放在同一机架上的不同节点上。
  • NameNode中存放的基本信息有个特定的名称被叫做“元数据”,一般包括数据类型、大小、格式以及对象的存储形式。
  • HDFS在数据写入时,当节点出现故障时,只要默认的一个节点(dfs.replication.min)被写入了,数据将自动在集群键复制,直到复制达成第一好的次数。
  • HDFS通用操作命令:
    1. archive:创建一个hadoop档案文件,使用方法:hadoop archive -archibeName NAME <src>* <dest>
    2. distcp:在相同的文件系统中并行复制文件,使用方法:hadoop distcp <src1> <src2>
    3. fs:运行一个常规的文件基本命令,使用方法:hadoop fs [COMMAND_OPTIONS]
    4. jar:运行一个内含Hadoop运行代码的jar文件,使用方法:hadoop jar <jar> [mainClass] args
  • HDFS18个基本操作命令(文件路径可以使用相对路径,core-site.xml中已经对绝对路径进行了指定):
  1. -help
  2. -cat
  3. -copyFromLocal
  4. -copyToLocal
  5. -cp
  6. -du
  7. -dus(显示目标文件大小)
  8. expugunge(清空回收站)
  9. -get
  10. -ls
  11. -lsr
  12. -mkdir
  13. -mv
  14. -put
  15. -rm
  16. -rmr
  17. -setrep
  18. -test(使用ezd对文件进行检查)
  19. -text(将源文件输出为文本格式)


HDFS的存储原理主要涉及存储单元、文件切分、DataNode分配、数据写入、容错机制等方面: - **存储单元**:HDFS中的存储单元是Block,其大小比般单机文件系统大得多,默认为128M。普通文件系统不同,若一个文件大小小于一个数据块的大小,它无需占用整个数据块的存储空间,例如一个1M的文件在HDFS中仅占用1M空间,而非128M [^2][^3]。 - **文件切分**:文件通常被分成64或128M块的数据块进行存储。文件会根据数据块大小进行切分,以实现分布式存储 [^2]。 - **DataNode分配**:在数据写入时,会进行DataNode分配。数据存储会按照客户端DataNode节点之间的距离进行排序,距客户端越近的DataNode节点被放在最前面 [^2]。 - **数据写入**:HDFS采用“次写入多次读取”的文件访问模型。一个文件经过创建、写入关闭之后就不需要改变,这简化了数据致性问题,使高吞吐量的数据访问成为可能 [^2]。 - **容错机制**:HDFS认为机器故障是常态,设计时充分考虑到单个机器故障、单个磁盘故障、单个文件丢失等情况。存在三类故障,包括节点失败、网络故障、数据损坏(脏数据),并有相应的故障检测机制,如节点失败检测机制、通信故障检测机制、数据错误检测机制等 [^1][^2]。 ### 代码示例 以下是一个简单的Java代码示例,展示如何使用Hadoop API向HDFS写入文件: ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import java.io.IOException; import java.io.OutputStream; public class HDFSTest { public static void main(String[] args) throws IOException { Configuration conf = new Configuration(); conf.set("fs.defaultFS", "hdfs://localhost:9000"); FileSystem fs = FileSystem.get(conf); Path filePath = new Path("/test.txt"); OutputStream os = fs.create(filePath); String content = "Hello, HDFS!"; os.write(content.getBytes()); os.close(); fs.close(); } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值