2017-06-29 153 views
0

我正在查询数据,然后在上面建立一个可视化文件。目前我的整个管道工作正常,但有时可能需要10分钟才能返回我的查询结果,我非常肯定我错过了一些优化或其他导致速度降低的关键步骤。Spark Slow Performance

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

这里是脚本(PySpark3在Azure上Jupyter笔记本电脑),我用它来摄取数据:

csv_df = spark.read.csv('wasb://[email protected]/folder/*.csv', header=True, inferSchema=True) //Read CSV 
csv_df.write.parquet('wasb://[email protected]/folder/parquet_folder/csvdfdata.parquet’) //Write Parquet 
parquet_df = spark.read.csv('wasb://[email protected]/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

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

回答

0

首先,澄清一点:您从ODBC连接运行哪些查询?是表创建查询吗?他们需要很长时间。确保您只在预先创建的配置表格上运行ODBC读取查询。

现在假设你做了上面的事情,你可以做几件事情来让查询在几秒钟内运行。

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

  2. 3500个文件太多。创建parquet table coalesce(num_partitions)(或将其重新分区)为较小数量的分区时。调整它以便每个分区大约有100MB或者没有足够的数据 - 每个群集的核心至少有一个分区。

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

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

  5. 您的群集的大小。对于500GB的文本文件,您应该可以使用D14v2很少的节点(可能是2-4)。但取决于你的查询的复杂性。

+0

嗨Maxiluk,感谢您的提示。我用dateId分区,并且以极快的速度提高了我的速度!对于500GB我现在下降到2分钟左右。理想情况下,我想推几秒钟。我应该加快进行其他优化? 另外我的最终数据大小将接近12TB,目前我正在使用500GB进行测试。鉴于你会推荐使用什么集群配置?我目前正在使用D12 v2的头节点(2个节点8个核心)和4个D4 v2工作节点(4个节点,32个核心)。我应该使用什么配置? –

+0

嗨,抱歉,延迟与回应。有很多优化你可以做。我在下面的Spark性能优化系列视频中记录了最重要的视频:https://channel9.msdn.com/Shows/Data-Exposed/Spark-Performance-Series-1-with-Maxim-Lukiyanov – maxiluk

+0

关于12TB的簇大小你会使用D14_v2工作节点10-40个。数量越多,你的速度就越快。 – maxiluk