Hadoop中Path.getFileSystem与FileSystem.get的适用场景区别
两种FileSystem获取方式的区别及适用场景
核心差异
FileSystem.get(conf) 读取配置中fs.defaultFS参数对应的默认文件系统实例,返回的实例完全由全局配置决定,和你传入的Path没有关联。path.getFileSystem(conf) 会解析Path自身携带的schema(比如hdfs://、s3a://、file://)和地址,自动匹配返回对应文件系统的实例,不受默认配置的约束。
适用场景
适合用FileSystem.get(conf)的场景
- 所有操作的路径都属于当前配置的默认文件系统,无需跨不同存储类型或者不同HDFS集群操作
- 需要批量操作同一集群下的多个路径,复用同一个FileSystem实例性能更好
- 没有明确的外部输入路径,需要基于全局默认配置执行文件系统操作的场景
适合用path.getFileSystem(conf)的场景
- 操作的路径来自外部输入,schema不固定,可能涉及本地文件、HDFS、对象存储等多种不同类型的存储
- 需要跨多个HDFS集群执行操作,比如从集群A迁移数据到集群B,直接通过两个集群的路径分别获取对应实例即可,无需修改全局默认配置
- 需要严格保证文件系统实例和操作路径匹配,避免出现用默认本地文件系统操作HDFS路径这类不匹配的异常
额外补充
你给出的第二个代码片段存在两个问题:
- 如果路径的schema和默认文件系统不匹配,
mkdirs要么直接抛出异常,要么会把目录创建到错误的位置,无法实现预期的HDFS目录创建效果 - 直接用
mkdirs返回false判断目录存在不准确,返回false也可能是权限不足、底层存储故障等其他原因导致,第一种提前校验路径是否存在的逻辑更严谨。
内容的提问来源于stack exchange,提问作者fermatr5
相关产品推荐
相关产品推荐

