HDFS文件系統基本操作-Hadoop實踐

操作流程

1.啓動Hadoop

2.導入相關的jar包

右鍵項目屬性,選擇Property,在彈出的對話框左側列表中選擇Java Build Path,如下圖所示:選擇Add External JARs,就可以逐個(也可以選擇多個,但是限制在同一個文件夾中)添加第三方引用jar包。

3.調用Java Api進行編程

3.1檢查文件是否存在

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class HDFSFileIfExist {
    public static void main(String[] args){
        try{
            String fileName = "test";
            Configuration conf = new Configuration();//創建環境
            conf.set("fs.defaultFS", "hdfs://localhost:9000");//加載環境
            conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
            FileSystem fs = FileSystem.get(conf);//封裝DistributedFileSystem對象
            if(fs.exists(new Path(fileName))){ //相對路徑
                System.out.println("文件存在");
            }else{
                System.out.println("文件不存在");
            }
 
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

2.寫操作

        import org.apache.hadoop.conf.Configuration;  
        import org.apache.hadoop.fs.FileSystem;
        import org.apache.hadoop.fs.FSDataOutputStream;
        import org.apache.hadoop.fs.Path;
 
        public class Chapter3 {    
                public static void main(String[] args) { 
                        try {
                                Configuration conf = new Configuration();  
                                conf.set("fs.defaultFS","hdfs://localhost:9000");
                                conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem");
                                FileSystem fs = FileSystem.get(conf);//創建對象
                                byte[] buff = "Hello world".getBytes(); // 要寫入的內容
                                String filename = "test"; //要寫入的文件名
                                FSDataOutputStream os = fs.create(new Path(filename)); //創建輸出流(流水線寫入)
                                os.write(buff,0,buff.length);//執行寫入操作
                                System.out.println("Create:"+ filename);
                                os.close();//關閉連接
                                fs.close();//關閉文件對象
                        } catch (Exception e) {  
                                e.printStackTrace();  
                        }  
                }  
        }

3.讀操作

        import java.io.BufferedReader;
        import java.io.InputStreamReader;
 
        import org.apache.hadoop.conf.Configuration;
        import org.apache.hadoop.fs.FileSystem;
        import org.apache.hadoop.fs.Path;
        import org.apache.hadoop.fs.FSDataInputStream;
 
        public class Chapter3 {
                public static void main(String[] args) {
                        try {
                                Configuration conf = new Configuration();
                                conf.set("fs.defaultFS","hdfs://localhost:9000");
                                conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem");
                                FileSystem fs = FileSystem.get(conf);
                                Path file = new Path("test"); 
                                FSDataInputStream getIt = fs.open(file);//打開文件並加入輸入流
                                BufferedReader d = new BufferedReader(new InputStreamReader(getIt));//文件讀入緩存
                                String content = d.readLine(); //讀取文件一行
                                System.out.println(content);
                                d.close(); //關閉文件
                                fs.close(); //關閉hdfs
                        } catch (Exception e) {
                                e.printStackTrace();
                        }
                }
        }

基礎知識補充

大數據兩大核心技術:分佈式存儲 分佈式處理
雲計算特徵;多租戶 虛擬化
物聯網關鍵技術:識別技術 感知技術

Hadoop兩大核心:HDFS MapReduce
HDFS核心節點:NameNode:目錄服務器(管理元數據,直接保存至內存) DataNode:數據存儲節點
MapReduce兩大核心組件:JobTracker,作業拆分;TaskTracker,作業執行
Secondary Namenode,是NameNode的冷備份

HDFS
實現目標:兼容廉價的硬件設備 實現流數據讀寫 支持大數據集 支持簡單的文件模型 強大的跨平臺兼容性
自身侷限性:不適合低延遲數據訪問 無法高效存儲大量小文件 不支持多用戶寫入及任意修改文件 
塊的設計:64MB,但不能過大,受到MapReduce的限制
優點:支持大規模文件存儲 簡化系統設計(存儲需求) 數據備份
名稱節點(主節點):數據目錄,存儲元數據
結構:FsImage保存系統文件樹 EditLog數據信息的修改
第二節點,冷備份,定期取出EditLog進行FsImage和舊的EditLog合併形成新的FsImage,節點此時擁有新的EditLog
數據節點:實際數據存取
元數據:文件是什麼 文件被分成多少塊 每個塊和文件如何映射 每個塊被存儲在哪個服務器上
命名空間:目錄 文件 塊
協議:TCP/IP協議(客戶端-名稱節點) RPC(客戶端-數據節點)
HDFS存儲原理:
數據冗餘保存(系統備份)
數據存放:第一副本放置原則,CUP不太忙,磁盤不太滿(外部讀寫);該數據節點上(內部讀寫)
第二副本:與第一副本不同的機架上;第三副本:與第一副本相同的機架上
數據讀取:就近讀取(API確定ID)
數據錯誤與恢復
名稱節點出錯:暫停服務,從第二節點處恢復
數據節點出錯:遠程調用發送心跳信息,出錯標記爲宕機,然後從備份中再複製一份
數據出錯:校驗碼校驗(同時讀數據和校驗碼,進行二者檢驗)
讀過程
1.定義Configuration環境
2.打開文件,加載hdfs-site.xml core-site.xml,定義一個FileSystem實例(封裝了一個DFSFileSystem實例)
3.讀取請求,(返回一個輸入流DFSInputStream) 
4.從名稱節點獲取數據塊信息,ClientProtocal.getBlocations()
5.讀取數據,從數據節點選擇最近的節點
6.關閉對該節點的鏈接
7.循環4-6步直至全部數據讀取完成
8.關閉文件
寫過程
1.創建文件請求,實例化一個fs對象
2.RPC執行遠程調用,與名稱節點溝通,創建文件
3.輸出流寫入數據(流水線複製)
4.向數據節點寫入數據包
5.接收確認包,由最後一個數據節點向前傳遞
6.關閉文件

編程實踐
Shell方式
cd /usr/local/hadoop
./bin/hdfs namenode -format #格式化hadoop的hdfs文件系統
./sbin/start-dfs.sh #啓動hadoop
hadoop fs(本機+HDFS) dfs(只能用於HDFS文件系統)
hadoop fs ls(顯示指定文件詳細信息) mkdir(創建相關文件夾) cat(指定文件內容到標準輸出)
本地文件複製到HDFS中:-cp 本地文件路徑 hdfs路徑
Web方式
http://localhost:50070

常見報錯

原因:jar包未導入完全

爲了編寫一個能夠與HDFS交互的Java應用程序,一般需要向Java工程中添加以下JAR包:
(1)”/usr/local/hadoop/share/hadoop/common”目錄下的hadoop-common-2.7.1.jar和haoop-nfs-2.7.1.jar;
(2)/usr/local/hadoop/share/hadoop/common/lib”目錄下的所有JAR包;
(3)“/usr/local/hadoop/share/hadoop/hdfs”目錄下的haoop-hdfs-2.7.1.jar和haoop-hdfs-nfs-2.7.1.jar;
(4)“/usr/local/hadoop/share/hadoop/hdfs/lib”目錄下的所有JAR包。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章