我想在AWS上运行一个HDFS集群,在那里我可以存储需要使用我的自定义应用程序在EC2实例上运行处理的数据。AWS EMR 是我能找到的在AWS上创建HDFS集群的唯一方法。有 教程 网络上有很多关于使用EC2实例来创建HDFS集群的文章,但是,如果我使用EC2实例,当我关闭实例时,我将面临数据丢失的风险。但是,如果我使用EC2实例,当我关闭实例时,我将面临丢失数据的风险。
我需要的是:1.一个可以在不使用时关闭的HDFS集群。 2. 关闭时,数据应该保持持久化。
有一个解决方案说,我可以将数据保存在S3 bucket中,并在每次启动EMR集群时加载它。然而,这是重复的,而且是一个巨大的开销,特别是当数据是巨大的。
在GCP中,我使用了DataProc集群,它满足以上两个标准。关闭集群至少节省了虚拟机的成本,而且在不使用HDFS集群时,我只支付了存储费用。我想知道AWS中是否有一些类似的方法。
你可以利用EFS弹性文件系统,它将把你所有的数据保存到s3上,每当你重新启动ec2实例时,它就会为你所用。
此外,如果需要的话,你还可以与多个EC2实例共享这个EFS。所以,在你的使用案例中,将EFS创建为HDFS是一个不错的选择。
更多详情 此处.
我想你可能有一个X-Y问题。你几乎可以肯定不希望在EMR上有一个远程HDFS文件系统。
EMR为Hadoop和Spark原生提供了两个HDFS兼容的文件系统。
1)一个瞬态文件系统,通过hdfs:/访问。这主要是针对scratchtemporary数据。它的持续时间与集群的持续时间一样长,并且由EBS支持。
2)一个持久的文件系统,通过s3:/访问。这在文档中被称为EMRFS。它是由S3支持的。
因此,例如,如果你在Spark中,你习惯于做这样的事情spark.read.parquet("hdfs:/mydatasomepartition").doWork().write.parquet("hdfs:/mynewdatasomepartition")
你现在只要做spark.read.parquet("s3:/mybucketmydatasomepartition").doWork().write.parquet("s3:/mybucketmynewdatasomepartition")
s3:/由EMR人员优化了速度,因为他们知道你的EMR集群与S3数据共享一个数据中心。
EFS,根据Shubham Jain的回答,可能会导致EMR的问题,因为除了EMR提供的瞬时后端,你将有效地运行第二个HDFS后端。我想你可以这样做,但会有点奇怪。在你的EMR集群中,你必须为EMR的HDFS建立NameNodes(在EMR中被称为核心节点),并为EFS支持的HDFS建立单独的NameNodes(我想,这些节点必须作为EMR任务节点来运行?对于瞬时数据,EFS会比EBS支持的HDFS慢,对于永久数据,EFS会比S3贵。
如果你因为某些原因不想使用EMRFS(我不知道为什么),你可能最好滚动自己的集群,而不要使用EMR,因为那时你正在寻找定制HDFS的安装方式,而EMR的重点是为你做这些。