编程导航HDFS话题讨论

HDFS

3 参与
分享

快来分享你的内容吧~

点击登录,快来和大家讨论吧~
表情
图片
话题
打卡

HDFS的写测试底层原理

HDFS写测试底层原理深度解析: 一、核心架构层交互 1. 客户端协议栈 - 基于RPC的ClientProtocol接口实现通信 - 采用流式数据通道(DataTransferProtocol)分离元数据与数据流 - 双重校验机制:Checksum(CRC32C)与Length双验证 2. NameNode协调机制 - 写事务ID分配:生成全局唯一的inode编号 - BlockMap动态维护:实时跟踪所有数据块位置 - Lease管理:防止并发写冲突(默认60秒租约期) 二、数据管道构建 1. 三阶段管道建立: a) NN返回包含3个DN的管线拓扑(考虑机架感知) b) Client与首节点建立Socket连接 c) 级联式握手:DN1→DN2→DN3形成ACK反向链路 2. 智能路由策略: - 距离成本计算:优先选择同机架节点 - 负载均衡:基于DN的剩余磁盘空间和当前IO压力 - 故障规避:自动跳过心跳异常的节点 三、数据分片与传输 1. 块分割算法: - 默认128MB块大小(可配置) - Packet单元传输:每个packet包含126个chunk(1MB+) - 内存队列缓冲:双缓冲机制保证持续写入 2. 流水线确认机制: - 异步应答管道:DN3→DN2→DN1→Client的ACK顺序 - 滑动窗口控制:最大未确认packet数为5(可调参数) - 容错重传:单个DN故障触发管线重建 四、持久化保障 1. 多级持久化策略: a) 内存缓冲:DataNode的volatile write cache b) 操作系统页缓存:fsync前数据状态 c) 磁盘持久化:通过FlushProcessor线程定期刷盘 2. 副本状态机: - PIPELINE_CLOSE:正常关闭管线 - FINALIZE:提交所有packet - COMMIT:NN确认所有副本达到最小要求(dfs.namenode.replication.min) 五、异常处理机制 1. 故障检测: - 心跳超时(默认10分钟) - 写操作超时(dfs.client.socket-timeout=60s) - 校验和异常(每512字节生成4字节CRC) 2. 恢复策略: - 坏块报告:DN主动上报损坏块 - 增量恢复:仅补传缺失部分 - 全量复制:当损坏率超过阈值触发 六、性能优化要点 1. 零拷贝技术: - sendfile系统调用绕过用户空间 - 内存映射文件加速大文件写入 2. 合并写入: - 小文件合并为Har归档文件 - SequenceFile格式优化随机写 七、测试验证方法 1. 基准测试工具: TestDFSIO参数示例: hadoop jar hadoop-mapreduce-client-jobclient-tests.jar \ TestDFSIO -write -nrFiles 10 -size 1GB 2. 关键监控指标: - 网络吞吐量:datanode.BytesWritten - 磁盘IO:fsdataload_avg_io_ms - 队列深度:ipc.callQueueLength 八、底层协议栈 1. 分层结构: Application Layer (HDFS Client) ↑ RPC Layer (Protobuf over TCP) ↑ TCP/IP Stack ↓ OS Page Cache ↓ Disk Controller 该机制通过多级流水线、智能故障转移和强一致性保证,实现了高吞吐的分布式写入能力,典型场景下可达到单集群GB/s级的写入速度。

面经题目-详细描述下Hadoop的checkpoint流程

Hadoop的Checkpoint流程是HDFS(Hadoop Distributed File System)中维护元数据一致性的核心机制,主要用于合并NameNode的内存元数据(FsImage)与编辑日志(EditLog),从而缩短系统启动时间和降低故障恢复成本。以下是其详细流程: --- ### **1. Checkpoint触发条件** - **时间周期触发**:默认每3600秒(1小时)执行一次(通过`dfs.namenode.checkpoint.period`配置)。 - **事务数量触发**:当EditLog的事务操作数量达到100万次(通过`dfs.namenode.checkpoint.txns`配置)。 --- ### **2. Checkpoint执行流程** #### **步骤1:Secondary NameNode发起请求** - Secondary NameNode(或Checkpoint Node)定期向Active NameNode发送HTTP GET请求,查询是否需要执行Checkpoint。 - NameNode返回当前EditLog的状态信息(如最后的事务ID)。 #### **步骤2:滚动EditLog** - NameNode停止写入当前EditLog文件(如`edits_inprogress_001`),并创建一个新的EditLog文件(如`edits_inprogress_002`)继续记录后续操作。 #### **步骤3:传输元数据文件** - Secondary NameNode通过HTTP GET请求从NameNode下载以下文件: - **最新的FsImage文件**(如`fsimage_000000001`)。 - **待合并的EditLog文件**(如`edits_001-002`)。 #### **步骤4:合并FsImage与EditLog** - Secondary NameNode将FsImage加载到内存,并按顺序重放EditLog中的所有事务操作,生成新的合并后的FsImage文件(如`fsimage.ckpt_000000002`)。 - 合并完成后,生成新的MD5校验文件(如`fsimage.ckpt_000000002.md5`)。 #### **步骤5:上传合并结果** - Secondary NameNode通过HTTP PUT将新生成的FsImage和校验文件上传至NameNode。 #### **步骤6:完成Checkpoint** - NameNode接收新FsImage后: 1. 用新FsImage替换旧的FsImage文件。 2. 删除已合并的EditLog文件。 3. 更新`seen_txid`文件以记录最新事务ID。 --- ### **3. 关键目录与文件** - **NameNode目录结构**: ``` /hadoop/namenode/ ├── current/ │ ├── fsimage_000000000 │ ├── fsimage_000000000.md5 │ ├── edits_000001-000002 │ └── seen_txid └── in_use.lock ``` - **Secondary NameNode工作目录**: ``` /hadoop/namesecondary/ └── current/ ├── fsimage.ckpt_000000002 └── fsimage.ckpt_000000002.md5 ``` --- ### **4. 注意事项** - **非实时备份**:Secondary NameNode并非热备节点,仅用于离线合并元数据。 - **高可用(HA)场景**:在启用HA的集群中,Checkpoint由Standby NameNode自动完成,无需Secondary NameNode。 - **手动触发命令**:可通过`hdfs dfsadmin -saveNamespace`强制触发Checkpoint。 --- ### **5. 配置参数示例** ```xml <!-- hdfs-site.xml --> <property> <name>dfs.namenode.checkpoint.period</name> <value>3600</value> <!-- Checkpoint时间间隔 --> </property> <property> <name>dfs.namenode.checkpoint.txns</name> <value>1000000</value> <!-- 触发Checkpoint的事务数阈值 --> </property> ``` 通过Checkpoint机制,Hadoop确保了元数据的高效管理和灾难恢复能力,是保障HDFS稳定运行的核心环节。

#大数据# #HDFS# Debug 记一个学习过程中的小bug,困扰很久且很low的bug,希望其他大数据鱼友避坑。 这是一个hdfs的api操作,通过代码控制客户端操作hdfs进行上传和下载操作。在集群启动完成并且其他配置无任何情况下,执行该代码,构建成功并没有任何报错。 但在hadoop页面中查看后发现并没有执行上传操作,无文件。之后经过一系列调试检查发现是代码的顺序错误。conf.set()方法应该先写(逻辑问题:应该先进行api连接,再进行操作)。 更改无误后执行报错Exception in thread "main" org.apache.hadoop.security.AccessControlException: Permission denied: user=Lenovo, access=WRITE, inode="/input3":atguigu:supergroup:drwxr-xr-x 由此可知是权限的原因。显示当前用户为我本机的用户Lenovo。 解决办法:添加VM选项-DHADOOP_USER_NAME='用户名' 再次执行发现已经成功上传!!!😄

下载 APP