【问题标题】:Storing source file in Google dataproc HDFS vs google cloud storage(google bucket)将源文件存储在 Google dataproc HDFS 与谷歌云存储(谷歌存储桶)中
【发布时间】:2019-06-04 16:33:59
【问题描述】:

我想处理 ~500 GB 的数据,分布在 64 个 JSON 文件,每个文件包含 5M 记录。基本上,Map(Pyspark) 对 300M 记录中的每一个都起作用。

为了测试我的 PySpark 地图功能,我设置了一个 google Dataproc 集群(1 个 master 5 个 worker 只测试一个 JSON 文件)。

这里的最佳做法是什么?

我应该复制主节点中的所有文件(以利用 Dataproc 中的 Hadoop 分布式文件系统)还是将文件保存在我的 GCS 存储桶中并将文件位置指向我的 Pyspark 中是否同样有效?

此外,我的代码导入了相当多的外部模块,这些模块已复制到我的 master 中,并且 import 在 master 中可以正常工作。将它复制到所有其他工作节点的最佳做法是什么,这样当 Pyspark 在这些工作节点中运行时,我不会收到导入错误。

我在谷歌云网站上阅读了几篇文章,但没有得到明确的答案。

我可以手动将外部模块复制到我的每个工作节点,但当我要处理至少 100 个节点时,我无法在生产中执行此操作。

【问题讨论】:

    标签: apache-spark hadoop pyspark google-cloud-storage google-cloud-dataproc


    【解决方案1】:

    您要问几个问题,所以让我们一次回答一个问题。

    1. 我的代码导入了相当多的外部模块,我已将它们复制到我的主控中,并且导入在主控中工作正常。将其复制到所有其他工作节点的最佳做法是什么,这样当 Pyspark 在这些工作节点中运行时,我不会收到导入错误。

    如果模块是外部的(例如,您通过 pip install 安装它们),那么我会使用 initialization action

    如果您有很多您编写的.py 文件,我会将它们放在一个存档文件中,并使用--py-files 参数传递给您的工作。我还建议研究制造轮子或鸡蛋。

    您可能会发现此链接很有用:https://developerzen.com/best-practices-writing-production-grade-pyspark-jobs-cb688ac4d20f

    1. 我应该复制主节点中的所有文件(以使用 Dataproc 中的 Hadoop 分布式文件系统)还是将文件保存在我的 GCS 存储桶中是否同样有效

    如果数据已经在 GCS 中并且您打算将其存储在那里,则将其复制到主节点没有额外的好处。 GCS 连接器可以从 GCS 就地读取它(并且并行!),这可能比单独复制到 GCS 更便宜(就计算成本而言)。

    听起来您的数据已经被很好地分片了;这是直接在 spark 中从 GCS 读取它的一个很好的理由。

    GCS connector page 明确指出这一点:

    • 直接数据访问 - 将数据存储在云存储中并直接访问,无需先将其传输到 HDFS。 HDFS 兼容性——您可以使用 gs:// 前缀而不是 hdfs:// 轻松访问 Cloud Storage 中的数据。

    • 互操作性 - 将数据存储在云存储中可实现 Spark、Hadoop 和 Google 服务之间的无缝互操作性。

    • 没有存储管理开销 – 与 HDFS 不同,云存储不需要日常维护,例如检查文件系统、升级或回滚到文件系统的先前版本等。

    • 快速启动 – 在 HDFS 中,MapReduce 作业在 NameNode 退出安全模式之前无法启动——这个过程可能需要几秒钟到几分钟,具体取决于数据的大小和状态。借助 Cloud Storage,您可以在任务节点启动后立即开始工作,从而随着时间的推移显着节省成本。

    【讨论】:

    • 非常感谢您抽出宝贵时间。对于我的第一个问题,外部模块还引用了我编写的其他 .py 文件,这些文件我已手动复制到 master,如何使用初始化操作脚本复制到工作人员来实现这一点?我可以编写一个复制命令将文件从 GS 存储桶复制到每个工作节点以传输我的 .py 文件还是有其他方法?
    • 再次感谢您的快速周转。实际上,我在我们安全的私有云环境中设置了 90 个节点的 Cassandra 数据库。上面的 Json 文件实际上是从 Cassandra 导出的 SSTables。我可以直接绕过GCS引用Cassandra db吗?哪个选项更有效(性能 n 成本明智)?这不是 1 次进程,可以临时运行几次。
    • 我的理解是,当我们使用 Hadoop HDFS 和 Spark techstack 时,当我们提交 spark 作业时,spark 代码会被发送到集群,并且没有跨网络的数据移动。如我错了请纠正我。然后在 Dataproc 的情况下,我们的 spark 应用程序将在 Dataproc 中运行,这是否意味着我们的 spark 代码被发送到 GCS(因为 GCS 是我们的数据所在的位置)。告诉我。
    • @Sugyansahu 您正在应用基于数据中心的类比,其中数据和计算位于同一位置。在云端,计算与存储分离更有优势;也就是说,计算是短暂的,但存储是永久的。所以代码在 Dataproc 的计算节点上运行,这些节点读取和写入数据到 GCS。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    • 2016-01-31
    • 2019-08-24
    • 1970-01-01
    • 2020-06-01
    • 2022-12-03
    相关资源
    最近更新 更多