2017-02-08 50 views
1

在Spark Dataframe中,我正在尋找下面引擎優化的解釋。Dataframe將直接從Executor連接到RDBMS,否則它將通過驅動程序?

  1. 數據幀是特殊類型的RDD,它內部包含行RDD。這些RowRDD分佈在執行者身上。
  2. 當我們編寫從執行者(尤其是在紗線客戶機模式運行),該行RDDS從執行者轉移到驅動程序和驅動寫入到Oracle使用JDBC連接。(這是真的嗎?)
  3. 當這些RowRDDs在YARN-CLUSTER模式下運行相同的代碼,Row 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選項。

相關問題