在Amazon EMR集群上运行spark作业后,我直接从s3删除了输出文件,并尝试再次重新运行作业。尝试使用sqlContext.write在s3上写入镶木地板文件格式时收到以下错误:
'bucket/folder' present in the metadata but not s3
at com.amazon.ws.emr.hadoop.fs.consistency.ConsistencyCheckerS3FileSystem.getFileStatus(ConsistencyCheckerS3FileSystem.java:455)
我试过了
emrfs sync s3://bucket/folder
虽然它确实从DynamoDB实例中删除了一些跟踪元数据的记录,但似乎没有解决错误。不确定我还能尝试什么。如何解决此错误?
答案 0 :(得分:12)
原来我需要运行
gradle.properties
首先运行同步之前。运行以上解决了这个问题。
答案 1 :(得分:8)
大多数情况下,一致的问题是由于spark和hadoop系统中的重试逻辑引起的。当在s3上创建文件的过程失败时,它已在dynamodb中更新。当hadoop进程重启进程时,条目已存在于dynamodb中。它会引发一致的错误。
如果要删除存储在dynamaoDB中的s3的元数据,其元素已被删除。 这是步骤, 删除所有元数据
删除路径中的所有对象, emrfs delete使用哈希函数删除记录,因此它也可能删除不需要的条目,因此我们在后续步骤中进行导入和同步
emrfs delete s3://path
将物理上存在于s3中的对象的元数据检索到dynamo db
emrfs import s3://path
在s3和元数据之间同步数据。
emrfs sync s3://path
完成所有操作后,查看s3和元数据中是否存在该特定对象
emrfs diff s3://path
http://docs.aws.amazon.com/emr/latest/ManagementGuide/emrfs-cli-reference.html
答案 2 :(得分:0)
我到达此页面是因为遇到错误“键在元数据中标记为目录,但在s3中为文件”,并且感到很困惑。我认为发生的事情是我不小心用相同的名称创建了文件和目录。通过删除文件,它解决了我的问题:
aws s3 rm s3://bucket/directory_name_without_trailing_slash