利用JAV API操作HDFS(Maven工程)

一.首先用eclipse创建Maven项目

1..配置maven:  

 配置maven版本:选择自己安装的maven  

配置本地仓库:关联maven的setting文件即可,setting文件要提前设置

2.创建Maven项目

3.在pom.xml中添加依赖

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.bhj.maven</groupId>
  <artifactId>HelloWorld</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  
  <dependencies>
  
  <dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-client</artifactId>
    <version>2.6.1</version>
   </dependency>
   
   
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>
   
  </dependencies>
  
</project>

二.写入java代码操作hdfs

import java.io.IOException;
import java.net.URI;
import java.util.Iterator;
import java.util.Map.Entry;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;
import org.junit.Before;
import org.junit.Test;

/**
 * C+S+O删除无用的import
 * 客户端操作hadoop时有个用户身份
 * 默认情况下,hadoop会从jvm中获取一个参数来作为自己的用户名:
 * -HADOOP_USER_NAME=root
 * 
 * 也可在构造客户端fs对象时,通过参数传递进去
 * fs = FileSystem.get(new URI("hdfs://node1:9000"), conf, "root")
 * @author bhj
 *
 */

public class HdfsClientDemo {

	FileSystem fs = null;
	Configuration conf = null;//conf就是配置文件

	//初始化
	@Before
	public void init() throws Exception {

		//这些类都得选用hadoop中的类

		conf = new Configuration();//表示参数的对象
		//不配置的话会默认为本地文件
		conf.set("fs.defaultFS", "hdfs://node1:9000");
		//拿到一个文件操作系统的客户端实例对象
		fs = FileSystem.get(new URI("hdfs://node1:9000"), conf, "root");

	}

	//上传
	@Test
	public void testUpload() throws Exception {

		fs.copyFromLocalFile(new Path("e:/server.jar"), new Path("/"));
		fs.close();

	}

	//下载
	@Test
	public void testDownload() throws Exception {

		fs.copyToLocalFile(new Path("/a.txt"), new Path("e:/"));
		fs.close();
	}

	//查看conf内容
	@Test
	public void testConf() {

		Iterator<Entry<String, String>> it = conf.iterator();
		while (it.hasNext()) {
			Entry<String, String> ent = it.next();
			System.out.println(ent.getKey() + " : " + ent.getValue());
		}

	}

	//创建目录
	@Test
	public void testMkDir() throws Exception {

		boolean mkdirs = fs.mkdirs(new Path("/testmkdir/bhj"));
		System.out.println(mkdirs);

	}

	//删除目录
	@Test
	public void testDelDir() throws Exception {

		boolean flag = fs.delete(new Path("/testmkdir"), true);
		System.out.println(flag);

	}

	/**
	 * 递归打印文件信息
	 * RemoteIterator返回迭代器的好处:迭代器只是取数据的方式,不会存储数据
	 * 当需要数据时,调用hasnext()和next()方法即可,还有remove()方法,它只有
	 * 三个方法,客户端每次拿到的只有一个文件
	 * 如果返回list/map,当数据过大时,就会大量占用内存空间,list/map对象是会
	 * 把数据存在内存中,客户端就会把所有文件都拿出来
	 * @throws Exception
	 */
	@Test
	public void testLsFile() throws Exception {

		RemoteIterator<LocatedFileStatus> files = fs.listFiles(new Path("/"),
				true);
		while (files.hasNext()) {
			LocatedFileStatus fileStatus = files.next();
			System.out.println("Name: " + fileStatus.getPath().getName());
			System.out.println("BlockSize: " + fileStatus.getBlockSize());
			System.out.println("Replication: " + fileStatus.getReplication());
			System.out.println("---------------------------");

		}
	}
	
	
	/**
	 * 只显示当前目录下的文件信息
	 */
	@Test
	public void testLs() throws  IOException {
		
		FileStatus[] listStatus = fs.listStatus(new Path("/"));
		
		for (FileStatus file : listStatus) {
			
			System.out.println( "Name: " + file.getPath().getName());
			//注意这个判断语句的写法
			System.out.println(file.isFile()?"file":"directory");
			
		}
	}
	

}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值