火花缓行器

2024-09-27 19:22:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我的工作是查询数据,然后在其上建立一个可视化。目前,我的整个管道都在工作,但有时返回查询结果可能需要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分钟比预期的要多。 https://github.com/Azure-Samples/hdinsight-dotnet-odbc-spark-sql/blob/master/Program.cs 我提取数据的代码与此类似^

问题是,这条管道能正常工作,但速度太慢,无法发挥任何作用。我创建的可视化最多需要在几秒钟内获取数据。在

其他细节: 大量查询使用日期在int format = 20170629(2017年6月29日)中的DateID 示例查询=select DateId, count(PageId) as total from permanent_table where (DateId >= 20170623) and (DateId <= 20170629) group by DateId order by DateId asc

任何帮助将不胜感激!提前谢谢! 谢谢您!在


Tags: csv数据coredfwindowstablefolderazure
1条回答
网友
1楼 · 发布于 2024-09-27 19:22:23

首先,澄清一点:您从ODBC连接运行什么查询?是表创建查询吗?他们需要很长时间。请确保在预先创建的配置单元表上仅从ODBC运行read查询。在

现在假设您完成了上面的操作,您可以做一些事情来让查询在几秒钟内运行。在

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

  2. 3500个文件太多了。创建拼花地板表时,将其合并(num_partitions)(或重新分区)到较小数量的分区中。调整它,使每个分区有大约100MB的空间,或者如果没有足够的数据,那么每个集群的每个核心至少有一个分区。

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

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

  5. 集群的大小。对于500GB的文本文件,使用D14v2的几个节点(可能是2-4个)就可以了。但取决于查询的复杂性。

相关问题 更多 >

    热门问题