[HDFS_4] HDFS 的 Java 應用開發
阿新 • • 發佈:2018-10-30
() else stream ava 單元 技術 put 編寫 寫文件
0. 說明
在 IDEA下 進行 HDFS 的 Java 應用開發
通過編寫代碼實現對 HDFS 的讀寫操作
1. 流程
1.1 在項目下新建 Moudle
略
1.2 為 Moudle 添加 Maven 框架支持
略
1.3 添加 Maven 依賴
<dependencies> <!-- Hadoop Client依賴 --> <dependency> <groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId> <version>2.7.3</version> </dependency> <!-- 單元測試依賴 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies>
1.4 將 Hadoop/etc/ha 目錄下的 [core-site.xml] [hdfs-site.xml] [log4j.properties] 存入 resources 中
1.5 代碼編寫
package hadoop.hdfs; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.*; importorg.apache.hadoop.io.IOUtils; import org.junit.Test; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; /** * IDEA 下測試 HDFS 的增刪改查 */ public class TestHDFS { // 1. 測試讀取 @Test public void testRead() throws IOException { // 初始化配置文件 Configuration conf = new Configuration(); // 初始化文件系統 FileSystem fs = FileSystem.get(conf); // 初始化路徑 Path p = new Path("/a.txt"); // 通過文件系統獲取輸入流 // FSDataInputStream 是 inputStream 的裝飾流,可以通過普通流方式操縱 fis FSDataInputStream fis = fs.open(p); int len = 0; byte[] buf = new byte[1024]; while ((len = fis.read(buf)) != -1) { System.out.println(new String(buf, 0, len)); } fis.close(); } // 2. 測試讀取並通過 IOUtils 拷貝文件到本地 @Test public void testRead2() throws Exception { // 初始化配置文件 Configuration conf = new Configuration(); // 初始化文件系統 FileSystem fs = FileSystem.get(conf); // 初始化路徑 Path p = new Path("/a.txt"); // 通過文件系統獲取輸入流 // FSDataInputStream 是 inputStream 的裝飾流,可以通過普通流方式操縱 fis FSDataInputStream fis = fs.open(p); FileOutputStream fos = new FileOutputStream("D:/1.txt"); // 通過 IOUtils 拷貝文件 IOUtils.copyBytes(fis, fos, 1024); fis.close(); fos.close(); System.out.println("ok"); } // 3. 測試寫文件,將本地文件寫入到 HDFS 中 @Test public void testwrite() throws IOException { // 設置系統用戶名 System.setProperty("HADOOP_USER_NAME", "centos"); // 初始化配置文件 Configuration conf = new Configuration(); // 初始化文件系統 FileSystem fs = FileSystem.get(conf); // 獲得輸入流 FileInputStream fis = new FileInputStream("E:/p_data/test/customers.txt"); // 初始化路徑 Path pout = new Path("/b.txt"); // 通過文件系統獲取輸出流 // FSDataOutputStream 是 outputStream 的裝飾流,可以通過普通流方式操縱 fos FSDataOutputStream fos = fs.create(pout); // 通過 IOUtils 拷貝文件 IOUtils.copyBytes(fis, fos, 1024); fis.close(); fos.close(); System.out.println("ok"); } //通過遞歸列出指定文件夾下的文件或文件夾信息 public static void testList(String path) { try { // 初始化配置文件 Configuration conf = new Configuration(); // 初始化文件系統 FileSystem fs = FileSystem.get(conf); FileStatus[] statuses = fs.listStatus(new Path(path)); for (FileStatus status : statuses) { if (status.isDirectory()) { path = status.getPath().toString(); System.out.println(path); testList(path); } else { System.out.println(status.getPath().toString()); } } } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { testList("/"); } }
[HDFS_4] HDFS 的 Java 應用開發