数仓:解读 NameNode 的 edits 和 fsimage 文件内容
一、edits 文件
一)文件组成
- 一个edits文件记录了一次写文件的过程,该过程被分解成多个部分进行记录;(每条记录在hdfs中有一个编号)
- 每一个部分为: '<RECORD>...</RECORD>' ;
- 每一部分包含了:'<OPCODE> ... </OPCODE>' 和 '<DATA> ... </DATA>' 两部分内容;
二)文件内容理解
1. 文件首: <OPCODE>OP_START_LOG_SEGMENT</OPCODE>
<RECORD>
<OPCODE>OP_START_LOG_SEGMENT</OPCODE> --- 表示对一次写操作记录的开始
<DATA>
<TXID>138</TXID> ---------- HDFS的第138号记录
</DATA>
</RECORD>
2. 文件的元数据: <OPCODE>OP_ADD</OPCODE>
# a.xml._COPYING_: 写入 'a.xml' 文件的过程中,会先将文件写到该临时文件中,最后再将该文件重命名后存放到DN;
<RECORD>
<OPCODE>OP_ADD</OPCODE> ------------- 写文件操作
<DATA>
<TXID>139</TXID> ---------------- HDFS的第139号记录
<LENGTH>0</LENGTH>
<INODEID>16416</INODEID>
<PATH>/a.xml._COPYING_</PATH> --- 写'a.xml'文件的过程中生成临时文件'a.xml._COPYING'
<REPLICATION>3</REPLICATION> --- 副本数
<MTIME>1603341874966</MTIME> --- 创建时间
<ATIME>1603341874966</ATIME> --- 修改时间
<BLOCKSIZE>134217728</BLOCKSIZE> --- 文件块的大小:128M
<CLIENT_NAME>DFSClient_NONMAPREDUCE_-1327338057_1</CLIENT_NAME> ---- 来源哪个客户端
<CLIENT_MACHINE>192.168.26.101</CLIENT_MACHINE> --------------- 通过哪个机器上传的
<OVERWRITE>true</OVERWRITE> --------------- 是否允许被覆盖
<PERMISSION_STATUS> ---------- 权限信息
<USERNAME>heyc</USERNAME> ---------- 所属主
<GROUPNAME>supergroup</GROUPNAME> ---------- 所属组
<MODE>420</MODE> ---------- 权限大小(777最大)
</PERMISSION_STATUS>
<RPC_CLIENTID>3299ce83-ba14-4468-8cf8-b5edb5dea153</RPC_CLIENTID> ---- 集群ID
<RPC_CALLID>3</RPC_CALLID>
</DATA>
</RECORD>
3. 定义块id:<OPCODE>OP_ALLOCATE_BLOCK_ID</OPCODE>
<RECORD>
<OPCODE>OP_ALLOCATE_BLOCK_ID</OPCODE> ---- 表示该步为记录 “定义块ID”
<DATA>
<TXID>140</TXID> ---- HDFS的第140号记录
<BLOCK_ID>1073741835</BLOCK_ID> ----- 块ID
</DATA>
</RECORD>
4. 为块生成一个时间戳:<OPCODE>OP_SET_GENSTAMP_V2</OPCODE>
<RECORD>
<OPCODE>OP_SET_GENSTAMP_V2</OPCODE>
<DATA>
<TXID>141</TXID>
<GENSTAMPV2>1012</GENSTAMPV2>
</DATA>
</RECORD>
5. 添加块: <OPCODE>OP_ADD_BLOCK</OPCODE>
<RECORD>
<OPCODE>OP_ADD_BLOCK</OPCODE>
<DATA>
<TXID>142</TXID>
<PATH>/a.xml._COPYING_</PATH>
<BLOCK>
<BLOCK_ID>1073741835</BLOCK_ID>
<NUM_BYTES>0</NUM_BYTES>
<GENSTAMP>1012</GENSTAMP>
</BLOCK>
<RPC_CLIENTID></RPC_CLIENTID>
<RPC_CALLID>-2</RPC_CALLID>
</DATA>
</RECORD>
6. 封闭文件: <OPCODE>OP_CLOSE</OPCODE>
<RECORD>
<OPCODE>OP_CLOSE</OPCODE>
<DATA>
<TXID>143</TXID>
<LENGTH>0</LENGTH>
<INODEID>0</INODEID>
<PATH>/a.xml._COPYING_</PATH>
<REPLICATION>3</REPLICATION>
<MTIME>1603341875516</MTIME>
<ATIME>1603341874966</ATIME>
<BLOCKSIZE>134217728</BLOCKSIZE>
<CLIENT_NAME></CLIENT_NAME>
<CLIENT_MACHINE></CLIENT_MACHINE>
<OVERWRITE>false</OVERWRITE>
<BLOCK>
<BLOCK_ID>1073741835</BLOCK_ID>
<NUM_BYTES>313</NUM_BYTES>
<GENSTAMP>1012</GENSTAMP>
</BLOCK>
<PERMISSION_STATUS>
<USERNAME>heyc</USERNAME>
<GROUPNAME>supergroup</GROUPNAME>
<MODE>420</MODE>
</PERMISSION_STATUS>
</DATA>
</RECORD>
7. 重命名临时文件 'a.xml._COPYING_' 为 'a.xml': <OPCODE>OP_RENAME_OLD</OPCODE>
<RECORD>
<OPCODE>OP_RENAME_OLD</OPCODE>
<DATA>
<TXID>144</TXID>
<LENGTH>0</LENGTH>
<SRC>/a.xml._COPYING_</SRC>
<DST>/a.xml</DST>
<TIMESTAMP>1603341875552</TIMESTAMP>
<RPC_CLIENTID>3299ce83-ba14-4468-8cf8-b5edb5dea153</RPC_CLIENTID>
<RPC_CALLID>8</RPC_CALLID>
</DATA>
</RECORD>
二、fsimage 文件
1)文件组成
- fsimage 由多个 '<INodeDirectorySection> ... </INodeDirectorySection>'
- 每个 '<INodeDirectorySection> ... </INodeDirectorySection>' 中有多个 '<inode> ... </inode>'
2)文件内容理解
<inode>
<id>16417</id>
<type>FILE</type> ------ 文件类型:常规文件(如果是文件夹则为 'DIRECTORY')
<name>b.xml</name> ----- 文件名
<replication>3</replication> --- 副本数
<mtime>1603342078483</mtime> --- 创建时间
<atime>1603342078253</atime> --- 修改时间
<perferredBlockSize>134217728</perferredBlockSize> --- 块大小
<permission>heyc:supergroup:rw-r--r--</permission> --- 权限
<blocks> ---- 被切成了几个块
<block> --- 一个快
<id>1073741836</id> ----- 块的id
<genstamp>1013</genstamp> --- 块的时间戳
<numBytes>313</numBytes> --- 块中存放的数据的大小(该文件只有一个块,该大小即为文件大小)
</block>
</blocks>
</inode>
数仓:解读 NameNode 的 edits 和 fsimage 文件内容的更多相关文章
- HDFS源码分析之FSImage文件内容(一)总体格式
FSImage文件是HDFS中名字节点NameNode上文件/目录元数据在特定某一时刻的持久化存储文件.它的作用不言而喻,在HA出现之前,NameNode因为各种原因宕机后,若要恢复或在其他机器上重启 ...
- 数仓面试高频考点--解决hive小文件过多问题
本文首发于公众号:五分钟学大数据 小文件产生原因 hive 中的小文件肯定是向 hive 表中导入数据时产生,所以先看下向 hive 中导入数据的几种方式 直接向表中插入数据 insert into ...
- hadoop源代码解读namenode高可靠:HA;web方式查看namenode下信息;dfs/data决定datanode存储位置
点击browserFilesystem,和命令查看结果一样 当我们查看hadoop源代码时,我们看到hdfs下的hdfs-default.xml文件信息 我们查找${hadoop.tmp.dir}这是 ...
- Hadoop-2.4.1学习之edits和fsimage查看器
在hadoop中edits和fsimage是两个至关关键的文件.当中edits负责保存自最新检查点后命名空间的变化.起着日志的作用,而fsimage则保存了最新的检查点信息.这个两个文件里的内容使用普 ...
- HAWQ取代传统数仓实践(十三)——事实表技术之周期快照
一.周期快照简介 周期快照事实表中的每行汇总了发生在某一标准周期,如一天.一周或一月的多个度量.其粒度是周期性的时间段,而不是单个事务.周期快照事实表通常包含许多数据的总计,因为任何与事实表时间范围一 ...
- 技术专家说 | 如何基于 Spark 和 Z-Order 实现企业级离线数仓降本提效?
[点击了解更多大数据知识] 市场的变幻,政策的完善,技术的革新--种种因素让我们面对太多的挑战,这仍需我们不断探索.克服. 今年,网易数帆将持续推出新栏目「金融专家说」「技术专家说」「产品专家说」等, ...
- 数仓1.4 |业务数仓搭建| 拉链表| Presto
电商业务及数据结构 SKU库存量,剩余多少SPU商品聚集的最小单位,,,这类商品的抽象,提取公共的内容 订单表:周期性状态变化(order_info) id 订单编号 total_amount 订单金 ...
- 数仓1.1 分层| ODS& DWD层
数仓分层 ODS:Operation Data Store原始数据 DWD(数据清洗/DWI) data warehouse detail数据明细详情,去除空值,脏数据,超过极限范围的明细解析具体表 ...
- 在HUE中将文本格式的数据导入hive数仓中
今天有一个需求需要将一份文档形式的hft与fdd的城市关系关系的数据导入到hive数仓中,之前没有在hue中进行这项操作(上家都是通过xshell登录堡垒机直接连服务器进行操作的),特此记录一下. - ...
随机推荐
- poj 1330 Nearest Common Ancestors (最简单的LCA)
题意: 给出一棵树的结构. 给出两个点X和Y,求它俩的LCA. 思路: 只需求两个点的LCA,用了两种方法,一种离线tarjan,一种直接搞. 看代码. 代码: 方法一:直接搞. int const ...
- Django(73)django-debug-toolbar调试工具
介绍 Django框架的调试工具栏使用django-debug-toolbar库,是一组可配置的面板,显示有关当前请求/响应的各种调试信息,点击时,显示有关面板内容的更多详细信息. 应用 1. 安装 ...
- PWN环境搭建
目录 PWN环境搭建 需要的工具或系统 安装PWN工具 pwntools (CTF库.漏洞利用库) pwngdb(GDB插件) checksec(查保护) ROPGadget(二进制文件查找工具) o ...
- Redis 专栏(使用介绍、源码分析、常见问题...)
一.介绍相关 说Redis : 介绍Redis特性,使用场景,使用Jedis操作Redis等. 二.源码分析 1. 数据结构 Redis源码分析(sds):Redis自己封装的C语言字符串类型. Re ...
- C++11 多线程同步 互斥锁 条件变量
在多线程程序中,线程同步(多个线程访问一个资源保证顺序)是一个非常重要的问题,Linux下常见的线程同步的方法有下面几种: 互斥锁 条件变量 信号量 这篇博客只介绍互斥量和条件变量的使用. 互斥锁和条 ...
- 前端yyyy-mm-dd格式 计算一段工作日后,日期
//计算一段工作日后,日期getWorkday(dat, itervalByDay) { function formatTen(f) { if (parseInt(f, 10) < 10) { ...
- newInstance方法
1.new 是java中的关键字,是创建一个新对象的关键字.用new这个关键字的话,是调用new指令创建一个对象,然后调用构造方法来初始化这个对象,如果反编译class的话,会看到一个Object o ...
- Java学习(十三)
今天学习了Java中的继承,Java的继承和c++的差别很大. 继承的基本作用是代码复用,但最重要的作用是为了以后的"方法覆盖"和"多态机制". 继承的语法是: ...
- Python进阶(装饰器)
from datetime import datetime def log(func):#func表示装饰器作用于的函数 def wrapper(*args,**kw):#wrapper返回装饰器作用 ...
- 微信小程序(六)
MINA 框架: 启动: 冷启动,热启动 加载: 生命周期 路由: 事件: 事件时视图层到逻辑层的通信方式 事件可以将用户的行为反馈到逻辑层进行处理 事件可以绑定在组件上,触发事件后就会执行逻辑层对应 ...