【问题标题】:How to identify Sqoop failures and handle them?如何识别 Sqoop 故障并进行处理?
【发布时间】:2018-03-23 21:08:19
【问题描述】:

我正在使用 sqoop 将数据从 hive 表导出到 SQLServer 表,但有时所有记录都没有导出。

我不确定如何在没有人工干预的情况下识别此故障。我计划通过编写一个 shell 脚本来解决这个问题 -

1) 将 hive 表的计数存储在变量中。 2) 将 SQL Server 表的计数存储在另一个变量中。 3)比较两个变量的值,

    if var1 != var 2 
    { 
       Delete the rows in SQL Server Server;
        Rerun my sqoop script
    }
    else
       exit;

问题: 以我目前的做法, 如何将配置单元表的行数存储在 shell 脚本的变量中? 如何在 shell 脚本中存储 SQL-Server-Management Studio 中表的行数?

【问题讨论】:

  • 是 sqoop 命令失败,您想检查它的状态还是 sqoop 命令运行正常但仍然没有导入整个数据集?
  • Sqoop 命令运行良好,但有时不会导出所有记录。

标签: sql-server shell validation hive sqoop


【解决方案1】:

Sqoop 提供了一个开箱即用的验证工具,以确保执行导入/导出的正确性。您可以使用以下标志执行此操作:

--validate

请参阅https://sqoop.apache.org/docs/1.4.6/SqoopUserGuide.html#validation,其中详细说明了所有 3 个验证接口。

根据具体情况,

Validator - 通过将决策委托给 ValidationThreshold 并将故障处理委托给 ValidationFailureHandler 来驱动验证逻辑。默认实现是 RowCountValidator,它验证来自源和目标的行数。

您可以通过实现自己的验证器来进一步对验证输出采取措施,如下所示:

验证框架是可扩展和可插入的。它带有默认实现,但可以通过将接口作为命令行参数的一部分传递来扩展接口以允许自定义实现,如下所述。

【讨论】:

  • 我使用了 --validate 语句,但它给了我一个错误。 ERROR tool.ExportTool:导出期间出错:验证行计数时出错这让我想到一个问题,如果两个表上的行计数不匹配,它会重新运行 sqoop 语句吗?如果是,那么我的 SQl 服务器表中是否会有重复值?
  • 在验证行数期间不确定error,发布错误跟踪会有所帮助。现在,如果两个表上的行数不匹配,如文档所述,您可以在需要实现org.apache.sqoop.validation.ValidationFailureHandler 的地方提供validation-failurehandler,在这里您可以决定是否重新运行。
  • 如何实现ValidationFailureHandler中需要做的事情?
  • 这些是标准接口。您可以在提到的 sqoop 文档中找到这些内容。您可以在 java 中的此处理程序中实现失败后需要执行的操作。
  • 验证计数时出错的原因是我正在将每日记录导出到 SQL-Server。但是 SQL Server 有多天的行,而 Hive 表只有一个,这使得它永远不会相同。
【解决方案2】:

基本上,您在将数据从配置单元导出到 sqlserver 后尝试进行协调。要从 sqlserver 获取计数,您可以编写 java/scala jdbc 程序。

下面是伪代码

hiveCount = `hive -e "select count(*) from foo_table"`
sqlServerCount= java/scala jdbcCount.jar

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 2018-06-09
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多