运行 AWS 上没有 EMR 的 HDFS 集群

Run HDFS cluster on AWS without EMR

我想 运行 AWS 上的一个 HDFS 集群,我可以在其中存储需要使用我的自定义应用程序 运行ning 在 EC2 实例上处理的数据。 AWS EMR is the only way I could find to create an HDFS cluster on AWS. There are tutorials 可在 Web 上使用 EC2 实例创建 HDFS 集群。但是,如果我使用 EC2 实例,我会 运行 在关闭实例时丢失数据的风险。

我需要的是:
1. 一个不用时可以关闭的HDFS集群
2.关机时,数据应该保持持久化。

有一个解决方案说我可以将数据保存在 S3 存储桶中并在每次启动 EMR 集群时加载它。但是,这是重复性的,而且开销很大,特别是在数据量很大的情况下。

在GCP中,我使用了满足以上两个条件的DataProc集群。关闭集群至少节省了 VM 的成本,我只在不使用 HDFS 集群时支付存储费用。我想知道 AWS 中是否有类似的方法。

您可以利用 EFS 弹性文件系统,它将您的所有数据保存到 s3,并且只要您重新启动 ec2 实例就可以使用它。

此外,如果需要,您可以与多个 EC2 实例共享此 EFS。因此,在您的用例中,将 EFS 创建为 HDFS 是一个不错的选择。

更多详情here

我想你可能在这里遇到了 X-Y 问题。您几乎肯定不希望在 EMR 上拥有远程 HDFS 文件系统。

EMR 原生为 Hadoop 和 Spark 提供了两个与 HDFS 兼容的文件系统:

1) 一个临时文件系统,通过 hdfs:// 访问。这主要用于 scratch/temporary 数据。它的持续时间与集群一样长,并由 EBS 提供支持。

2) 持久文件系统,通过 s3:// 访问。这在文档中称为 EMRFS。它由 S3 支持。

因此,例如,如果您在 Spark 中并且习惯于执行类似 spark.read.parquet("hdfs://mydata/somepartition/").doWork().write.parquet("hdfs://mynewdata/somepartition/")

你现在就做 spark.read.parquet("s3://mybucket/mydata/somepartition/").doWork().write.parquet("s3://mybucket/mynewdata/somepartition/")

一切正常。 s3:// 由 EMR 人员针对速度进行了优化,因为他们知道您的 EMR 集群与 S3 数据共享一个数据中心。

根据 Shubham Jain 的回答,

EFS 可能会导致 EMR 出现问题,因为除了随 EMR 提供的瞬态后端之外,您将有效地 运行 设置第二个 HDFS 后端。我想你可以,但这会有点奇怪。在您的 EMR 集群上,您必须为 EMR 的 HDFS 配备 NameNode(在 EMR 中称为核心节点),并为 EFS 支持的 HDFS 配备单独的 NameNode(我猜,这必须 运行 作为 EMR 任务节点?)。对于瞬时数据,EFS 比 EBS 支持的 HDFS 慢,而对于永久数据,EFS 比 S3 更昂贵。

如果您出于某种原因不想使用 EMRFS(我不知道为什么),您最好不要使用 EMR,而是使用自己的集群,因为那时您希望自定义HDFS 是如何安装的,而 EMR 的目的就是为你做这件事。