使用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-------"); } }