hdfs下载出现Exception in thread "main" java.lang.NullPointerException

一.从hdfs文件系统下载文件到本地文件系统时Java代码。

点击(此处)折叠或打开

  1. import java.net.URI;
  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.fs.FileSystem;
  4. import org.apache.hadoop.fs.Path;
  5. public class getfile {
  6.     public static void main(String[] args) throws Exception{
  7.         FileSystem fs=FileSystem.get(new URI("hdfs://192.168.11.12:9000"),new Configuration());
  8.         Path src=new Path("/data/wordcount/file1");
  9.         Path dst=new Path("D:\\app");
  10.         fs.copyToLocalFile(src, dst);
  11.         fs.copyToLocalFile(false,src, dst,true);
  12.     }
  13. }
二.运行程序错误代码。

点击(此处)折叠或打开

  1. Exception in thread "main" java.lang.NullPointerException
  2. at java.lang.ProcessBuilder.start(ProcessBuilder.java:459)
  3. at org.apache.hadoop.util.Shell.runCommand(Shell.java:149)
  4. at org.apache.hadoop.util.Shell.run(Shell.java:134)
  5. at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:286)
  6. at org.apache.hadoop.util.Shell.execCommand(Shell.java:354)
  7. at org.apache.hadoop.util.Shell.execCommand(Shell.java:337)
  8. at org.apache.hadoop.fs.RawLocalFileSystem.execCommand(RawLocalFileSystem.java:481)
  9. at org.apache.hadoop.fs.RawLocalFileSystem.setPermission(RawLocalFileSystem.java:473)
  10. at org.apache.hadoop.fs.FilterFileSystem.setPermission(FilterFileSystem.java:280)
  11. at org.apache.hadoop.fs.ChecksumFileSystem.create(ChecksumFileSystem.java:372)
  12. at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:479)
  13. at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:460)
  14. at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:367)
  15. at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:208)
  16. at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:199)
  17. at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:142)
  18. at org.apache.hadoop.fs.FileSystem.copyToLocalFile(FileSystem.java:1211)
  19. at org.apache.hadoop.fs.FileSystem.copyToLocalFile(FileSystem.java:1192)
  20. ......
  21. .....
    而且下载的文件会成为 .crc文件并没有大小。  
三.修改方式。

点击(此处)折叠或打开

  1. fs.copyToLocalFile(src, dst);改为fs.copyToLocalFile(false,src,dst,true);

点击(此处)折叠或打开

  1. fs.copyToLocalFile)方法在源码中的代码如下
  2.        public void copyToLocalFile(boolean delSrc, Path src, Path dst, boolean useRawLocalFileSystem)
  3.           throws IOException {
  4.                   Configuration conf = getConf();
  5.                   FileSystem local = null;
  6.                   if (useRawLocalFileSystem) {
  7.                    local = getLocal(conf).getRawFileSystem();
  8.                   }
  9.                   else {
  10.                      local = getLocal(conf);
  11.                   }
  12.                   FileUtil.copy(this, src, local, dst, delSrc, conf);
  13.         }
四.错误原因.   

  在使用copyToLocalFile(Path src, Path dst)方法时可能导致 setPermission文件本地文件效验失败.   

  因此使用copyToLocalFile( boolean delSrc,Path src, Path dst,boolean useRawLocalFileSystem)

    boolean delSrc 指是否将原文件删除

    Path src 指要下载的文件路径

    Path dst 指将文件下载到的路径

    boolean useRawLocalFileSystem 是否开启文件效验

 五. RawLocalFileSystem文件

  hadoop是一个综合文件系统,并不等价于hdfs文件系统。hadoop集成了众多的文件系统, hdfs仅仅是hadoop旗舰级文件系统。Hadoop的这个特点充分体现了hadoop的优良的可扩展性。在hadoop里,hadoop定义了一个 抽象的文件系统的概念,类:org.apache.hadoop.fs.FileSystm,这个抽象类用来定义hadoop中的一个文件系统接口,只要 某个文件系统实现了这个接口,就可以作为hadoop支持的文件系统。
  Hadoop LocalFileSystem是客户端校验的类。在使用LocalFileSystem写文件时,会透明的创建一个.filename.crc的文件。 校验文件大小的字节数由io.bytes.per.checksum属性设置,默认是512bytes,即每512字节就生成一个CRC-32校验 和。.filename.crc文件会存 io.bytes.per.checksum的信息。在读取的时候,会根据此文件进行校验。事实上LocalFileSystem是通过继承 ChecksumFileSystem实现校验的工作。

文件系统
URI方案
Java实现(org.apache.hadoop)
定义
Local
file
fs.LocalFileSystem
支持有客户端效验和本地文件系统,带有本地效验和的本地系统在fs.RawLocalFileSystem中实现

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30172158/viewspace-2113771/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/30172158/viewspace-2113771/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值