自己做的一些小训练0.0
public class HDFSDemo {
private Configuration conf;
private FileSystem fs;
@Before
public void before() throws Exception {
//初始化,加载hadoop默认的配置文件,如果有指定的位置,则覆盖默认的配置
conf=new Configuration(true);
//创建了一个文件系统对象,封装了一个对HDFS的客户端连接
fs=FileSystem.get(conf);
}
@After
public void after() throws IOException {
//关闭到HDFS的连接
fs.close();
}
@Test
public void testWrite() throws Exception {
//获取本地文件输入流
FileInputStream fis=new FileInputStream("E:\\usr\\local\\hadoop-2.6.5-src.zip");
//在hdfs创建元数据,并返回输出流用于想HDFS上传数据
//创建成功则返回一个FSDataOutputStream对象,失败则抛出异常
/*
* create方法在namenode创建元数据
*
* 文件路径
* 所有者
* 创建信息
* blk信息并没有
* 每次上传一个blk,FSDataOutputStream会向NameNode请求分配相应的id,同时NameNode返回DataNode列表,
* 该blk应该放在哪几个DataNode上,等上传完成,DataNode向NameNode报告自己存储的blk信息,NameNode便知晓了对应id
* 的blk的存放位置信息
* 每次上传blk均要走上述流程
*
* 上传完毕后,NameNode知道该文件由多少个blk组成,每个blk所在的位置
*/
FSDataOutputStream dos = fs.create(new Path("/usr/local/hadoop-2.6.5-src.zip"));
byte[] buf=new byte[1024];
int len = -1;
while((len=fis.read(buf))!=-1) {
dos.write(buf, 0, len);
}
fis.close();
dos.flush();
dos.close();
}
@Test
public void testWrite2() throws Exception {
//获取本地文件输入流
FileInputStream fis=new FileInputStream("E:\\usr\\local\\hadoop-2.6.5-src.zip");
//在hdfs创建元数据,并返回输出流用于想HDFS上传数据
//创建成功则返回一个FSDataOutputStream对象,失败则抛出异常
/*
* create方法在namenode创建元数据
*
* 文件路径
* 所有者
* 创建信息
* blk信息并没有
* 每次上传一个blk,FSDataOutputStream会向NameNode请求分配相应的id,同时NameNode返回DataNode列表,
* 该blk应该放在哪几个DataNode上,等上传完成,DataNode向NameNode报告自己存储的blk信息,NameNode便知晓了对应id
* 的blk的存放位置信息
* 每次上传blk均要走上述流程
*
* 上传完毕后,NameNode知道该文件由多少个blk组成,每个blk所在的位置
*/
FSDataOutputStream dos = fs.create(new Path("/usr/local/hadoop-2.6.5-src2.zip"));
IOUtils.copyBytes(fis, dos, conf);
fis.close();
dos.flush();
dos.close();
}
@Test
public void downloadTest() throws IllegalArgumentException, IOException {
//获取HDFS上文件的元数据
FSDataInputStream dis = fs.open(new Path("/usr/local/hadoop-2.6.5-src2.zip"));
//获取本地文件的输出流,目标文件
FileOutputStream fos=new FileOutputStream("E:\\test.zip");
/*
* 当读取第i个block时,FileOutputStream对象询问NameNode该blk的位置
* NameNode返回给该对象含有该blk的DataNode列表(node2,node3,node4)
* 该对象选择一个相邻最近的blk进行读取
*/
IOUtils.copyBytes(dis, fos, conf);
dis.close();
fos.flush();
fos.close();
}
@Test
public void testLs() throws AccessControlException, FileNotFoundException, UnsupportedFileSystemException, IllegalArgumentException, IOException {
//查看具体文件的元数据
/*FileStatus fss = fs.getFileLinkStatus(new Path("/usr/local"));
System.out.println(fss);*/
//该数据从NameNode获取,获取指定HDFS路径下的文件信息,类似于linux中的ls命令
FileStatus[] fsses = fs.listStatus(new Path("/usr/local"));
for (FileStatus fileStatus : fsses) {
System.out.println(fileStatus);
}
}
@Test
public void testDelete() throws IllegalArgumentException, IOException {
//第一个参数表示要删除的目录和文件,第二个参数表示是否迭代删除
//若目标文件为空文件,则第二参数随意
//若目标文件不为空文件,则删除失败,抛出异常
boolean delete = fs.delete(new Path("/usr/local/hadoop-2.6.5-src2.zip"),true);
//boolean delete = fs.delete(new Path("/user/"),false);
System.out.println(delete ? "删除成功":"删除失败");
}
@Test
public void testLocation() throws AccessControlException, FileNotFoundException, UnsupportedFileSystemException, IOException {
Path path=new Path("/usr/local/hadoop-2.6.5-src.zip");
FileStatus fss = fs.getFileLinkStatus(path);
//获取文件长度
long len = fss.getLen();
//根据文件元数据和文件的起始位置以及文件的长度来获取blk的位置信息
BlockLocation[] fileBlockLocations = fs.getFileBlockLocations(fss, 0, len);
/*
* 偏移量,blk长度,blk位置列表
* 0,24934907,node2,node4
*/
for (BlockLocation blockLocation : fileBlockLocations) {
System.out.println(blockLocation);
}
}
}