将源文件存储在 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 个节点时,我无法在生产中执行此操作。
您要问几个问题,所以我们一次回答一个问题。
- 我的代码导入了相当多的外部模块,我已经将这些模块复制到我的 master 中,并且在 master 中导入工作正常。将它复制到所有其他工作节点的最佳做法是什么,这样当 Pyspark 在这些工作节点中运行时,我不会收到导入错误。
如果模块是外部模块(例如,您通过 pip install
安装它们),那么我会使用 initialization action
如果您有很多 .py
个您编写的文件,我会把它们放在一个存档文件中,然后使用 --py-files
参数传递给您的作业。我还建议研究构建轮子或鸡蛋。
您可能会发现此 link 有用:https://developerzen.com/best-practices-writing-production-grade-pyspark-jobs-cb688ac4d20f
- 我应该复制主节点中的所有文件(以便在 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,您可以在任务节点启动时立即开始您的工作,从而随着时间的推移显着节省成本。
我想处理 ~500 GB 的数据,分布在 64 JSON 个文件 中,每个文件包含 5M 条记录。基本上,Map(Pyspark) 在每条 300M 记录上运行。
为了测试我的 PySpark 地图功能,我设置了一个 google Dataproc 集群(1 主 5 工人只测试一个 JSON 文件)。
这里的最佳做法是什么?
我应该复制主节点中的所有文件(以便在 Dataproc 中使用 Hadoop 分布式文件系统)还是将文件保存在我的 GCS 存储桶中并将文件位置指向我的 Pyspark 中是否同样有效?
我的代码还导入了很多外部模块,我已将这些模块复制到我的 master 中,导入在 master 中工作正常。将它复制到所有其他工作节点的最佳做法是什么,这样当 Pyspark 在这些工作节点中运行时,我不会收到导入错误。
我在 Google 云网站上阅读了几篇文章,但没有得到明确的答案。
我可以手动将外部模块复制到我的每个工作节点,但是当我要处理至少 100 个节点时,我无法在生产中执行此操作。
您要问几个问题,所以我们一次回答一个问题。
- 我的代码导入了相当多的外部模块,我已经将这些模块复制到我的 master 中,并且在 master 中导入工作正常。将它复制到所有其他工作节点的最佳做法是什么,这样当 Pyspark 在这些工作节点中运行时,我不会收到导入错误。
如果模块是外部模块(例如,您通过 pip install
安装它们),那么我会使用 initialization action
如果您有很多 .py
个您编写的文件,我会把它们放在一个存档文件中,然后使用 --py-files
参数传递给您的作业。我还建议研究构建轮子或鸡蛋。
您可能会发现此 link 有用:https://developerzen.com/best-practices-writing-production-grade-pyspark-jobs-cb688ac4d20f
- 我应该复制主节点中的所有文件(以便在 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,您可以在任务节点启动时立即开始您的工作,从而随着时间的推移显着节省成本。