Hive 查询:有没有办法将 UDTF 与“cluster by”一起使用?
Posted
技术标签:
【中文标题】Hive 查询:有没有办法将 UDTF 与“cluster by”一起使用?【英文标题】:Hive query: Is there a way to use UDTF with `cluster by`? 【发布时间】:2017-03-15 14:33:23 【问题描述】:已解决:
事实证明这是我的 UDTF 中的一个错误。我找到了一个修复方法,但我不太明白它为什么会起作用。在我开始实施 UDTF 时,Eclipse 建议不推荐使用 initialize
。但是如果我跳过它会出错,所以我还是实现了它。我在该方法中放置了一个变量初始化,猜测初始化只需要执行一次。该 jar 适用于一些更简单的场景,但如果我将 UDTF 输出与 UDF 一起使用,然后使用 UDF 输出做一些事情,比如作弊cluster by
或insert
,我得到了前面提到的错误。我的工程师朋友发现initialize
实际上被执行了不止一次。所以我只是把初始化放在process
中,用if
检查变量是否为空,如果是则初始化它。然后一切正常,我的作弊也奏效了。不过,如果有人能给我一个解释,我将不胜感激。
以下是我最初的问题:
我知道我不应该在 UDTF 之后使用 cluster by
,所以 select myudtf("stringValue") cluster by rand()
不起作用。
但是由于我的 udtf 每小时输出 7000 多行并且还在增长,所以我真的需要将后续处理分配给我所有的 hadoop 集群从属单元。
我想如果不使用cluster by rand()
,我不会得到它,所以我尝试了以下作弊:
首先我用另一个表 select key from (select myudtf("stringValue") as key) t limit 1;
将结果包装起来,它给出了正确的结果,
OK
some/key/value/string
Time taken: 0.035 seconds, Fetched: 1 row(s)
然后我添加cluster by
部分,select key from (select myudtf("stringValue") as key) t cluster by rand() limit 1
,然后我得到错误:
WARNING: Hive-on-MR is deprecated in Hive ...
....
Task with the most failures(4):
-----
Task ID:
task_....
URL:
http:....
....
-----
Diagnostic Messages for this Task:
Error: tried to access class sun.security.ssl.SSLSessionContextImpl from class sun.security.ssl.SSLSessionContextImplConstructorAccess
FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask
MapReduce Jobs Launched:
Stage-Stage-1: Map: 1 Reduce: 1 HDFS Read: 0 HDFS Write: 0 FAIL
Total MapReduce CPU Time Spent: 0 msec
我这样做是为了欺骗 hive 将临时表 t
视为“正常”表,我可以将 cluster by
应用于它,希望它将工作负载分配给所有 hadoop 从属服务器,但不幸的是 hive足够聪明,可以看穿我尝试失败的伎俩。
那么,谁能帮我澄清一下我的误解,或者给我一些正确的方法提示?
仅供参考,我向我公司一位经验丰富的工程人员寻求帮助,他认为这可能是一个更深层次的系统级错误,他试图在下班前 20 分钟追踪问题,他确实发现了一些 lib 版本问题但毕竟无法解决问题。 ......我只是想这一定是我做错了什么。
【问题讨论】:
我认为我的担忧归结为select myudtf("stringValue")
,一个仅映射的作业,是在单个节点上处理还是分发给所有从属节点。我是否必须进行像cluster by
或join
这样的随机操作来告诉hive 分配工作负载。如果是这样,我应该怎么做,或者我不需要做任何事情,hive 内部会处理。
【参考方案1】:
事实证明这是我的 UDTF 中的一个错误。我找到了一个修复方法,但我不太明白它为什么会起作用。在我开始实施 UDTF 时,Eclipse 建议不推荐使用 initialize
。但是如果我跳过它会出错,所以我还是实现了它。我在该方法中放置了一个变量初始化,猜测初始化只需要执行一次。该 jar 适用于一些更简单的场景,但如果我将 UDTF 输出与 UDF 一起使用,然后使用 UDF 输出做一些事情,比如作弊cluster by
或insert
,我得到了前面提到的错误。我的工程师朋友发现初始化实际上执行了不止一次。所以我只是把初始化放在process
,用if
检查变量是否为空,如果是则初始化它。然后一切正常,我的作弊也奏效了。不过,如果有人能给我更具体的解释,我将不胜感激。
【讨论】:
以上是关于Hive 查询:有没有办法将 UDTF 与“cluster by”一起使用?的主要内容,如果未能解决你的问题,请参考以下文章