火花(pyspark)速度测试
Posted
技术标签:
【中文标题】火花(pyspark)速度测试【英文标题】:Spark (pyspark) speed test 【发布时间】:2018-03-05 10:25:14 【问题描述】:我通过jdbc
连接到具有 500'000'000 行和 14 列的数据库。
这里是使用的代码:
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
properties = 'jdbcurl': 'jdbc:db:XXXXXXXXX','user': 'XXXXXXXXX', 'password': 'XXXXXXXXX'
data = spark.read.jdbc(properties['jdbcurl'], table='XXXXXXXXX', properties=properties)
data.show()
上面的代码用了 9 秒来显示 DB 的前 20 行。
后来我通过
创建了一个SQL临时视图data[['XXX','YYY']].createOrReplaceTempView("ZZZ")
我运行了以下查询:
sqlContext.sql('SELECT AVG(XXX) FROM ZZZ').show()
上面的代码花费了 1355.79 秒(大约 23 分钟)。这个可以吗?这似乎是一个很大的时间。
最后我试着统计了DB的行数
sqlContext.sql('SELECT COUNT(*) FROM ZZZ').show()
花费了 2848.95 秒(大约 48 分钟)。
我做错了什么还是这些金额是标准的?
【问题讨论】:
如果在第一个 sql 查询的末尾添加“LIMIT 20”会发生什么,它会加快结果吗?我无法想象这些处理时间是标准的。你利用你所有的核心吗?使用了多少节点(仅本地或集群中)以及为您的工作人员分配了多少 RAM? 您好 Aydin,我已经使用“LIMIT 20”启动了查询。我会尽快通知你。如何检查您询问的核心数量和其他信息?我可以说下面的 sn-p "spark.sparkContext._jsc.sc().getExecutorMemoryStatus().keySet().size()" 返回 4。 您可以通过不同的方式(spark-env 或以编程方式)设置内核并分配内存,看看这个答案是如何通过 python 以编程方式完成的:***.com/questions/41886346/… 您通常可以在 localhost:4040 上的 spark-gui 中检索作业的所有参数 另外,如果你在同一个数据集上一个接一个地运行两个查询,你应该缓存()或持久化()它们(如果它适合 mem_and_disk,最好保存在内存中)。这应该会加快第二次和后续查询。 【参考方案1】:当您使用这种方法读取 jdbc 源代码时,您会失去并行性,这是 spark 的主要优势。请阅读official spark jdbc guidelines,尤其是关于partitionColumn
、lowerBound
、upperBound
和numPartitions
。这将允许 spark 并行运行多个 JDBC 查询,从而产生分区数据帧。
同时调整fetchsize
参数可能对某些数据库有所帮助。
【讨论】:
嗨 Mariusz,实际上我的 spark.read.jdbc(...) 中没有参数“partitionColumn”,其中“spark = sparkSession.builder.getOrCreate()”。我只有“列”选项。有没有其他方法可以在不丢失并行性的情况下从源中读取? 我使用的是 Spark 2.1.0column
没问题,在下一个版本中已重命名。
嗨 Mariusz,我设置了 column 参数和您建议的其他参数(lowerBound = 1 和 upperBound = 10000 ) 但似乎以这种方式它根本不读取数据库。
它将读取此列中值为 1 到 10000 的行。您需要根据实际数据调整这些范围。以上是关于火花(pyspark)速度测试的主要内容,如果未能解决你的问题,请参考以下文章