apache-spark - Spark性能问题与Hive

标签 apache-spark hadoop hive hdfs

我正在做一个每天都会运行的管道。它包括联接两个表,分别为x和y(分别约为18 MB和1.5 GB大小),并将联接的输出加载到最终表中。
以下是有关环境的事实,
对于表x:

  • 数据大小:18 MB
  • 分区中的文件数:〜191
  • 文件类型: Parquet

  • 对于表y:
  • 数据大小:1.5 GB
  • 分区中的文件数:〜3200
  • 文件类型: Parquet

  • 现在的问题是:
    Hive和Spark的性能相同(花费的时间相同)
    我尝试了不同的资源组合来完成 Spark 工作。
    例如。:
  • 执行器:50个内存:20GB内核:5个
  • 执行程序:70内存:20GB内核:5
  • 执行程序:1个内存:20GB内核:5个

  • 所有这三种组合都具有相同的性能。我不确定我在这里缺少什么。
    我还尝试广播小表“x”,以避免加入时出现随机播放,但性能没有太大改善。
    一个主要的观察结果是:
    70%的执行时间用于读取大表y,我想这是由于每个分区的文件数量更多。
    我不确定 hive 如何提供相同的性能。
    请提示。

    最佳答案

    我假设您正在比较Hive在MR与Spark之间。如果不是这种情况,请告诉我。因为Hive(在tez或spark上)与Spark Sql不会有所不同
    在性能方面。

    我认为主要问题是小文件太多。
    I / O本身消耗大量CPU和时间,因此您无法体验Spark的处理能力。

    我的建议是在读取 Parquet 文件后立即合并 Spark 数据帧。请合并“x”数据框为单个分区和“y”
    数据帧分为6-7个分区。

    完成上述操作后,请执行join(broadcastHashJoin)。

    关于apache-spark - Spark性能问题与Hive,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56901056/

    相关文章:

    c# - hadoop中的序列文件格式

    concurrency - 如何在hive中同时提交多个查询

    hadoop - 在 Hive 中连接多个表

    hadoop - 如何在hadoop mapreduce中跳过读取文件头

    java - 如何将此旧的api mapreduce作业代码转换为新的mapreduce

    apache-spark - Spark Master 和 Workers 未通过本地主机地址连接

    apache-spark - 在分布式文件上以独立模式使用 Spark Shell (CLI)

    json - 对大量JSON数据集的即席查询

    python - PySpark Dataframe 根据其他列中的重复值识别一列上的不同值

    json - 将文件作为命令行参数传递给 Spark