3.hadoop系列之HDFS架构及文件上传下载

本文我们学习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/S
  • Block大小=1s*100MB/S=100MB,所以默认块大小在100M左右
为什么块的大小不能设置太小,也不能设置太大?
  • HDFS块设置太小,会增加寻址时间,程序一直在找块的开始位置
  • HSFS块设置太大,磁盘传输时间明显大于寻址时间,程序处理块时会非常慢
  • 总结:HDFS块的大小设置主要取决于磁盘传输时间
5. HDFS文件上传与下载

  • 我们进入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

欢迎关注公众号算法小生

猜你喜欢

转载自blog.csdn.net/SJshenjian/article/details/128539099
今日推荐