EMR上Hive外部表写入S3生成_$folder$标记文件夹求助
解决EMR Hive外部表创建时S3根目录生成_$folder$标记文件的问题
先明确:S3是对象存储,没有真正的目录结构,_$folder$是Hadoop早期为模拟目录生成的占位空文件。即便现在S3支持前缀模拟目录,某些Hive/Hadoop的默认配置仍会触发它的生成。针对你遇到的情况,给几个可行的解决办法:
调整表创建语句的路径格式
指定LOCATION时,确保路径末尾加上斜杠:CREATE EXTERNAL TABLE table_name (...) LOCATION 's3://bucket/test/table_name/';末尾的斜杠会让Hive直接聚焦到子目录,减少对父目录
test的存在性检测,降低触发标记文件生成的概率。修改Hadoop S3相关配置
直接禁用目录标记文件的生成逻辑,在EMR的core-site.xml中添加或修改以下参数:<property> <name>fs.s3a.directory.marker.retention</name> <value>never</value> </property> <property> <name>fs.s3a.directory.marker.create</name> <value>false</value> </property>若不想修改全局配置,也可在提交Hive作业时临时指定参数:
hive --hiveconf fs.s3a.directory.marker.retention=never --hiveconf fs.s3a.directory.marker.create=false -f your_hql_script.hql要是用的是
s3://协议,对应修改fs.s3.directory.marker.retention和fs.s3.directory.marker.create参数即可。升级EMR集群版本
旧版本的Hive(2.x之前)或Hadoop(2.8之前)对S3的适配逻辑有缺陷,容易生成冗余标记文件。升级到EMR 6.x及以上版本,这类问题会被默认优化,新版本对S3对象存储的目录处理更贴合其原生特性。不要手动创建S3上的父目录
你提到提前创建了test目录,但S3控制台创建的目录本质就是生成_$folder$标记文件,反而会干扰Hive的检测逻辑。其实完全不需要手动创建父目录,Hive在写入数据时会自动通过对象前缀模拟目录结构,这样反而不会生成额外的标记文件。
内容的提问来源于stack exchange,提问作者sa_
相关产品推荐
相关产品推荐

