解决了的:
结果证明这是我的udtf中的一个错误。我找到了一个解决办法,但我不太明白它为什么起作用。在开始实现udtf时,eclipse建议 initialize
已弃用。但是如果我跳过它,就会出错,所以我还是实现了它。我在该方法中放置了一个变量初始化,猜测init只需执行一次。jar适用于一些更简单的场景,但是如果要将udtf输出与udf一起使用,那么就使用udf输出来执行一些操作,比如欺骗 cluster by
或者 insert
,我得到了前面提到的错误。我的工程师朋友发现 initialize
实际上不止一次被处决。所以我把初始化放进去 process
,带有 if
检查变量是否为空,如果为空则初始化它。然后一切正常,我的作弊也起作用了。不过,如果有人能给我一个解释,我将非常感激。
以下是我最初的问题:
我知道我不应该使用 cluster by
在udtf之后,所以 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版本的问题,但终究无法解决这个问题。。。我猜一定是我做错了什么。
1条答案
按热度按时间kognpnkq1#
结果证明这是我的udtf中的一个错误。我找到了一个解决办法,但我不太明白它为什么起作用。在开始实现udtf时,eclipse建议
initialize
已弃用。但是如果我跳过它,就会出错,所以我还是实现了它。我在该方法中放置了一个变量初始化,猜测init只需执行一次。jar适用于一些更简单的场景,但是如果要将udtf输出与udf一起使用,那么就使用udf输出来执行一些操作,比如欺骗cluster by
或者insert
,我得到了前面提到的错误。我的一个工程师朋友发现初始化实际上执行了不止一次。所以我把初始化放进去process
,带有if
检查变量是否为空,如果为空则初始化它。然后一切正常,我的作弊也起作用了。不过,如果有人能给我一个更具体的解释,我将不胜感激。