Java访问Hadoop实践

Java访问Hadoop实践

要想访问Hadoop集群,你当然要自己有一个集群呀,否则怎么test,此处有教你怎样用虚拟机搭建Hadoop集群

http://blog.csdn.net/admin1973/article/details/60874923

此处记录用java访问Hadoop集群HDFS,简单操作

源码下载地址:

http://download.csdn.net/detail/admin1973/9774470

首先你需要创建一个java项目并导入所必须的jar包:



这些都是访问hdfs所必须的jar

然我就开始贴代码了

前面说了这么多东西都是为Java和Hadoop结合做准备的,下面我们正式进入主题。我们新建一个类,叫HDFSDemo1,如下图所示,我们先来测试一下从HDFS上下载的功能。我们在HDFS系统的根目录下有一个sougou_pinyin_80k.exe的文件,我们现在想把它下载到本F://sougou_pinyin_80k.exe目录下。下面代码中,IOUtils的第三个参数值4096是很多大师级人物在写文件读取时常用的值(4k),第四个参数true的意思是文件写完后返回true。

package com.sct.hadoop;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;

import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;

/**
 * Created by leitao on 2017/3/8.
 */
public class DownloadFile {
    public static void main(String[] args) throws  Exception{
        //FileSystem是一个抽象类,因此我们再使用它的时候要先创建FileSystem的实现类(工具类)
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.113.130:9000"),new Configuration());
        InputStream is = fs.open(new Path("/sogou_pinyin_80k.exe"));
        OutputStream out = new FileOutputStream("E://sogou_pinyin_80k.exe");
        IOUtils.copyBytes(is,out,4096,true);
        System.out.println("下载完成");
    }
}

 接下来我们开始执行上面那段代码,执行完之后,我们再来看一看E盘根目录下是否多了一个sougou_pinyin_80k.exe的文件,如下图所示,我们发现确实多了一个jdk1.7的文件!

说明我们Java和Hadoop结合的第一个小功能成功了!!


接下来我们再测试一下上传的功能

package com.sct.hadoop;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;

import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;

/**
 * Created by leitao on 2017/3/8.
 */
public class UploadFile {
    public  static  void  main(String[] args) throws  Exception{
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.113.130:9000"),new Configuration(),"root");
        //读取本地文件系统,并创建输入流
        InputStream in = new FileInputStream("F://sogou_pinyin_80k.exe");
        //在HDFS上创建一个文件返回输出流
        OutputStream out = fs.create(new Path("/sogou_pinyin_80k.exe"));
        //将输入流写到输出流,buffersize是4k,即每读4k数据返回一次,写完返回true
        IOUtils.copyBytes(in,out,4096,true);
        System.out.println("上传Hadoop文件成功!");
    }

}



我们来看看报的错误信息,从描述中我们不难看出这是连接被拒绝的意思,也就是说我们缺乏写权限。
  既然我们没有root权限,我们不妨先来伪装一下root,让HDFS认为我就是root用户,伪装的方法是在加载fs的时候增加一个用户的参数"root"。添加完之后我们再来运行testUpload方法,发现运行成功了!这里值得说明的是,这种方式来操作HDFS显然是不好的,因为任何人都可以伪装成root来对HDFS进行写操作,很有可能出现恶意攻击。

  既然运行成功了,我们赶紧来看看HDFS的根目录下是否有我们刚才上传上去的文件。我们选择以浏览器的方式来查看HDFS根目录下的文件,我们发现根目录下确实多了一个sougou_pinyin_80k.exe文件.



我们再来新建文件夹,执行完该方法后,到浏览器中查看HDFS的根目录,发现确实多了leitao这个文件夹。

package com.sct.hadoop;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import java.net.URI;

/**
 * Created by leitao on 2017/3/8.
 */
public class mkdir {
    public static void main(String[] args)throws Exception{
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.113.130:9000"),new Configuration(),"root");
        //测试创建一个文件夹,在HDFS上创建一个leitao文件夹,原根目录下使没有这个文件的
        boolean flag = fs.mkdirs(new Path("/leitao"));
        System.out.println(flag);
    }
}



接下来我们再尝试一下删除HDFS系统上的文件,如下图所示,我们试着把HDFS系统根目录下的jdk1.7文件给删除掉,运行后发现返回的值是true,说明我们删除成功!

package com.sct.hadoop;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import java.net.URI;

/**
 * Created by leitao on 2017/3/8.
 */
public class deleteFile {
    public static  void main(String[] args) throws  Exception{
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.113.130:9000"),new Configuration(),"root");
        //测试删除文件,我们尝试删除HDFS下的sogou_pinyin_80k.exe,fs.delete()第二个参数是告诉方法是否
        //递归删除,如果是文件夹,并且文件夹中有文件的话就填写true,否则填false
        boolean flag =fs.delete(new Path("/sogou_pinyin_80k.exe"),false);
        System.out.println(flag);
    }
}


=完结=

参考资料

http://blog.csdn.net/u012453843/article/details/52487499


  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值