Hadoop copyToLocal生成.crc文件:如何避免生成而非事后删除
如何避免Hadoop copyToLocal生成.crc文件
当然有办法直接跳过这些烦人的.crc文件生成,不用事后手动删除!这些.crc文件是Hadoop默认用来校验本地文件完整性的,但确实会干扰后续处理流程,下面给你两种可行的解决方案:
方案一:使用带useRawLocalFileSystem参数的重载方法
copyToLocalFile其实有一个重载版本,支持通过第四个参数控制是否生成校验文件。当你把useRawLocalFileSystem设为true时,Hadoop会使用RawLocalFileSystem——这个实现不会生成.crc校验文件,因为它直接跳过了校验逻辑。
修改你的代码如下:
val config = new Configuration() val fs = FileSystem.get(config) // 参数说明: // 第一个参数:是否删除源文件(这里保持false,和你原来的逻辑一致) // 第二个参数:HDFS源路径 // 第三个参数:本地目标路径 // 第四个参数:是否使用RawLocalFileSystem(设为true跳过crc生成) fs.copyToLocalFile(false, new Path(src), new Path(dest), true)
方案二:通过配置参数全局禁用校验文件生成
如果你不想修改方法调用,也可以直接在Configuration里设置对应的参数,全局禁用本地文件系统的校验文件生成:
val config = new Configuration() // 关闭本地文件系统的分块逻辑(分块是生成校验文件的前提之一) config.set("fs.local.block.size", "0") // 将校验类型设为NONE,直接跳过校验文件的生成流程 config.set("fs.local.checksum.type", "NONE") val fs = FileSystem.get(config) fs.copyToLocalFile(new Path(src), new Path(dest))
注意事项
跳过.crc文件生成意味着Hadoop不会自动校验下载文件的完整性,如果你对文件可靠性有要求,建议在传输完成后自己手动做校验(比如计算MD5),或者在网络环境稳定的场景下使用这些方案。
内容的提问来源于stack exchange,提问作者Vinay
相关产品推荐
相关产品推荐

