使用Java
使用Maven来管理项目
在编程之前,要在hosts文件夹中添加上hadoop000和ip地址的映射,不然程序找不到
如果没有添加映射的话,下面的"hdfs://hadoop000:8020"中的hadoop000就要换成ip地址了
HDFS API第一个程序
创建目录
关键点:
- ①创建Configuration
- ②获取FileSystem
- ③HDFS API的相关操作
HDFS 文件系统的编程入口是 FileSystem
HDFSApp.java
package com.imooc.bigdata.hadoop.hdfs;
//使用Java API操作HDFS文件系统
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import java.net.URI;
public class HDFSApp {
public static void main(String[] args) throws Exception{
Configuration configuration = new Configuration() ;
FileSystem fileSystem = FileSystem.get(new URI("hdfs://hadoop000:8020"), configuration, "hadoop");
Path path = new Path("/hdfsapi/test");
boolean result = fileSystem.mkdirs(path);
System.out.println(result);
}
}
查看hdfs也生成了hdfsapi目录
Junit封装
将上一个程序代码改写成Junit封装的形式
package com.imooc.bigdata.hadoop.hdfs;
//使用Java API操作HDFS文件系统
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.net.URI;
import java.net.URISyntaxException;
public class HDFSApp {
public static final String HDFS_PATH = "hdfs://hadoop000:8020";
FileSystem fileSystem = null;
Configuration configuration = null;
@Before
public void setUp() throws Exception {
System.out.println("------setUp-------");
configuration = new Configuration() ;
/**
* 构造一个访问指定HDFS系统的客户端对象
* 第一个参数:HDFS的URI
* 第二个参数:客户端指定的配置参数
* 第三个参数:客户端的身份,说白了就是用户名
*/
fileSystem = FileSystem.get(new URI(HDFS_PATH), configuration, "hadoop");
}
@Test
public void mkdir() throws Exception{
fileSystem.mkdirs(new Path("/hdfsapi/test"));
}
@After
public void tearDown(){
configuration = null;
fileSystem = null;
System.out.println("------tearDown-------");
}
}
查看HDFS文件
package com.imooc.bigdata.hadoop.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.util.Progressable;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.URI;
//使用Java API操作HDFS文件系统
public class HDFSApp {
public static final String HDFS_PATH = "hdfs://hadoop000:8020";
FileSystem fileSystem = null;
Configuration configuration = null;
@Before
public void setUp() throws Exception {
System.out.println("------setUp-------");
configuration = new Configuration() ;
/**
* 构造一个访问指定HDFS系统的客户端对象
* 第一个参数:HDFS的URI
* 第二个参数:客户端指定的配置参数
* 第三个参数:客户端的身份,说白了就是用户名
*/
fileSystem = FileSystem.get(new URI(HDFS_PATH), configuration, "hadoop");
}
//创建HDFS目录
@Test
public void mkdir() throws Exception{
fileSystem.mkdirs(new Path("/hdfsapi/test"));
}
//查看HDFS内容
@Test
public void text() throws Exception{
FSDataInputStream in = fileSystem.open(new Path("/NOTICE.txt"));
IOUtils.copyBytes(in,System.out,1024);
}
@After
public void tearDown(){
configuration = null;
fileSystem = null;
System.out.println("------tearDown-------");
}
}
这种@Test 可以只run text()函数
上面的mkdir()不运行
创建文件并写入
package com.imooc.bigdata.hadoop.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.util.Progressable;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.URI;
//使用Java API操作HDFS文件系统
public class HDFSApp {
public static final String HDFS_PATH = "hdfs://hadoop000:8020";
FileSystem fileSystem = null;
Configuration configuration = null;
@Before
public void setUp() throws Exception {
System.out.println("------setUp-------");
configuration = new Configuration() ;
/**
* 构造一个访问指定HDFS系统的客户端对象
* 第一个参数:HDFS的URI
* 第二个参数:客户端指定的配置参数
* 第三个参数:客户端的身份,说白了就是用户名
*/
fileSystem = FileSystem.get(new URI(HDFS_PATH), configuration, "hadoop");
}
//创建HDFS目录
@Test
public void mkdir() throws Exception{
fileSystem.mkdirs(new Path("/hdfsapi/test"));
}
//查看HDFS内容
@Test
public void text() throws Exception{
FSDataInputStream in = fileSystem.open(new Path("/NOTICE.txt"));
IOUtils.copyBytes(in,System.out,1024);
}
//创建文件并写入
@Test
public void create() throws Exception{
FSDataOutputStream out = fileSystem.create(new Path("/hdfsapi/test/a.txt"));
out.writeUTF("hello pk");
out.flush();
out.close();
}
@After
public void tearDown(){
configuration = null;
fileSystem = null;
System.out.println("------tearDown-------");
}
}
但是我们可以看到,上面a.txt的replication是3,副本数为3
但是我们在配置hadoop的时候明明设置了1了,这是为什么呢
因为在这里面它有个default是3,而我们第一次new configuration的时候是赋值为null,是一个空的configuration。那么它自己就回去加载default.xml里面的
那么我们来修改一下
package com.imooc.bigdata.hadoop.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.util.Progressable;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.URI;
//使用Java API操作HDFS文件系统
public class HDFSApp {
public static final String HDFS_PATH = "hdfs://hadoop000:8020";
FileSystem fileSystem = null;
Configuration configuration = null;
@Before
public void setUp() throws Exception {
System.out.println("------setUp-------");
configuration = new Configuration() ;
configuration.set("dfs.replication","1");
/**
* 构造一个访问指定HDFS系统的客户端对象
* 第一个参数:HDFS的URI
* 第二个参数:客户端指定的配置参数
* 第三个参数:客户端的身份,说白了就是用户名
*/
fileSystem = FileSystem.get(new URI(HDFS_PATH), configuration, "hadoop");
}
//创建HDFS目录
@Test
public void mkdir() throws Exception{
fileSystem.mkdirs(new Path("/hdfsapi/test"));
}
//查看HDFS内容
@Test
public void text() throws Exception{
FSDataInputStream in = fileSystem.open(new Path("/NOTICE.txt"));
IOUtils.copyBytes(in,System.out,1024);
}
//创建文件并写入
@Test
public void create() throws Exception{
FSDataOutputStream out = fileSystem.create(new Path("/hdfsapi/test/b.txt"));
out.writeUTF("hello pk");
out.flush();
out.close();
}
@After
public void tearDown(){
configuration = null;
fileSystem = null;
System.out.println("------tearDown-------");
}
}
新创建的b.txt的replication就是1了
重命名
package com.imooc.bigdata.hadoop.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.util.Progressable;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.URI;
//使用Java API操作HDFS文件系统
public class HDFSApp {
public static final String HDFS_PATH = "hdfs://hadoop000:8020";
FileSystem fileSystem = null;
Configuration configuration = null;
@Before
public void setUp() throws Exception {
System.out.println("------setUp-------");
configuration = new Configuration() ;
configuration.set("dfs.replication","1");
/**
* 构造一个访问指定HDFS系统的客户端对象
* 第一个参数:HDFS的URI
* 第二个参数:客户端指定的配置参数
* 第三个参数:客户端的身份,说白了就是用户名
*/
fileSystem = FileSystem.get(new URI(HDFS_PATH), configuration, "hadoop");
}
//创建HDFS目录
@Test
public void mkdir() throws Exception{
fileSystem.mkdirs(new Path("/hdfsapi/test"));
}
//查看HDFS内容
@Test
public void text() throws Exception{
FSDataInputStream in = fileSystem.open(new Path("/NOTICE.txt"));
IOUtils.copyBytes(in,System.out,1024);
}
//创建文件并写入
@Test
public void create() throws Exception{
FSDataOutputStream out = fileSystem.create(new Path("/hdfsapi/test/b.txt"));
out.writeUTF("hello pk");
out.flush();
out.close();
}
//重命名
@Test
public void rename() throws Exception{
Path oldPath = new Path("/hdfsapi/test/b.txt");
Path newPath = new Path("/hdfsapi/test/c.txt");
boolean result = fileSystem.rename(oldPath,newPath);
System.out.println(result);
}
@After
public void tearDown(){
configuration = null;
fileSystem = null;
System.out.println("------tearDown-------");
}
}
b.txt被rename成c.txt了
复制本地文件到HDFS文件系统
注意这个复制是复制你在Windows下的文件
package com.imooc.bigdata.hadoop.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.util.Progressable;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.URI;
//使用Java API操作HDFS文件系统
public class HDFSApp {
public static final String HDFS_PATH = "hdfs://hadoop000:8020";
FileSystem fileSystem = null;
Configuration configuration = null;
@Before
public void setUp() throws Exception {
System.out.println("------setUp-------");
configuration = new Configuration() ;
configuration.set("dfs.replication","1");
/**
* 构造一个访问指定HDFS系统的客户端对象
* 第一个参数:HDFS的URI
* 第二个参数:客户端指定的配置参数
* 第三个参数:客户端的身份,说白了就是用户名
*/
fileSystem = FileSystem.get(new URI(HDFS_PATH), configuration, "hadoop");
}
//创建HDFS目录
@Test
public void mkdir() throws Exception{
fileSystem.mkdirs(new Path("/hdfsapi/test"));
}
//查看HDFS内容
@Test
public void text() throws Exception{
FSDataInputStream in = fileSystem.open(new Path("/NOTICE.txt"));
IOUtils.copyBytes(in,System.out,1024);
}
//创建文件并写入
@Test
public void create() throws Exception{
FSDataOutputStream out = fileSystem.create(new Path("/hdfsapi/test/b.txt"));
out.writeUTF("hello pk");
out.flush();
out.close();
}
//重命名
@Test
public void rename() throws Exception{
Path oldPath = new Path("/hdfsapi/test/b.txt");
Path newPath = new Path("/hdfsapi/test/c.txt");
boolean result = fileSystem.rename(oldPath,newPath);
System.out.println(result);
}
//复制本地文件到HDFS文件系统
@Test
public void copyFromLocalFile() throws Exception{
Path src = new Path("D://hello.txt");
Path dst = new Path("/hdfsapi/test/");
fileSystem.copyFromLocalFile(src,dst);
}
@After
public void tearDown(){
configuration = null;
fileSystem = null;
System.out.println("------tearDown-------");
}
}