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 数量进行判断文件数量。

相关推荐
.格子衫.35 分钟前
Spring Boot 原理篇
java·spring boot·后端
多云几多1 小时前
Yudao单体项目 springboot Admin安全验证开启
java·spring boot·spring·springbootadmin
Jabes.yang3 小时前
Java求职面试实战:从Spring Boot到微服务架构的技术探讨
java·数据库·spring boot·微服务·面试·消息队列·互联网大厂
聪明的笨猪猪3 小时前
Java Redis “高可用 — 主从复制”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
兮动人3 小时前
Spring Bean耗时分析工具
java·后端·spring·bean耗时分析工具
MESSIR223 小时前
Spring IOC(控制反转)中常用注解
java·spring
摇滚侠4 小时前
Spring Boot 3零基础教程,Demo小结,笔记04
java·spring boot·笔记
笨手笨脚の4 小时前
设计模式-迭代器模式
java·设计模式·迭代器模式·行为型设计模式
Q26433650235 小时前
【有源码】基于Hadoop生态的大数据共享单车数据分析与可视化平台-基于Python与大数据的共享单车多维度数据分析可视化系统
大数据·hadoop·python·机器学习·数据分析·spark·毕业设计
spencer_tseng5 小时前
Eclipse 4.7 ADT (Android Development Tools For Eclipse)
android·java·eclipse