![](/img/trans.png)
[英]spark.default.parallelism for Parallelize RDD defaults to 2 for spark submit
[英]Parallelism: rdd.parallelize(…) vs dataSet.map(…)?
我已经使用DataFrame / DataSet和RDD实现了Spark应用程序。 我将应用程序提交到了我的Spark 2.1.1本地开发环境。 我的电脑有八个 CPU内核。
DateFrame /数据集
val date : LocalDate = ....
val conf = new SparkConf()
val sc = new SparkContext(conf.setAppName("Test").setMaster("local[*]"))
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
val itemListJob = new ItemList(sqlContext, jdbcSqlConn)
import sqlContext.implicits._
val processed = itemListJob.run(rc, priority).select("id").map(d => {
val (a, b) = runJob.run(d, date) // returns a tuple of (int, java.sql.Date), which are the passed parameters.
s"$a, $b"
})
class ItemList(sqlContext: org.apache.spark.sql.SQLContext, jdbcSqlConn: String) {
def run(date: LocalDate) = {
import sqlContext.implicits._
sqlContext.read.format("jdbc").options(Map(
"driver" -> "com.microsoft.sqlserver.jdbc.SQLServerDriver",
"url" -> jdbcSqlConn,
"dbtable" -> s"dbo.GetList('$date')"
)).load()
.select("id")
.as[Int]
}
}
processed.write.text("c:\\temp\\mpa")
RDD
val itemList = itemListJob.run(rc, priority).select("id").rdd.map(r => r(0).asInstanceOf[Int]).collect()
val processed = sc.parallelize(itemList).map(d => {
runJob.run(d, rc) // returns a tuple of (int, LocalDate), which are the passed parameters.
})
processed.saveAsTextFile("c:\\temp\\mpa")
RDD应用程序拆分并生成了八个文本文件,而Dataframe / DataSet一个仅生成了一个文件。 这是否意味着RDD并行运行了八个runJob.run()
,而DataFrame / DataSet方法仅一次运行了一个而没有并发?
我希望runJob.run()既可以分散运行,又可以并行运行,它可以完成主要工作量,并且还会进行jdbc调用。
是。 但是实际上没有必要将数据收集回驱动程序以进行并行化。 您可以只调用Dataset.repartition(...)
将一个分区拆分为多个分区。 更好的方法是使用其他jdbc
重载从JDBC加载数据,例如http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.sql.DataFrameReader@jdbc( url:String,table:String,predicates:Array [String],connectionProperties:java.util.Properties):org.apache.spark.sql.DataFrame或http://spark.apache.org/docs/latest/api/ scala/index.html#org.apache.spark.sql.DataFrameReader@jdbc(URL:字符串,表:字符串,谓词:数组[字符串],ConnectionProperties中:java.util.Properties):org.apache.spark.sql。避免乱序使用DataFrame 。
是的,生成的文件数量很好地表明了最后一步的并行性。 (我可以想到一些极端的情况,虽然可能并非如此,但这在这里是不相关的)
在本地运行时, sc.parallelize
应该根据内核数进行拆分。
但是,在两种情况下,您都将仅使用1个内核来读取jdbc连接,而在RDD情况下,您还需要将数据collect()
返回驱动程序,然后parallelize
回任务。
首选方法是使用repartition
而不是collect
然后parallelize
。 更好的是始终并行执行操作。 在通过jdbc加载数据帧的情况下,请考虑使用参数partitionColumn, lowerBound, upperBound, numPartition
( link )是否适用,以便从一开始就并行运行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.