2017-02-08 19 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选项。

相关问题