本文我们学习Hadoop中HDFS架构、优缺点、文件块大小、通过shell命令文件上传下载

1. HDFS使用场景

适合一次写入,多次读取。一个文件经过创建、写入和关闭之后就不需要改变

2. HDFS优缺点

2.1 HDFS优点

高容错性

数据自动保存多个副本。通过增加副本的形式,提高容错性某一个副本丢失后可以自动恢复 适合处理大数据

数据规模:能够处理数据规模达到GB、TB、甚至PB级别的数据文件规模:能够处理百万规模以上的文件数量 可构建在廉价机器上,通过多副本机制,提高可靠性

2.2 HDFS缺点

不适合低延时数据访问,比如毫秒级的存储数据无法做到无法高效的对大量小文件进行存储

存储大量小文件的话,会占用NameNode大量内存来存储文件目录和块信息,这样不可取,NameNode的内存总是有限的小文件存储的寻址时间会超过读取时间,违反HDFS设计目标 不支持并发写入、文件随机修改

一个文件只能有一个写,不允许多个线程同时写仅支持数据追加append,不支持文件的随机修改

3. HDFS架构

NameNode(nn):就是Master

管理HDFS的名称空间配置副本策略管理数据块(Block)映射信息处理客户端读写请求 DataNode:就是Slave,NameNode下达命令,DataNode执行实际的操作

存储实际的数据块执行数据块的读写操作 Secondary Node:并非NameNode的热备,当NodeNode挂掉的时候,它并不能马上替换NanmeNode并提供服务

辅助NameNode,分担其工作量,比如定期合并Fsimage和Edits(这两个后面文章会详细说明),并推送给NameNode在紧急情况下,可辅助恢复NameNode Client:就是客户端

文件切分。文件上传HDFS的时候,Client将文件切分成一个个文件块Block,然后进行上传与NameNode交互,获取文件的位置信息与DataNode交互,写入或读取数据Client提供一些命令来管理HDFS,比如NameNode格式化Client提供一些命令来访问HDFS,比如HDFS增删改查操作

4. HDFS文件块大小

HDFS中文件在物理上是分块存储(Block),块的大小通过配置参数dfs.blocksize控制,默认大小是128M

如果寻址时间为10ms,即查找到目标block的时间为10ms寻址时间为传输时间的1%时,则为最佳状态[专家],因为传输时间为10ms/0.01=1000ms=1s目前磁盘的传输速率普遍为100MB/SBlock大小=1s*100MB/S=100MB,所以默认块大小在100M左右

为什么块的大小不能设置太小,也不能设置太大?

HDFS块设置太小,会增加寻址时间,程序一直在找块的开始位置HSFS块设置太大,磁盘传输时间明显大于寻址时间,程序处理块时会非常慢总结:HDFS块的大小设置主要取决于磁盘传输时间

5. HDFS文件上传与下载

我们访问之前部署的datanode节点http://localhost:9870/,图示内容为部署后自带的文件

我们进入namenode容器中,进行shell相关命令操作

// 创建目录/shenjian

# hadoop fs -mkdir /shenjian

# echo '算法小生' > wechat_upload.txt

// 上传文件

# hadoop fs -put wechat_upload.txt /shenjian

2023-01-02 10:51:48,467 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false

// 下载文件

# hadoop fs -get /shenjian/wechat_upload.txt wechat_download.txt

2023-01-02 10:52:14,348 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false

# cat wechat_download.txt

算法小生

我们尝试追加文件

# hadoop fs -appendToFile wechat_download.txt /shenjian/wechat_upload.txt

2023-01-02 11:11:12,480 WARN hdfs.DataStreamer: DataStreamer Exception

java.io.IOException: Failed to replace a bad datanode on the existing pipeline due to no more good datanodes being available to try. (Nodes: current=[DatanodeInfoWithStorage[172.29.0.2:9866,DS-1e5040af-3a7b-47f3-8f18-1c1ec13464d3,DISK]], original=[DatanodeInfoWithStorage[172.29.0.2:9866,DS-1e5040af-3a7b-47f3-8f18-1c1ec13464d3,DISK]]). The current failed datanode replacement policy is DEFAULT, and a client may configure this via 'dfs.client.block.write.replace-datanode-on-failure.policy' in its configuration.

at org.apache.hadoop.hdfs.DataStreamer.findNewDatanode(DataStreamer.java:1304)

at org.apache.hadoop.hdfs.DataStreamer.addDatanode2ExistingPipeline(DataStreamer.java:1372)

at org.apache.hadoop.hdfs.DataStreamer.handleDatanodeReplacement(DataStreamer.java:1598)

at org.apache.hadoop.hdfs.DataStreamer.setupPipelineInternal(DataStreamer.java:1499)

at org.apache.hadoop.hdfs.DataStreamer.setupPipelineForAppendOrRecovery(DataStreamer.java:1481)

at org.apache.hadoop.hdfs.DataStreamer.run(DataStreamer.java:720)

appendToFile: Failed to replace a bad datanode on the existing pipeline due to no more good datanodes being available to try. (Nodes: current=[DatanodeInfoWithStorage[172.29.0.2:9866,DS-1e5040af-3a7b-47f3-8f18-1c1ec13464d3,DISK]], original=[DatanodeInfoWithStorage[172.29.0.2:9866,DS-1e5040af-3a7b-47f3-8f18-1c1ec13464d3,DISK]]). The current failed datanode replacement policy is DEFAULT, and a client may configure this via 'dfs.client.block.write.replace-datanode-on-failure.policy' in its configuration

我们在上图中可以看到,副本数是3,而我们只启动了1个datanode节点,所以会写入失败,我们本地开发关闭即可,修改hadoop.env中HDFS配置文件,新增配置后重启

# 会写入容器文件/opt/hadoop-3.2.1/etc/hadoop/hdfs-site.xml替换为dfs.client.block.write.replace-datanode-on-failure.policy=NEVER

HDFS_CONF_dfs_client_block_write_replace___datanode___on___failure_policy=NEVER

再次追加

# echo 'shenjian' > test.txt

# hadoop fs -appendToFile test.txt /shenjian/wechat_upload.txt

2023-01-02 11:47:46,448 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false

# 查看文件末尾,OK追加成功

# hadoop fs -tail /shenjian/wechat_upload.txt

2023-01-02 11:49:17,188 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false

算法小生

shenjian

欢迎关注公众号算法小生

精彩文章

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。