【问题标题】:What is the correct way to query Hive on Spark for maximum performance?在 Spark 上查询 Hive 以获得最佳性能的正确方法是什么?
【发布时间】:2017-08-12 20:20:14
【问题描述】:

在这里激发新手。 我在 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 表本身还没有分区或集群(我还需要一些建议)。

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

谢谢!

【问题讨论】:

标签: apache-spark hive pyspark hadoop-yarn parquet


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2020-04-04
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多