Hive 宏/UDF - 并行/组合/单个解释器



我想创建一个Hive扩展(宏/UDF/网关/代理/外观或其他东西),它可以

    a) 创建/修改数据库表和

    b) 过程数据。

这里的问题是,对于 b) 并行处理作为 UDF 的常见做法是需要的,而对于 a) 必须防止它),例如因为我无法多次将同一列添加到表中。在外部接口上,解决方案应与SAS,SAP,R,Pentaho的Hive连接器兼容,即它仍然应该像Hive一样运行和使用。

您如何建议实现数据库创建/修改语句的执行,而不会因并行执行 UDF 而遇到重复 HQL 命令的错误?

我的想法:

    1. 使用 JDBC 包装器来处理 a) 如此处描述的和 UDF 用于 b)、问题:需要额外的编程,(客户端/服务器端)安装和配置:http://stackoverflow.com/questions/8293314/is-there-any-lightweight-jdbc-wrapper-with-these-features、https://www.redfin.com/blog/2011/03/boilerplate_jdbc_wrapper.html、http://www.javaworld.com/article/2074249/data-storage/create-your-own-type-3-jdbc-driver--part-1.html、http://jdbc.jcabi.com/

    2. 使用 UDF 的 Hive + 挂钩到Hive 解析器中。在钩子内部,HQL 只会执行一次: 问题:非常复杂,需要更改 Hive 设置(可能不可接受): http://stackoverflow.com/questions/17461932/hive-execution-hook

    3. 使用宏进行配置。问题:似乎并不完全成熟,受限(主要是数量?)并且记录不佳。

    4. Hive with UDF + explicit combiner RESTful service + JDBC/Beeline/HCatalog as Hive command API。问题:SPoF(单点故障)。

    5. 基于 UDF + Hive 组合器的实现的 Hive。问题:不可能或非常复杂:http://stackoverflow.com/questions/10925840/partial-aggregation-vs-combiners-which-one-faster

    6. 对 UDAF 使用如下所示的聚合/组合方法: 问题:没有很好的文档记录,也许不可行:http://www.dataiku.com/blog/2013/05/01/a-complete-guide-to-writing-hive-udf.html

    7. 从 GenericUDAFEvaluator 派生并实现合并,以便在单独的表中仅创建一次所需的 SQL 语句。其他一些机制(如 Hive 宏)可以执行此表中累积的命令。问题:复杂的实现和 Hive 宏的问题。

    8. 使用/扩展 Hive 网关实现,如 Knox 网关服务配置单元: http://repo1.maven.org/maven2/org/apache/knox/gateway-service-hive/0.8.0/问题:过于特定于诺克斯。在大多数情况下,通用 JDBC 包装器是更好的基础。

还不够:

    9. 在支持此功能的 HQL 语句的语句中添加"如果不存在"。还有其他机制,如 http://stackoverflow.com/questions/14381895/mysql-add-column-if-not-exist http://stackoverflow.com/questions/972922/add-column-to-mysql-table-if-it-does-not-exist

    10. GitHub 上的 UDF https://github.com/jwills/exhibit 还不够,但很有趣。

    11. getExistingHiveConnection() 混淆了 Hive 解析器;getNewHiveConnection() 也不能解决不需要并行执行 HQL 结构命令导致错误的问题。

我注意到在 UDF 中创建另一个与 Hive 的连接会导致 Hive 解析器的混淆——这是可以理解的。但是,在复杂的UDF中,我还注意到在这种情况下,第二个.toString()不再起作用,为什么? public Object evaluate(GenericUDF.DeferredObject[] paramArrayOfDeferredObject) { … for (int i = 0; i < paramLen; i++) { paramObj = paramArrayOfDeferredObject[i].get(); paramObjectArr[i] = this.objConverters[0].convert(paramObj); tableName = paramObjectArr[i].toString(); // works …} 后: String tableName = paramObjectArr[0].toString(); // does NOT work, empty string is assigned, why?

@Thomas_Poetter - 你在这里提供了很多考虑因素,但我并不完全清楚你的实际用例是什么。例如,为什么不将 1 和 2 完全拆分,直接对 HS2 执行结构任务并将处理放在 UDF 中?

Oozie还可以提供一些有趣的工作流程功能,以保持其独立但作为单个工作流程执行。

请注意,Knox 只是用于 JDBC/ODBC 调用 HS2 的流网关。为这种事情扩展它没有多大意义。但是,您可以提供一个简单的自定义服务来公开 Knox 可以为您代理的 API。如果您需要独立于某些外部应用程序执行任务,那么这可能很有用。

最新更新