利用JAVA API遠程進行HDFS的相關操作

来源:http://www.cnblogs.com/createboke/archive/2017/11/13/7824785.html
-Advertisement-
Play Games

學習HDFS有一段時間了,現在把自己總結的HDFS的相關操作代碼展示給大家。 主要有HDFS的增刪改查,文件的追加,windows本地文件的上傳,hdfs文件的下載,文件重命名,創建目錄,文件是否存在等操作。 準備工作:我是用maven搭配的環境,下麵用到了單元測試@Test,需要在pom.xml文 ...


學習HDFS有一段時間了,現在把自己總結的HDFS的相關操作代碼展示給大家。

主要有HDFS的增刪改查,文件的追加,windows本地文件的上傳,hdfs文件的下載,文件重命名,創建目錄,文件是否存在等操作。

準備工作:我是用maven搭配的環境,下麵用到了單元測試@Test,需要在pom.xml文件內添加junit的依賴

  1 package hdfs;
  2 
  3 import java.io.*;
  4 import java.security.PrivilegedExceptionAction;
  5 
  6 import org.apache.hadoop.conf.Configuration;
  7 import org.apache.hadoop.fs.FSDataOutputStream;
  8 import org.apache.hadoop.fs.FileStatus;
  9 import org.apache.hadoop.fs.FileSystem;
 10 import org.apache.hadoop.fs.Path;
 11 import org.apache.hadoop.io.IOUtils;
 12 import org.apache.hadoop.security.UserGroupInformation;
 13 import org.junit.Test;
 14 
 15 
 16 public class OperatingFiles {
 17     // initialization
 18     //讀取配置文件
 19     static Configuration conf = new Configuration();
 20     static FileSystem hdfs;
 21 
 22     static {
        //root是你主節點虛機的用戶名
23 UserGroupInformation ugi = UserGroupInformation 24 .createRemoteUser("root"); 25 try { 26 ugi.doAs(new PrivilegedExceptionAction<Void>() { 27 public Void run() throws Exception { 28 Configuration conf = new Configuration();
               //"hdfs://lyz01:9000/"對應的是你自己的網址
29 conf.set("fs.default.name", "hdfs://lyz01:9000/"); 30 //conf.set("hadoop.job.ugi", "root"); 31 //以下兩行是支持 hdfs的追加 功能的:hdfs.append() 32 conf.set("dfs.client.block.write.replace-datanode-on-failure.policy", "NEVER"); 33 conf.set("dfs.client.block.write.replace-datanode-on-failure.enable", "true"); 34 Path path = new Path("hdfs://lyz01:9000/"); 35 //如果在本地測試,需要使用此種方法獲取文件系統 36 hdfs = FileSystem.get(path.toUri(), conf); 37 //hdfs = path.getFileSystem(conf); // 這個也可以 38 //如果在Hadoop集群下運行,使用此種方法可以直接獲取預設文件系統 39 //hdfs = FileSystem.get(conf); //這個不行,這樣得到的hdfs所有操作都是針對本地文件系統,而不是針對hdfs的,原因不太清楚 40 return null; 41 } 42 }); 43 } catch (IOException e) { 44 // TODO Auto-generated catch block 45 e.printStackTrace(); 46 } catch (InterruptedException e) { 47 // TODO Auto-generated catch block 48 e.printStackTrace(); 49 } 50 } 51 52 // 創建hdfs目錄 53 @Test 54 public void createDir() throws IOException { 55 String dir = "/test2/"; 56 Path path = new Path(dir); 57 if (hdfs.exists(path)) { 58 System.out.println("dir \t" + conf.get("fs.default.name") + dir 59 + "\t already exists"); 60 return; 61 } 62 hdfs.mkdirs(path); 63 System.out.println("new dir \t" + conf.get("fs.default.name") + dir); 64 } 65 66 // 文件重命名 67 @Test 68 public void renameFile() throws IOException{ 69 String oldName = "/reduceJoin/2.txt"; 70 String newName = "/reduceJoin/tb_b.txt"; 71 Path oldPath = new Path(oldName); 72 Path newPath = new Path(newName); 73 if (hdfs.exists(oldPath)){ 74 hdfs.rename(oldPath,newPath); 75 System.out.println("rename成功!"); 76 }else{ 77 System.out.println("文件不存在!rename失敗!"); 78 } 79 } 80 81 // 讀取文件 82 @Test 83 public void readFile() throws IOException{ 84 String uri = "/output2017_11_12_12_57_04/part-r-00000"; 85 //判斷文件是否存在 86 if(!hdfs.exists(new Path(uri))){ 87 System.out.println("Error ; the file not exists."); 88 return; 89 } 90 InputStream in = null; 91 try { 92 in = hdfs.open(new Path(uri)); 93 //BufferedReader bf =new BufferedReader(new InputStreamReader(in,"GB2312"));//防止中文亂碼 94 //複製到標準輸出流 95 IOUtils.copyBytes(in, System.out, 4096,false); 96 /*String line = null; 97 while((line = bf.readLine()) != null){ 98 System.out.println(line); 99 }*/ 100 } catch (Exception e) { 101 e.printStackTrace(); 102 }finally{ 103 IOUtils.closeStream(in); 104 } 105 } 106 107 // 從本地往HDFS上傳文件 108 @Test 109 public void copyFile() throws IOException { 110 String localSrc = "D:/group_max.txt"; 111 String hdfsDst = "/group/"; 112 Path src = new Path(localSrc); 113 Path dst = new Path(hdfsDst); 114 //本地文件不存在 115 if (!(new File(localSrc)).exists()) { 116 System.out.println("Error: local dir \t" + localSrc 117 + "\t not exists."); 118 return; 119 } 120 //hdfs路徑不存在 121 if (!hdfs.exists(dst)) { 122 System.out.println("Error: dest dir \t" + dst.toUri() 123 + "\t not exists."); 124 return; 125 } 126 String dstPath = dst.toUri() + "/" + src.getName(); 127 //System.out.println(dstPath);// "/test1/3931.jpg" 128 //判斷上傳的文件 hdfs的目錄下是否存在 129 if (hdfs.exists(new Path(dstPath))) { 130 System.out.println("Warn: dest file \t" + dstPath 131 + "\t already exists."); 132 }else{ 133 //本地文件上傳hdfs 134 hdfs.copyFromLocalFile(src, dst); 135 // list all the files in the current direction 136 //遍歷文件 137 FileStatus files[] = hdfs.listStatus(dst); 138 System.out.println("Upload to \t" + conf.get("fs.default.name") 139 + hdfsDst); 140 for (FileStatus file : files) { 141 System.out.println(file.getPath()); 142 } 143 } 144 } 145 146 // 從HDFS 下載文件 到本地 147 @Test 148 public void downloadFile() throws IllegalArgumentException,IOException{ 149 String hdfsDst = "/test2/2_1"; 150 String localSrc = "D:/hadfs"; 151 Path dst = new Path(hdfsDst); 152 Path src = new Path(localSrc); 153 //本地的路徑 + hdfs下載的文件名 154 String localFile = localSrc + "/" + dst.getName(); 155 //如果HDFS路徑不存在 156 if(!hdfs.exists(dst.getParent())){ 157 System.out.println("Error : the HDFS directory:\t" + dst.getParent() + "\tdoes not exist. Please check it!"); 158 return; 159 } 160 //如果本地目錄不存在,則創建 161 if(!new File(localSrc).exists()){ 162 new File(localSrc).mkdirs(); 163 System.out.println("Warn : The local directory does not exist. It has been automatically created for you!"); 164 } 165 // 如果本地文件存在 166 if(new File(localFile).exists()){ 167 System.out.println("Error : the localSrc: \t" + localFile + "\t already exists."); 168 return; 169 } 170 //如果HDFS文件不存在 171 if(!hdfs.exists(new Path(hdfsDst))){ 172 System.out.println("Error : the HDFS file: \t" + hdfsDst + "\t not exists."); 173 }else{ 174 //HDFS下載文件到本地 175 hdfs.copyToLocalFile(false,dst,src,true); 176 System.out.println("successful :download successful! please look at: \t" + localSrc); 177 } 178 } 179 180 181 // create a new file 182 @Test 183 public void createFile() 184 throws IOException { 185 String fileName = "/test3/b.txt"; 186 String fileContent = ""; 187 Path dst = new Path(fileName); 188 //判斷 新建的文件在hdfs上是否存在 189 if(hdfs.exists(dst)){ 190 System.out.println("Error : the hdfs file exists."); 191 }else { 192 byte[] bytes = fileContent.getBytes(); 193 FSDataOutputStream output = hdfs.create(dst); 194 output.write(bytes); 195 System.out.println("new file \t" + conf.get("fs.default.name") 196 + fileName); 197 } 198 } 199 200 // 追加內容到文件 201 @Test 202 public void appendFile() 203 throws IOException { 204 String fileName = "/test2/file2.txt"; 205 String fileContent = "你好 世界"; 206 Path dst = new Path(fileName); 207 byte[] bytes = fileContent.getBytes(); 208 //如果文件不存在 209 if (!hdfs.exists(dst)) { 210 System.out.println("Error : the file not exists"); 211 return; 212 } 213 FSDataOutputStream output = hdfs.append(dst); 214 output.write(bytes); 215 System.out.println("successful: append to file \t" + conf.get("fs.default.name") 216 + fileName); 217 } 218 219 220 // 列出所有文件 221 @Test 222 public void listFiles() throws IOException { 223 String dirName = "/test1"; 224 Path f = new Path(dirName); 225 FileStatus[] status = hdfs.listStatus(f); 226 System.out.println(dirName + " has all files:"); 227 if (status.length == 0) { 228 System.out.println("nothing !"); 229 } else { 230 for (int i = 0; i < status.length; i++) { 231 System.out.println(status[i].getPath().toString()); 232 } 233 } 234 } 235 236 // 判斷文件是否存在,存在即刪除 237 @Test 238 public void deleteFile() throws IOException { 239 String fileName = "/test2"; 240 Path f = new Path(fileName); 241 boolean isExists = hdfs.exists(f); 242 if (isExists) { // if exists, delete 243 boolean isDel = hdfs.delete(f, true); 244 System.out.println(fileName + " delete? \t" + isDel); 245 } else { 246 System.out.println(fileName + " exist? \t" + notExists); 247 } 248 } 249 }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 首先什麼是一致性? 一致性就是分散式系統中相互獨立多個節點就某個值達成一致。 具體可分為強一致性和弱一致性。 強一致性:在任意時刻,所有節點中的數據是一樣的。同一時間點,你在節點A中獲取到key1的值與在節點B中獲取到key1的值應該都是一樣的。 弱一致性:不保證任意時刻所有節點數據一樣,有很多不同 ...
  • 實現功能 以上的代碼實現了通過路徑執行對應的執行方法,但執行方法的參數是必須需要傳入請求後響應的參數的。 分別為:HttpServletRequest和HttpServletResponse。然後通過這個兩個對象獲得參數和處理參數。 需求:我們希望根據方法聲明的參數列表決定是否需要ServletAP ...
  • 類似於雜談性質的文,總結下公司實行微服務化上遇到的一些問題。 雖然參與了開發過程,但整體更像是個旁觀者,前期還是大家討論怎麼做,後來慢慢就由負責架構的同事專職做規劃,拆分任務去完成。 萬事開頭難 最初的架構(資料庫和其他部分都做了簡化) 初衷並不是為了趕時髦,為了團隊KPI之類的,而是遇到了一個很現 ...
  • 一、前言 今天公司要切換資料庫伺服器,資料庫文件大於2G,結果再附加到另一伺服器的資料庫裡面,就產生了一個問題。如下: 二、解決方案 在網上找了很多方法,最後在CSDN上找到了相關的解決方式,經測試可用。 網上看到的整理了一下。 在SQL Server 7.0中,微軟推出了 和`sp_attach_ ...
  • [20171113]修改表結構刪除列相關問題.txt--//維護表結構刪除欄位一般都是先ALTER TABLE <table_name> SET UNUSED (<column_name>);--//然後等空閑時候刪除列.ALTER TABLE <table_name> DROP UNUSED CO ...
  • 轉自維基百科: SQL註入是一種代碼註入技術,用於攻擊數據驅動的應用程式,在這種應用程式中,惡意的SQL語句被插入輸入欄位中執行(例如將資料庫內容轉儲給攻擊者)。[1] SQL註入必須利用應用程式軟體中的安全漏洞,例如,當用戶輸入被錯誤地過濾為嵌入在SQL語句中的字元串文字 轉義字元,或者用戶輸入沒 ...
  • 從開始工作就開始使用Redis,也有一段時間了,但都只是停留在使用階段,沒有往更深的角度探索,每次想讀源碼都止步在閱讀書籍上,因為看完書很快又忘了,這次逼自己先讀代碼。因為個人覺得寫作需要閱讀文字來增強靈感,那麼寫代碼的,就閱讀更多代碼來增強靈感吧。 ...
  • 學習大數據沒有零基礎入門,首先你要成為一名工程師 在技術論壇中或知乎上,看到近幾萬的朋友都在疑惑,學習Java應該選擇什麼發展方向,這個咱們在之前的文章中有提到過,Java發展在領域上有三個選擇方向: JavaEE,主要應用於企業級應用開發;安卓開發方向;嵌入式應用開發方向。在此建議大家選擇Java ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...