Spark 性能缓慢

Spark Slow Performance

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

详情: 我在 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 我拉取数据的代码与此类似^

问题是管道可以工作,但速度太慢,无法使用。我创建的可视化最多需要在几秒钟内提取数据。

其他详情: 大量查询使用日期为 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

如有任何帮助,我们将不胜感激!提前致谢! 谢谢!

首先,澄清一个问题:您运行从 ODBC 连接查询什么?是 table 创建查询吗?他们会花很长时间。确保您 运行 只从预先创建的配置单元 table.

上的 ODBC 读取查询

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

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

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

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

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

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