当前位置: 首页 > news >正文

Sqoop源码修改:增加落地HDFS文件数与MapTask数量一致性检查

个人博客地址:Sqoop源码修改:增加落地HDFS文件数与MapTask数量一致性检查 | 一张假钞的真实世界

本篇是对记录一次Sqoop从MySQL导入数据到Hive问题的排查经过的补充。

Sqoop 命令通过 bin 下面的脚本调用,调用如下:

exec ${HADOOP_COMMON_HOME}/bin/hadoop org.apache.sqoop.Sqoop "$@"

org.apache.sqoop.Sqoop 是 Sqoop 的入口类,在此主要是解析参数及初始化工具类,然后通过 org.apache.hadoop.util.ToolRunner 类调用对应的工具完成操作。Sqoop 的 Import 操作对应的是 org.apache.sqoop.tool.ImportTool 类。

在 ImportTool 类的 return 代码前增加以下代码:

int numMappers = options.getNumMappers();String hDbName = options.getHCatDatabaseName();
String hTableName = options.getHCatTableName();
String hPartKeys = options.getHCatalogPartitionKeys();
String hPartVals = options.getHCatalogPartitionValues();if(isStringNotEmpty(hDbName) && isStringNotEmpty(hTableName) && isStringNotEmpty(hPartKeys) &&     isStringNotEmpty(hPartVals)) {String[] partKeys = hPartKeys.split(",");String[] partVals = hPartVals.split(",");String partPathStr = "";if(partKeys.length > 0 && partVals.length == partKeys.length) {for(int i = 0; i < partKeys.length; i++) {partPathStr += partKeys[i] + "=" + partVals[i] + "/";}}String targetDir = "/user/hive/warehouse/" + hDbName + ".db/" + hTableName + "/" + partPathStr;targetDir = targetDir.toLowerCase();LOG.info("---------targetDir=" + targetDir);try {FileSystem fs = FileSystem.get(options.getConf());RemoteIterator<LocatedFileStatus> rIter = fs.listFiles(new Path(targetDir), false);int fileCount = 0;while(rIter.hasNext()) {fileCount++;rIter.next();}LOG.info("---------------fileCount=" + fileCount);if(numMappers != fileCount) {LOG.error("files number in hdfs not equals mapper task number !");return 2;}} catch (IOException e) {LOG.error("count files number from hdfs error !");e.printStackTrace();return 3;}
}

改动只针对 Sqoop 集成 HCatalog 方式导入 ORC 格式的情况。因为我们的数据仓库中都采用的是这种方式。

优化:当 MySQL 中记录数特别少时,如少于 4 条记录,则默认 Sqoop 的 MapTask 数量为 4 但其实际执行时因为原始记录数不够则实际执行的 MapTask 数量会跟实际的记录数一致,此时 split 数量跟落地 HDFS 的文件数量一致。所以,可以根据 Sqoop 对应 MR 的实际 split 数量进行判断文件数量。

http://www.lryc.cn/news/529475.html

相关文章:

  • 嵌入式系统|DMA和SPI
  • leetcode——将有序数组转化为二叉搜索树(java)
  • 冯诺依曼结构和进程概念及其相关的内容的简单介绍
  • Native Memory Tracking 与 RSS的差异问题
  • 在K8s中部署动态nfs存储provisioner
  • 家庭财务管理系统的设计与实现
  • 数据结构-Stack和栈
  • 使用vhd虚拟磁盘安装两个win10系统
  • 代码随想录34 动态规划
  • 【2025年最新版】Java JDK安装、环境配置教程 (图文非常详细)
  • Shell特殊状态变量以及常用内置变量总结
  • 【4Day创客实践入门教程】Day4 迈向高手之路——进一步学习!
  • EtherCAT-快速搭建
  • 【设计测试用例自动化测试性能测试 实战篇】
  • DBeaver连接MySQL提示Access denied for user ‘‘@‘ip‘ (using password: YES)的解决方法
  • 【MySQL — 数据库增删改查操作】深入解析MySQL的 Update 和 Delete 操作
  • 04树 + 堆 + 优先队列 + 图(D1_树(D1_基本介绍))
  • 【Proteus仿真】【51单片机】多功能计算器系统设计
  • Solon Cloud Gateway 开发:Route 的配置与注册方式
  • jstat命令详解
  • [Collection与数据结构] B树与B+树
  • Ubuntu 24.04 安装 NVIDIA Container Toolkit 全指南:让Docker拥抱GPU
  • 17.Word:李楠-学术期刊❗【29】
  • 图漾相机——C++语言属性设置
  • 【性能优化专题系列】利用CompletableFuture优化多接口调用场景下的性能
  • docker安装emqx
  • DeepSeek超越ChatGPT的能力及部分核心原理
  • Leetcode 3434. Maximum Frequency After Subarray Operation
  • 《DeepSeek-R1 问世,智能搜索领域迎来新变革》
  • GEE | 植被总初级生产力GPP的时间变化特征