火花慢性能

时间:2017-06-29 19:00:54

标签: python apache-spark odbc parquet hdinsight

我正在研究数据,然后在其上构建可视化。目前我的整个管道工作正常,但有时可能需要超过10分钟来返回我的查询结果,而且我非常确定我错过了一些优化或导致这种低速的另一个关键步骤。

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

这是我用来摄取数据的脚本(Azure Jupyter Notebook上的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 我提取数据的代码类似于这个^

问题在于管道是否正常工作但是它太慢而无法使用。我创建的可视化需要在几秒钟内提取数据。

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

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

1 个答案:

答案 0 :(得分:0)

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

现在假设您执行上述操作,您可以在几秒钟内完成查询。

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

  2. 3500个文件太多了。当您创建镶木地板表coalesce(num_partitions)(或重新分区)时,它会分成较少数量的分区。调整它,使每个分区大约100MB,或者如果没有足够的数据 - 至少每个核心的一个分区。

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

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

  5. 群集的大小。对于500GB的文本文件,D14v2的节点很少(可能是2-4)。但取决于查询的复杂程度。