在Spark上查询Hive以获得最佳性能的正确方法是什么?

时间:2017-03-21 09:06:40

标签: apache-spark hive pyspark yarn parquet

在这里点火新手。 我在Hive中有一个非常大的表(~130M记录,180列),我正在尝试使用Spark将其打包为镶木地板文件。 我正在使用默认的EMR集群配置,6 * r3.xlarge实例来提交我用Python编写的spark应用程序。然后我在YARN上以集群模式运行它,通常给驱动程序提供少量内存(几个gb),其余部分给执行程序。这是我的代码:

from pyspark import SparkContext
from pyspark.sql import HiveContext
sc = SparkContext(appName="ParquetTest")

hiveCtx = HiveContext(sc)

data = hiveCtx.sql("select * from my_table")
data.repartition(20).write.mode('overwrite').parquet("s3://path/to/myfile.parquet")

稍后,我提交类似的内容:

spark-submit --master yarn --deploy-mode cluster  --num-executors 5 --driver-memory 4g --driver-cores 1 --executor-memory 24g --executor-cores 2 --py-files test_pyspark.py test_pyspark.py

然而,我的任务需要永远完成。在作业开始后,Spark会很快关闭所有工作人员,因为其他人没有被使用,并且需要几个小时才能获得来自Hive的所有数据。 Hive表本身没有分区或集群(我还需要一些建议)。

你能帮助我理解我做错了什么,我应该从哪里开始,如何从我拥有的资源中获得最大的性能?

谢谢!

1 个答案:

答案 0 :(得分:0)

我有类似的用例,我使用spark写入s3并且有性能问题。主要原因是spark创建了大量零字节部分文件,将临时文件替换为实际文件名正在减慢写入过程。尝试下面的方法作为解决方法

  1. 将spark的输出写入HDFS并使用Hive写入s3。由于hive创建的零件文件数量较少,因此性能要好得多。我遇到的问题是(使用spark时也有同样的问题),由于安全原因,prod env中没有提供对策略的删除操作。在我的情况下,S3桶是kms加密的。
  2. 将火花输出写入HDFS并将复制的hdfs文件写入本地并使用aws s3复制将数据推送到s3。用这种方法获得了第二好的结果。亚马逊创建了门票,他们建议使用这个。
  3. 使用s3 dist cp将文件从HDFS复制到S3。这没有问题,但没有表现