将源文件存储在 Google dataproc HDFS 与 google 云存储(google 桶)

Storing source file in Google dataproc HDFS vs google cloud storage(google bucket)

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

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

这里的最佳做法是什么?

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

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

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

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

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

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

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

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

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

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

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

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

GCS connector page 明确指出:

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

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

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

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