cm界面hdfs组件报错丢失块解决办法

文章描述了在cdh集群中遇到HDFS组件226个丢失块的问题,通过检查namenode界面、执行`hdfsfsck`命令来定位问题,指出可能需要手动删除损坏文件。解决办法包括删除丢失块以及处理权限问题。
   cdh集群中hdfs组件报错群集中有 226 个 丢失块 块。群集中共有 17,969 个块。百分比 丢失块: 1.26%。 临界阈值:任意

【排查流程】

1.查看活跃节点namenode界面,显示存在226块丢失,并依次在界面显示这里会显示损坏块的路径,记下来到后面会用到
在这里插入图片描述

2.进入集群后台查看(去对应的active namenode节点查看)

2.1.查看丢失文件块

hdfs fsck -list-corruptfileblocks

2.2.查看文件块情况

hdfs fsck / -blocks -files

查看块丢失

Status: CORRUPT
 Number of data-nodes:	3
 Number of racks:		1
 Total dirs:			7269
 Total symlinks:		0

Replicated Blocks:
 Total size:	5014836208 B (Total open files size: 306 B)
 Total files:	16717 (Files currently being written: 1)
 Total blocks (validated):	16730 (avg. block size 299751 B) (Total open file blocks (not validated): 1)

********************************

  UNDER MIN REPL'D BLOCKS:	226 (1.3508667 %)
  dfs.namenode.replication.min:	1
  CORRUPT FILES:	224
  MISSING BLOCKS:	226
  MISSING SIZE:		718268073 B

********************************

 Minimally replicated blocks:	16504 (98.64913 %)
 Over-replicated blocks:	0 (0.0 %)
 Under-replicated blocks:	35 (0.20920502 %)
 Mis-replicated blocks:		0 (0.0 %)
 Default replication factor:	3
 Average block replication:	1.0242081
 Missing blocks:		226
 Corrupt blocks:		0
 Missing replicas:		35 (0.1961004 %)
 Blocks queued for replication:	0

Erasure Coded Block Groups:
 Total size:	0 B
 Total files:	0
 Total block groups (validated):	0
 Minimally erasure-coded block groups:	0
 Over-erasure-coded block groups:	0
 Under-erasure-coded block groups:	0
 Unsatisfactory placement block groups:	0
 Average block group size:	0.0
 Missing block groups:		0
 Corrupt block groups:		0
 Missing internal blocks:	0
 Blocks queued for replication:	0

翻译如下:

状态:腐败

数据节点数:3

机架数量:1

总目录:7269

符号链接总数:0



复制的块:

总大小:5014836208 B(打开的文件总大小:306 B)

文件总数:16717(当前正在写入的文件:1)

块总数(已验证):16730(平均块大小299751 B)(打开的文件块总数(未验证):1)

********************************

在最小重复区块下:226(1.3508667%)

dfs.namenode.replication.min:1

损坏的文件:224

缺失区块:226

缺少尺寸:718268073 B

********************************

最少复制区块:16504个(98.64913%)

超过复制的块:0(0.0%)

复制不足区块:35个(0.20920502%)

复制错误的块:0(0.0%)

默认复制因子:3

平均块复制:1.0242081

缺失区块:226

损坏的块:0

丢失的副本:35个(0.1961004%)

排队等待复制的块:0



擦除编码块组:

总大小:0 B

文件总数:0

块组总数(已验证):0

最小擦除编码块组:0

过擦除编码的块组:0

擦除不足编码的块组:0

不满意的放置块组:0

平均块组大小:0.0

缺少块组:0

损坏的块组:0

缺少内部块:0

排队等待复制的块:0

【解决办法】
这些块本身已经损坏,虽然hdfs有修复损坏块副本机制,可以自主清理
文中的这种情况是在hdfs无法自主修复情况下进行的操作:
1.还是进入到hdfs目录中删除这些丢失块
2.这些坏块就是损坏的文件,自己可以在web ui界面上可以看到,文件路径就是前面记下来的

命令执行

这里删除的是hdfs目录里的文件,并非是linux系统文件

hdfs dfs -rm  /要删除文件

如果命令失败显示权限问题,无法删除
请使用这个命令

sudo -u hdfs hdfs dfs -rm  /要删除文件

如果误删文件,可以去回收站自行恢复文件

mysql_sync_database --warehouse hdfs://hdfs-cluster/user/hive/warehouse/ --database ods --table_prefix ods_r2_ --table_suffix _paimon --catalog_conf metastore=hive --catalog_conf uri=thrift://master-1-1.c-dcd118dc4de41971.us-west-1.emr.aliyuncs.com:9083,thrift://master-1-2.c-dcd118dc4de41971.us-west-1.emr.aliyuncs.com:9083,thrift://master-1-3.c-dcd118dc4de41971.us-west-1.emr.aliyuncs.com:9083 --mysql_conf hostname=rr-2evv848982cw96i13.mysql.rds.aliyuncs.com --mysql_conf username=bigdata_reader --mysql_conf password='21Rzhm9IpRa!' --mysql_conf database-name='repay' --mysql_conf server-time-zone='America/Cancun' --mysql_conf scan.startup.mode='initial' --table_conf bucket=10 --table_conf changelog-producer=lookup --table_conf sink.parallelism=10 --table_conf metastore.partitioned-table=true --table_conf file.format=parquet --metadata_column op_ts --ignore_incompatible true --table_conf num-sorted-run.stop-trigger=2147483647 --table_conf sort-spill-threshold=10 --table_conf snapshot.time-retained='24h' --mysql_conf debezium.min.row.count.to.stream.results=50000 --mysql_conf debezium.tasks.max=10 --mysql_conf debezium.max.queue.size=81920 --mysql_conf debezium.max.batch.size=20480 --mysql_conf debezium.event.deserialization.failure.handling.mode='skip' --mysql_conf debezium.binlog.buffer.size=20480 --mysql_conf debezium.snapshot.fetch.size=40000 --mysql_conf debezium.snapshot.mode='initial' --mysql_conf debezium.database.serverTimezone='America/Cancun' --type_mapping tinyint1-not-bool,to-nullable --mysql_conf scan.incremental.snapshot.enabled=true --mysql_conf scan.incremental.snapshot.chunk.size=40000 --mysql_conf scan.snapshot.fetch.size=100000 --mode combined --mysql_conf server-id='19700-19740' --mysql_conf debezium.deserialization.skip.parse.errors=true 加了debezium.deserialization.skip.parse.errors,但还是报错
最新发布
11-12
<think>我们面对的问题是:在使用flink-paimon-action-1.0.1.jar进行MySQL CDC同步时,即使已经添加了`debezium.deserialization.skip.parse.errors=true`配置,仍然报错(具体错误未给出,但根据之前上下文,可能是时间戳解析错误或其他类型错误)。我们需要深入分析并提供解决方案。 ### 问题分析 1. **配置项未生效的可能原因**: - 配置项传递错误:可能是配置项名称拼写错误,或者配置项传递的位置不正确。 - 版本兼容性问题:不同版本的Debezium/Flink CDC可能对配置项的支持不同。 - 配置项覆盖:可能其他配置覆盖了该配置。 2. **错误类型**:虽然之前提到了时间戳解析错误,但配置了跳过错误后仍报错,说明可能是其他类型的错误,或者是该配置项未能覆盖的错误。 ### 解决方案 #### 步骤1:确认配置项传递正确 在`mysql_sync_database`任务中,配置项应通过`--mysql_conf`参数传递。确保配置项书写正确,且位置正确: ```bash ./bin/flink run \ ./lib/paimon-flink-action-1.0.1.jar \ mysql_sync_database \ ... \ --mysql_conf debezium.deserialization.skip.parse.errors=true \ ... ``` 注意:配置项名称是`debezium.deserialization.skip.parse.errors`,而不是`debezium.deserialization.skip.errors`等。 #### 步骤2:检查Flink CDC版本兼容性 引用中提到用户使用的是Flink CDC 3.2.1(见引用[1]),但flink-paimon-action-1.0.1.jar可能依赖更高版本的Flink CDC。需要确认: - flink-paimon-action-1.0.1.jar内置的Flink CDC版本是多少? - 该版本是否支持`debezium.deserialization.skip.parse.errors`配置? **建议**:使用Flink CDC 3.4.0及以上版本,因为该版本对错误处理有更好的支持。如果内置版本较低,可以尝试通过`--jarfile`参数显式指定更高版本的Flink CDC连接器: ```bash ./bin/flink run \ --jarfile /path/to/flink-sql-connector-mysql-cdc-3.4.0.jar \ ./lib/paimon-flink-action-1.0.1.jar \ mysql_sync_database \ ... \ --mysql_conf debezium.deserialization.skip.parse.errors=true \ ... ``` #### 步骤3:扩展错误跳过配置 如果上述配置仍然无效,可能是因为Debezium需要跳过更多类型的错误。可以尝试添加以下配置: ```bash --mysql_conf debezium.skipped.operations=u,d \ # 跳过更新和删除操作(如果需要) --mysql_conf debezium.event.deserialization.failure.handling.mode=skip # 更全面的错误跳过 ``` 其中: - `debezium.event.deserialization.failure.handling.mode=skip`:这个配置项在较新的Debezium版本中可用,用于跳过所有反序列化错误的事件。 #### 步骤4:查看详细错误日志 如果错误仍然发生,需要获取更详细的错误日志。在Flink任务管理界面或日志文件中查找具体的错误堆栈,确定错误发生的具体位置和原因。 #### 步骤5:升级相关组件 如果问题依然无法解决,考虑升级整个环境: - 升级Flink到1.19或更高(注意paimon-flink-action-1.0.1.jar兼容的Flink版本) - 升级Paimon到1.1.0或更高版本 - 使用Flink CDC 3.4.0或更高版本 ### 备选方案:通过SQL作业处理 如果不使用`paimon-flink-action`的`mysql_sync_database`命令,可以改用Flink SQL作业,这样可以更灵活地配置CDC源: 1. 编写Flink SQL DDL创建Paimon表 2. 使用MySQL CDC表作为源,通过INSERT INTO同步 3. 在DDL中配置CDC属性: ```sql CREATE TABLE mysql_cdc_table ( ... ) WITH ( 'connector' = 'mysql-cdc', 'hostname' = '...', 'username' = '...', 'password' = '...', 'database-name' = '...', 'table-name' = '...', 'debezium.deserialization.skip.parse.errors' = 'true', 'debezium.event.deserialization.failure.handling.mode' = 'skip' ); CREATE TABLE paimon_table (...) WITH (...); INSERT INTO paimon_table SELECT * FROM mysql_cdc_table; ``` 然后提交SQL作业。这种方式可以更直接地控制CDC配置。 ### 总结步骤 1. **检查配置传递**:确保配置项正确传递且无拼写错误。 2. **升级Flink CDC**:显式指定Flink CDC 3.4.0+的jar包。 3. **扩展错误跳过配置**:添加`debezium.event.deserialization.failure.handling.mode=skip`。 4. **查看日志定位原因**:根据日志具体分析错误。 5. **升级组件或改用SQL作业**:作为终极解决方案。 ### 注意事项 - 跳过错误配置可能导致数据丢失,需谨慎使用。 - 生产环境建议先修复源数据问题(如无效时间戳),再同步。 §§相关问题§§ 1. 如何查看Flink CDC作业中的Debezium详细日志? 2. 在Paimon整库同步中如何跳过特定表的错误? 3. Flink CDC 3.4.0版本有哪些错误处理的新特性? </think>### 使用 Flink Paimon Action 1.0.1 时 CDC 报错的终极解决方案 当添加 `debezium.deserialization.skip.parse.errors=true` 后仍报错时(常见于时间戳解析、数据类型转换等问题),请按以下步骤排查: --- ### 一、核心排查步骤 #### 1. **验证配置生效性** 检查配置传递是否正确(特别注意配置项位置): ```bash ./bin/flink run \ ./lib/paimon-flink-action-1.0.1.jar \ mysql_sync_database \ --warehouse /path/to/warehouse \ --database app_db \ # 配置项必须在 --mysql_conf 区内 --mysql_conf hostname=your_host \ --mysql_conf username=root \ --mysql_conf password=your_pwd \ --mysql_conf database-name=source_db \ --mysql_conf debezium.deserialization.skip.parse.errors=true \ # ✅ 正确位置 --table-conf bucket=1 ``` ⚠️ **常见错误**:将配置放在 `--table-conf` 或外部,导致 Debezium 未生效[^2]。 #### 2. **追加强制跳过配置** 在 `--mysql_conf` 中添加 **双重保险配置**: ```bash --mysql_conf debezium.event.deserialization.failure.handling.mode=skip \ --mysql_conf debezium.skipped.operations=u,d \ # 可选:跳过update/delete错误 ``` **作用**: - `failure.handling.mode=skip` 是 Debezium 2.4+ 的强化错误跳过机制 - 与 `skip.parse.errors` 形成双重保障[^3] #### 3. **启用 DEBUG 日志定位根源** 在 `flink-conf.yaml` 中启用 Debezium 调试日志: ```yaml logger.debezium.name: io.debezium logger.debezium.level: DEBUG ``` 日志中将明确显示: - 被跳过的具体字段和值(如 `Skipping field 'create_time' with value '1971-01-01T00:00:00+08:00'`) - 未生效的配置项(如 `Ignoring configuration debezium.*`) --- ### 二、版本兼容性终极方案 #### 1. **强制指定 CDC 连接器版本** 通过 `--jarfile` 显式覆盖 Action 内置的 CDC 版本(推荐 3.4.0+): ```bash ./bin/flink run \ --jarfile /path/to/flink-sql-connector-mysql-cdc-3.4.0.jar \ # ✨ 关键 ./lib/paimon-flink-action-1.0.1.jar \ mysql_sync_database \ ... # 其他参数 ``` **为什么有效**: paimon-flink-action-1.0.1.jar 内置的 CDC 版本可能低于 3.4.0,而 `skip.parse.errors` 在旧版中存在已知 bug[^1][^3]。 #### 2. **升级组件矩阵** | 组件 | 最低要求版本 | 推荐版本 | |---------------|-------------|-----------| | **Flink CDC** | 3.4.0 | 3.4.1 | | **Debezium** | 2.4 | 2.5.4 | | **Java** | JDK 11 | JDK 17 | 验证命令: ```bash # 查看 flink-sql-connector-mysql-cdc 实际版本 unzip -p flink-sql-connector-mysql-cdc-*..jar META-INF/MANIFEST.MF | grep Bundle-Version ``` --- ### 三、数据类型兼容处理 #### 1. **时间戳字段特殊处理** 在 `--mysql_conf` 添加时区转换规则: ```bash --mysql_conf debezium.time.precision.mode=adaptive \ --mysql_conf debezium.converter.schemas.enable=false \ --mysql_conf server-time-zone=Asia/Shanghai # 按需修改时区 ``` #### 2. **源表结构修正** 对问题字段添加 **默认值约束**(MySQL 端): ```sql ALTER TABLE problem_table MODIFY COLUMN invalid_timestamp TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP; ``` --- ### 四、验证流程 1. **本地测试** 用 Flink SQL Client 直接读取 CDC 数据: ```sql CREATE TABLE test_cdc ( id INT, create_time TIMESTAMP(3) ) WITH ( 'connector' = 'mysql-cdc', 'hostname' = 'your_host', 'username' = 'root', 'password' = 'your_pwd', 'database-name' = 'source_db', 'table-name' = 'problem_table', 'debezium.deserialization.skip.parse.errors' = 'true' ); SELECT * FROM test_cdc; -- 观察错误是否被跳过 ``` 2. **监控指标** 在 Flink Web UI 中检查: - `numRecordsOut`(正常输出的记录数) - `numRecordsIn`(输入记录数) - 差值即为跳过的错误记录数 --- ### 总结建议 ```mermaid graph TD A[报错未解决] --> B{检查配置位置} B -->|位置正确| C[追加 failure.handling.mode=skip] B -->|位置错误| D[修正到 --mysql_conf 区] C --> E[强制指定 CDC 3.4.0+] E --> F[启用 DEBUG 日志] F --> G[根据日志修复源表] ``` **最终组合配置**: ```bash --mysql_conf debezium.deserialization.skip.parse.errors=true \ --mysql_conf debezium.event.deserialization.failure.handling.mode=skip \ --mysql_conf server-time-zone=Asia/Shanghai ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值