sau*_*wal 4 hadoop amazon-s3 amazon-web-services amazon-emr
我在AWS数据管道中使用EMR活动。此EMR活动在EMR群集中运行配置单元脚本。它以dynamo DB作为输入并将数据存储在S3中。
这是EMR活动中使用的EMR步骤
s3://elasticmapreduce/libs/script-runner/script-runner.jar,s3://elasticmapreduce/libs/hive/hive-script,--run-hive-script,--hive-versions,latest,--args,-f,s3://my-s3-bucket/hive/my_hive_script.q,-d,DYNAMODB_INPUT_TABLE1=MyTable,-d,S3_OUTPUT_BUCKET=#{output.directoryPath}
Run Code Online (Sandbox Code Playgroud)
哪里
out.direcoryPath是:
s3://my-s3-bucket/output/#{format(@scheduledStartTime,"YYYY-MM-dd")}
Run Code Online (Sandbox Code Playgroud)
因此,这将在S3中创建一个文件夹和一个文件。(从技术上讲,它会创建两个键2017-03-18/<some_random_number>和2017-03-18_$folder$)
2017-03-18
2017-03-18_$folder$
Run Code Online (Sandbox Code Playgroud)
如何避免创建这些多余的空_$folder$文件。
编辑:我在https://issues.apache.org/jira/browse/HADOOP-10400中找到了一个解决方案,但我不知道如何在AWS数据管道中实现它。
在写入 s3 存储桶时使用 s3a,它将删除$folder$。我已经测试过这种胶水。不确定它是否适用于 EMR 集群。
信用:-由reddit上的某人回答
from pyspark.sql import SparkSession
spark=SparkSession.builder.getOrCreate()
df=spark.read.format("parquet").load("s3://testingbucket/")
df.write.format("parquet").save("s3a://testingbucket/parttest/")
spark.stop()
Run Code Online (Sandbox Code Playgroud)
S3 中无法实际创建空文件夹。S3 是一个对象存储,因此其中的所有内容都是对象。
当Hadoop将其用作文件系统时,它需要组织这些对象,使其显示为文件系统树,因此它创建一些特殊的对象来将对象标记为目录。
您只存储数据文件,但您可以选择将这些数据文件组织到路径中,这创建了类似于用于遍历的文件夹的概念。
包括 AWS 管理控制台在内的一些工具通过解释对象名称中的 /s 来模拟文件夹。Amazon S3 控制台支持文件夹概念作为对象分组方式。Bucket Explorer 也是如此。
如果您只是不创建文件夹,而是将文件放置在您想要的路径中 - 这应该适合您。
在 S3 中将文件写入其中之前,您不必创建文件夹,因为/all/path/including/filename- 是 S3 存储中的整个密钥。
EMR似乎没有提供避免这种情况的方法。
由于S3使用键值对存储系统,因此Hadoop文件系统通过创建后缀为“ _ $ folder $”的空文件来实现S3中的目录支持。
您可以安全地删除带有
<directoryname>_$folder$S3存储桶中后缀的任何空文件。这些空文件由Hadoop框架在运行时创建,但是Hadoop旨在处理数据,即使这些空文件被删除也是如此。https://aws.amazon.com/premiumsupport/knowledge-center/emr-s3-empty-files/
它在Hadoop源代码中,因此可以修复,但显然在EMR中不是固定的。
如果您觉得很聪明,则可以创建一个与_ $ folder $后缀匹配的S3事件通知,并在创建对象后触发Lambda函数删除它们。
| 归档时间: |
|
| 查看次数: |
5491 次 |
| 最近记录: |