Python 火花慢性能

Python 火花慢性能,python,apache-spark,odbc,parquet,azure-hdinsight,Python,Apache Spark,Odbc,Parquet,Azure Hdinsight,我正在查询数据,然后在其上构建可视化。目前,我的整个流程正常工作,但有时返回查询结果可能需要10分钟以上,我非常确定我错过了一些优化或导致速度缓慢的另一个关键步骤 详情: 我有大约500gb的3500 csv。我将这些存储在Azure Blob存储帐户中,并在Azure HDInsights上运行spark群集。我正在使用spark 2.1 以下是我用来接收数据的脚本(Azure Jupyter笔记本上的PySpark3): csv_df = spark.read.csv('wasb://con

我正在查询数据,然后在其上构建可视化。目前,我的整个流程正常工作,但有时返回查询结果可能需要10分钟以上,我非常确定我错过了一些优化或导致速度缓慢的另一个关键步骤

详情: 我有大约500gb的3500 csv。我将这些存储在Azure Blob存储帐户中,并在Azure HDInsights上运行spark群集。我正在使用spark 2.1

以下是我用来接收数据的脚本(Azure Jupyter笔记本上的PySpark3):

csv_df = spark.read.csv('wasb://containername@storageaccountname.blob.core.windows.net/folder/*.csv', header=True, inferSchema=True)   //Read CSV
csv_df.write.parquet('wasb://containername@storageaccountname.blob.core.windows.net/folder/parquet_folder/csvdfdata.parquet’) //Write Parquet
parquet_df = spark.read.csv('wasb://containername@storageaccountname.blob.core.windows.net/folder/parquet_folder/csvdfdata.parquet) //Read Parquet
parquet_df.createOrReplaceTempView(‘temp_table’) //Create a temporary table
spark.sql("create table permenant_table as select * from temp_table"); //Create a permanent table
然后我使用ODBC驱动程序和这段代码来提取数据。我知道odbc可以让事情慢一点,但我相信10分钟比预期的要多。 我提取数据的代码与此类似^

问题是,这条管道可以工作,但速度太慢,无法发挥任何作用。我创建的可视化最多需要几秒钟的时间来提取数据

其他详情: 大量查询使用日期ID,其日期为
int格式=20170629
(2017年6月29日)
示例查询=
选择DateId,从永久性_表(DateId>=20170623)和(DateId中计算(PageId)作为总计。首先,需要澄清的一点是:您从ODBC连接运行的是什么查询?是表创建查询吗?它们会花费很长时间。请确保在预先创建的配置单元表上只运行来自ODBC的读取查询

现在假设您执行了上述操作,那么您可以在几秒钟内运行查询

  • HDI上的Thrift server使用动态资源分配。因此,在分配资源时,第一次查询将花费额外的时间。之后,查询速度应该会更快。您可以检查Ambari->Thrift UI->Thrift应用程序的状态它使用了多少资源-它应该使用集群的所有核心

  • 3500个文件太多。当您创建拼花地板表合并(num_分区)(或重新分区)时,将其划分为更小数量的分区。调整它,使每个分区大约有100MB的数据,或者如果没有足够的数据-集群的每个核心至少有一个分区

  • 在数据生成脚本中,您可以跳过一个步骤—而不是创建临时表—直接以拼花格式创建配置单元表。将
    csv_df.write.parquet
    替换为
    csv_df.write.mode(SaveMode.Overwrite)。savestable(“tablename”)

  • 对于日期查询,您可以按年、月、日列对数据进行分区(您需要先提取它们)。如果这样做,您就不必担心#2。您可能会有太多的文件,如果是这样,您需要将分区减少到仅年、月

  • 集群的大小。对于500GB的文本文件,D14v2的节点应该很少(可能是2-4个),但这取决于查询的复杂性


  • 嗨,Maxiluk,谢谢你的提示。我被dateId分割了,这给了我速度上的显著提升!对于500gb,我现在只需要2分钟。理想情况下,我想推动几秒钟。我应该进行任何其他优化来加快速度吗?另外,我的最终数据大小将接近12TB,目前我正在使用500gb进行测试。考虑到这一点,我需要做什么呢您建议我使用r配置吗?我目前使用的是D12 v2的头节点(2个节点8个核心)和D4 v2的4个工作节点(4个节点,32个核心)。我应该使用什么配置?您好,很抱歉响应延迟。您可以执行许多优化。我在Spark performance optimization系列视频中记录了最重要的优化:关于12TB的群集大小,您将使用其中10-40个D14_v2工作节点。数量越多,速度越快。