一.首先用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");
}
}
}