2017-02-08 9 views
1

Spark Dataframeでは、最適化のためのフードの説明の中で以下を探しています。DataframeはExecutorからRDBMSに直接接続するか、Driverを経由しますか?

  1. データフレームは特別なタイプのRDDであり、内部にRDDが含まれています。これらのRowRDDは、エグゼキュータにまたがって広がっています。
  2. 我々は執行行RDDSは、ドライバとOracleはJDBC接続を使用してに書き込むにEXECUTORから転送されます(特にYARN-CLIENTモードで実行中)。(これは本当ですか?)
  3. からこれらのRowRDDsを書くときYARN-CLUSTERモードで同じコードを実行すると、行RDDはExecutorから直接Oracleに書き込まれます。これは速いアプローチかもしれませんが、利用可能なJDBC接続はプロセスを制限したり減速させたりする可能性があります。

私はこのフードの下で起こることが親切にこれを検証し、間違っている場合は私を修正します。これは大きなパフォーマンス要因に影響します。

ありがとうございます。

答えて

0

各エグゼキュータは独自の接続を行います。

val df = (spark.read.jdbc(url=jdbcUrl, 
    dbtable="employees", 
    columnName="emp_no", 
    lowerBound=1L, 
    upperBound=100000L, 
    numPartitions=100, 
    connectionProperties=connectionProperties)) 
display(df) 

Spark UIでは、numPartitionsによって起動されるタスクの数が決まることがわかります。各タスクはエグゼキュータ間で分散され、これによりJDBCインタフェースを介した読み書きの並列性が向上します。上流のガイドを参照して、fetchsizeオプションなどのパフォーマンスに役立つその他のパラメータを調べてください。

関連する問題