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