虚拟机Hadoop实战(五)用java编写…

来源:互联网 发布:越剧软件下载 编辑:程序博客网 时间:2024/05/23 02:02
终于成功写了个从windows上传文件到远程Linux上hadoop系统,并下载回来的程序
【结果图】
虚拟机Hadoop实战(五)用java编写远程hadoop文件上传下载程序

虚拟机Hadoop实战(五)用java编写远程hadoop文件上传下载程序

虚拟机Hadoop实战(五)用java编写远程hadoop文件上传下载程序

  新建Netbeans工程,选择普通的JavaSE应用程序,命令行的即可。其实Hadoop的程序并不复杂,只是内部依赖的包众多,很容易导致编译出错。
【系统配置简介】
1、使用NetbeansIDE的环境是windows,远程连接的Hadoop在地址为10.100.78.101的Linux上(VMware虚拟机)
2、windows、linux下都使用相同的Hadoop 2.7.3版本解压
3、Linux下的core-site.xml内容需要更改为实际ip地址10.100.78.101,而不是原先的localhost
4、在windows端,我把待上传的文件存储在 D:/!虚拟机/!待上传文件/hello.txt  
内容为:
First file upload system test
第一个上传文件系统测试



【步骤一,导入包】工程文件同样用Netbeans创建,需要导入外部hadoop众多,这里说明:
hadoop-2.7.3\share\hadoop\common\lib\ 下的所有jar包
hadoop-2.7.3\share\hadoop\common\     下的hadoop-common-2.7.3.jar
hadoop-2.7.3\share\hadoop\mapreduce\  下的hadoop-mapreduce-client-core-2.7.3.jar
                      和hadoop-mapreduce-client-common-2.7.3.jar
hadoop-2.7.3\share\hadoop\hdfs\           下的hadoop-hdfs-2.7.3.jar
(关于部分包解决的问题详见文末)

【步骤二】编写程序:
importjava.io.IOException;
importorg.apache.hadoop.conf.Configuration;
importorg.apache.hadoop.fs.FileSystem;
importorg.apache.hadoop.fs.Path;

public class UploadHadoop{

   public static boolean CreatDir(String dst,Configuration conf) {
       PathdstPath = new Path(dst);
       try{
          FileSystem dhfs =FileSystem.get(conf);
         dhfs.mkdirs(dstPath);
       } catch(IOException ie) {
         ie.printStackTrace();
          return false;
      }
       returntrue;
   }

   public static boolean putToHDFS(String src,String dst, Configuration conf) {
       PathdstPath = new Path(dst);
       try{
          FileSystem hdfs =dstPath.getFileSystem(conf);
          hdfs.copyFromLocalFile(false,new Path(src), dstPath);
       } catch(IOException ie) {
         ie.printStackTrace();
          return false;
      }
       returntrue;
   }

   public static boolean getFromHDFS(String src,String dst, Configuration conf) {
       PathdstPath = new Path(dst);
       try{
          FileSystem dhfs =dstPath.getFileSystem(conf);
          dhfs.copyToLocalFile(false,new Path(src), dstPath,true);
       } catch(IOException ie) {
         ie.printStackTrace();
          return false;
      }
       returntrue;
   }

   public static boolean checkAndDel(final Stringpath, Configuration conf) {
       PathdstPath = new Path(path);
       try{
          FileSystem dhfs =dstPath.getFileSystem(conf);
          if (dhfs.exists(dstPath)){
             dhfs.delete(dstPath, true);
          } else {
             return false;
          }
       } catch(IOException ie) {
         ie.printStackTrace();
          return false;
      }
       returntrue;
   }

   public static void main(String[] args){
      run();
   }
   
   public static void run(){
       booleanstatus;
       Stringdst1 ="hdfs://10.100.78.101:9000/EBLearn_data/new";
      Configuration conf = new Configuration();
       //java.lang.IllegalArgumentException: Wrong FS:
       //hdfs://10.100.78.101:9000/EBLearn_data/hello.txt, expected:file:///
       //解决这个错误的两个方案:
      //方案1:下面这条命令必须加上,否则出现上面这个错误
      conf.set("fs.default.name","hdfs://10.100.78.101:9000"); 
       //方案2:将core-site.xml 和hdfs-site.xml放入当前工程中
       status =CreatDir(dst1, conf);
      System.out.println("CreatDirstatus=" + status);

       String dst="hdfs://10.100.78.101:9000/EBLearn_data";
       String src="D:/!虚拟机/!待上传文件/hello.txt";

       status =putToHDFS(src, dst, conf);
      System.out.println("putToHDFSstatus=" + status);
      
       src ="hdfs://10.100.78.101:9000/EBLearn_data/hello.txt";
       dst ="D:/!虚拟机/!待上传文件/hadoop_need/";
       status =getFromHDFS(src, dst, conf);
      System.out.println("getFromHDFSstatus=" + status);

       dst ="hdfs://10.100.78.101:9000/EBLearn_data/hello.txt";
       status =checkAndDel(dst, conf);
      System.out.println("checkAndDelstatus=" + status);
   }
}

【步骤三】编译运行即可




==================================================================
【期间出现的Exception以及问题总结】
  参照网上的教程编写了个Java程序,用于登录远程Hadoop,并上传下载文件。
  结果被连接拒绝的问题困扰了很久。
啥啥把VMware虚拟机端口改成桥接模式,都不是解决问题的本质。
  问题如下:
java.net.ConnectException: CallFrom WINDOWS7FLASH/10.100.78.140 to 10.100.78.101:9000 failed onconnection exception: java.net.ConnectException: Connectionrefused: no further information; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused

  居然把我的连接拒绝了!然后不告诉我原因。网上大部分资料都叫检查下远程的hadoop到底开端口了吗?到底有没有被防火墙封?配置网络啊之类的。
  可是我在目前客户端,通过浏览器查看http://10.100.78.101:50070是可以成功打开页面并查看文件系统的。肯定没封ip或者我的远程访问。接下来的问题是,会不会是9000端口被封了呢?网上资料显示,判断9000端口可以用telnet来。好吧,我目前客户端是windows系统的,没有telnet,先进安装了hadoop的linux,用telnet连接下自己:Linux命令$ telnet localhost 9000
  结果显示没有任何问题。
  在windows下的替代品是啥?当然是putty啦。打开putty连接,果然出现Connectionrefused弹窗。
  所以问题在于,远程无法连接9000端口。为何呢?
【原来】是因为在hadoop配置文件core-site.xml中,fs.default.name的值为"hdfs://localhost:9000"。这是很多hadoop入门单机版或者伪分布式教程,教你的设置。以这样的设置启动hadoop,它只会运行本地登录9000端口。
【解决】修改core-site.xml中fs.default.name的值为"hdfs://10.100.78.101:9000"。即更改为实际的hadoop服务器地址。再次连接就不会报错了。
参考文献:http://www.2cto.com/os/201411/352191.html

==================================================================
【问题】编译运行java时报错:“java.io.IOException: No FileSystem forscheme: hdfs"”
【原因及解决】出现这个错误是因为缺少hadoop-hdfs-x.x.x.jar包,导入即可。

==================================================================
entry in command string: null chmod0644 
   atorg.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.
   atorg.apache.hadoop.util.Shell.execCommand(Shell.
   atorg.apache.hadoop.util.Shell.execCommand(Shell.
   atorg.apache.hadoop.fs.RawLocalFileSystem.setPermission(RawLocalFileSystem.
   atorg.apache.hadoop.fs.RawLocalFileSystem$LocalFSFileOutputStream.(RawLocalFileSystem.
   atorg.apache.hadoop.fs.RawLocalFileSystem$LocalFSFileOutputStream.(RawLocalFileSystem.
   atorg.apache.hadoop.fs.RawLocalFileSystem.createOutputStreamWithMode(RawLocalFileSystem.

【解决方法】
将  fs.copyToLocalFile( hdfsPath,localPath);
改为 fs.copyToLocalFile( false,hdfsPath,localPath,true);
【解析】
Delete source == false 第一个布尔变量,将“删除原文件”设置为false 
Use raw local file system == true第二个布尔变量,指定系统使用原始的本地文件系统。由于Hadoop原先是按照Linux系统设计的,虽然基于Java,但跨平台的时候涉及文件的部分依然要本地化。不然就会冒出在windows下居然有报0644权限的问题.

==================================================================
虽然没有出现这样的问题,不过在网上看到,感觉有些帮助
Permission denied: user=root, access=WRITE,inode="/user/Hive/warehouse":hadoop:hadoop:drwxrwxr-x
原因:本地用户administrator(本机windows用户)想要远程操作hadoop系统,没有权限引起的。
【解决办法】
1、如果是测试环境,可以取消hadoophdfs的用户权限检查。打开conf/hdfs-site.xml,找到dfs.permissions属性修改为false(默认为true)OK了。
2. 指定访问hdfs的客户端身份
fs = FileSystem.get(new URI("hdfs://192.168.169.128:9000/"),conf, "root");

==================================================================




0 0