18

ほとんどの場合に起動する次のコードがありますhiveContext.sql()。私の仕事は、いくつかのテーブルを作成し、すべてのハイブ テーブル パーティションの処理後に値を挿入することです。

したがって、最初に起動show partitionsし、その出力を for ループで使用して、テーブルを作成し (テーブルが存在しない場合)、 を使用してテーブルに挿入するいくつかのメソッドを呼び出しますhiveContext.sql

現在、エグゼキューターで実行することはできないためhiveContext、ドライバー プログラムの for ループでこれを実行する必要があり、1 つずつシリアルに実行する必要があります。YARN クラスターでこの Spark ジョブを送信すると、ほとんどの場合、シャッフルが見つからないという例外が原因でエグゼキューターが失われます。

これは、メモリの過負荷のために YARN がエグゼキュータを強制終了しているためです。ハイブ パーティションごとに非常に小さなデータ セットがあるため、理由はわかりませんが、それでも YARN がエグゼキュータを強制終了します。

次のコードは、すべてを並行して実行し、すべてのハイブ パーティション データを同時にメモリに格納しようとしますか?

public static void main(String[] args) throws IOException {   
    SparkConf conf = new SparkConf(); 
    SparkContext sc = new SparkContext(conf); 
    HiveContext hc = new HiveContext(sc); 

    DataFrame partitionFrame = hiveContext.sql(" show partitions dbdata partition(date="2015-08-05")"); 
  
    Row[] rowArr = partitionFrame.collect(); 
    for(Row row : rowArr) { 
        String[] splitArr = row.getString(0).split("/"); 
        String server = splitArr[0].split("=")[1]; 
        String date =  splitArr[1].split("=")[1]; 
        String csvPath = "hdfs:///user/db/ext/"+server+".csv"; 
        if(fs.exists(new Path(csvPath))) { 
            hiveContext.sql("ADD FILE " + csvPath); 
        } 
        createInsertIntoTableABC(hc,entity, date); 
        createInsertIntoTableDEF(hc,entity, date); 
        createInsertIntoTableGHI(hc,entity,date); 
        createInsertIntoTableJKL(hc,entity, date); 
        createInsertIntoTableMNO(hc,entity,date); 
   } 
}
4

2 に答える 2

19

一般に、実際の例外を取得するには、常にログを掘り下げる必要があります (少なくとも Spark 1.3.1 では)。

tl; dr
Yarn での Spark の安全な構成
spark.shuffle.memoryFraction=0.5- これにより、シャッフルで割り当てられたメモリをより多く使用できるようになります
spark.yarn.executor.memoryOverhead=1024- これは MB で設定されます。Yarn は、メモリ使用量が (executor-memory + executor.memoryOverhead) よりも大きい場合、executor を強制終了します。

もう少し情報

あなたの質問を読むと、シャッフルが見つからないという例外が発生することがわかります。

の場合は 、たとえば 0.5 にorg.apache.spark.shuffle.MetadataFetchFailedException: Missing an output location for shuffle 増やす必要があります。spark.shuffle.memoryFraction

Yarn がエグゼキュータを強制終了する最も一般的な理由は、予想を超えるメモリ使用量でした。を増やすspark.yarn.executor.memoryOverheadのを避けるために、エグゼキュータが 2 ~ 3G のメモリしか使用しない場合でも、1024 に設定しました。

于 2015-10-14T06:52:01.393 に答える