2017-03-15 4 views
1

解決:ハイブクエリ: `cluster by`でUDTFを使用する方法はありますか?

私のUDTFでは間違いです。私は修正を見つけるが、なぜそれが働いたのか分かりません。私がUDTFを実装し始めた当初、Eclipseはinitializeが推奨されなくなると示唆しました。しかし、それをスキップすればエラーになるので、とにかく実装しました。私はそのメソッドに変数の初期化を行い、initが1回だけ実行されることを推測します。 jarファイルはシンプルなシナリオではうまくいきましたが、UDFでUDTF出力を使用する場合は、cluster byinsertのようにUDF出力を使用して何かを行うと、前述のエラーが発生します。私のエンジニアの友人は、initializeが実際に複数回実行されたことを知りました。だから私はちょうどprocessに初期化を入れ、if変数がヌルであるかどうかをチェックし、そうであればそれを初期化します。その後、すべてうまく動作し、私のチートも働いた。それでも、誰かが私に説明を与えることができれば、私は最も感謝しています。


後、私の元の質問です:


私はUDTF後cluster byを使用することになっていないよ、そうselect myudtf("stringValue") cluster by rand()は動作しません知っています。

しかし、私のudtfは7000+を出力し、1時間に1つの行を増やしているので、その後の処理をすべてのhadoopクラスタスレーブユニットに配布する必要があります。

そして私は、私はcluster by rand()を使用せずにいることを得ることはありませんので、私は、次のチートしようとした想像:

OK 
some/key/value/string 
Time taken: 0.035 seconds, Fetched: 1 row(s) 
、私は、他のテーブルとの結果をラップ select key from (select myudtf("stringValue") as key) t limit 1;、それが正しい結果を与える

ファーストを

は、その後、私は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 

私はこれをしませんでしたテンポラリテーブルtを "ノーマル"テーブルとして扱うハイブを試してみてcluster byを適用して、すべてのhadoopスレーブに作業負荷を分配したいと思っていますが、残念なことにハイブは貧弱な試行錯誤。

私の誤解を明確にするのに役立ちますか、これを行う正しい方法のヒントを教えてください。

私は私の会社の高度な経験を持つエンジニアから助けを求められました。彼は深いシステムレベルのバグだと思っています。仕事を辞める前に20分間何か問題を追跡しようとしました。結局問題を解決することはできませんでした。 ...そして、私はそれが私が間違って行ったものでなければならないと思う。

+0

私の懸念は、マップ専用ジョブの 'myudtf(" stringValue ")'が単一のノードで処理されるか、すべてのスレーブにも分配されるということです。ワークロードを配布するようにハイブに指示するには、 'cluster by'や' join'のようなシャッフル操作が必要ですか?もしそうなら、私はそれをどうすればいいのですか、何もする必要はなく、内部で巣を掘ることでそれを処理します。 – fanz

答えて

0

私のUDTFでは間違いであることが判明しました。私は修正を見つけるが、なぜそれが働いたのか分かりません。私がUDTFを実装し始めた当初、Eclipseはinitializeが推奨されなくなると示唆しました。しかし、それをスキップすればエラーになるので、とにかく実装しました。私はそのメソッドに変数の初期化を行い、initが1回だけ実行されることを推測します。 jarファイルはシンプルなシナリオではうまくいきましたが、UDFでUDTF出力を使用する場合は、cluster byinsertのようにUDF出力を使用して何かを行うと、前述のエラーが発生します。私のエンジニアの友人は、初期化が実際に複数回実行されたことを発見しました。だから私はちょうどprocessに初期化を入れ、if変数がヌルであるかどうかをチェックし、そうであればそれを初期化します。その後、すべてうまく動作し、私のチートも働いた。それでも、誰かが私にもっと具体的な説明を与えることができれば、私は最も感謝しています。

関連する問題