我的大多数脚本都在执行以下操作。
spark.read().csv("s3://")
.filter(..).map(...)
.write().parquet("s3://");
有没有办法指定spark,我希望所有这些工作都在内存中完成,因为没有聚合,我的处理分组?这应该是记录流处理器的简单记录,根本不会触及磁盘。
答案 0 :(得分:2)
我不能代表EMR及其s3连接器。我可以代表Apache Hadoop本身和S3A连接器
我们需要在上传到S3之前缓冲生成的数据。您不能执行stream()后跟close(),因为对于大型文件,您需要将上传内容分解为4 + GB文件,即使对于较小的上传文件,您也需要处理常见的条件。应用程序生成数据的速度比您上传到S3的速度快。
使用瞬态本地临时存储使您能够以比S3上传带宽可以处理的速度更快的速度生成数据,并通过重新发送块来应对网络错误。
Apache的原始s3:和s3n:客户端(以及Hadoop 2.8之前的s3a)都在开始上传之前将整个文件写入HDD。您需要的存储与生成的#of字节相同,并且由于它仅在close()中上传,因此该关闭调用的时间是数据/带宽。
Hadoop 2.8+中的S3A支持快速上传(可选2.8+,3.0自动),其中数据缓冲到单个块的大小(5+ MB,默认64MB),上传块大小一上传到达了。这使得更快的写入,具有足够的带宽,几乎没有close()延迟(max:last-block-size / bandwidth)。它仍然需要存储来应对生成和上传速率之间的不匹配,但您可以将其配置为在堆字节数组或堆外字节缓冲区上使用。这样做,你必须非常谨慎地使用内存分配和队列大小:当待处理的上传队列足够大时,你需要配置客户端来阻止编写器。
更新 Johnathan Kelly @ AWS已确认他们按块缓冲区执行相同操作并上传为ASF S3A连接器。这意味着,如果您的数据生成速率(以字节/秒为单位)=从VM上传带宽,则所需的本地磁盘数量最少......如果您更快地生成数据,那么您将需要更多(并最终运行)磁盘不足或达到一些队列限制来阻止生成器线程)。我不会在实际带宽上引用任何数字,因为它总是逐年改善,任何声明很快就会过时。出于这个原因,在相信之前,先查看任何基准测试的年龄。使用自己的工作负载进行自己的测试。
答案 1 :(得分:1)
是的,你可以, spark.read()。csv(" s3://")适用于emr spark。
当我尝试在群集一致视图处于活动状态的s3上直接编写时,我遇到了问题。
http://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-consistent-view.html