HDFS的基本使用

HDFS——shell:java

1,lsshell

    hadoop fs -ls /apache

    列出 hdfs 文件系統根目錄下的目錄和文件api

    hadoop fs -ls -R /安全

    列出 hdfs 文件系統全部的目錄和文件服務器

2.put框架

    hadoop fs -put < local file > < hdfs file >tcp

    hdfs file 的父目錄必定要存在,不然命令不會執行hadoop fs -put < local file or dir >...< hdfs dir >分佈式

    hdfs dir 必定要存在,不然命令不會執行hadoop fs -put - < hdsf file>ide

    從鍵盤讀取輸入到 hdfs file 中,按 Ctrl+D 結束輸入,hdfs file 不能存在,不然命令不會執行

2.1.moveFromLocal

    hadoop fs -moveFromLocal < local src > ... < hdfs dst >

    與 put 相相似,命令執行後源文件 local src 被刪除,也能夠從從鍵盤讀取輸入到 hdfs file 中

2.2.copyFromLocal

    hadoop fs -copyFromLocal < local src > ... < hdfs dst >

    與 put 相相似,也能夠從從鍵盤讀取輸入到 hdfs file 中

3.get

    hadoop fs -get < hdfs file > < local file or dir>

    local file 不能和 hdfs file 名字不能相同,不然會提示文件已存在,沒有重名的文件會複製到本地

    hadoop fs -get < hdfs file or dir > ... < local dir >

    拷貝多個文件或目錄到本地時,本地要爲文件夾路徑

    注意:若是用戶不是 root, local 路徑要爲用戶文件夾下的路徑,不然會出現權限問題,

3.2.copyToLocal

    hadoop fs -copyToLocal < local src > ... < hdfs dst >

    與 get 相相似

4.rm

    hadoop fs -rm < hdfs file > ...

    hadoop fs -rm -r < hdfs dir>...

    每次能夠刪除多個文件或目錄

5.mkdir

    hadoop fs -mkdir < hdfs path>

    只能一級一級的建目錄,父目錄不存在的話使用這個命令會報錯

    hadoop fs -mkdir -p < hdfs path>

    所建立的目錄若是父目錄不存在就建立該父目錄

6.getmerge

    hadoop fs -getmerge < hdfs dir > < local file >

    將 hdfs 指定目錄下全部文件排序後合併到 local 指定的文件中,文件不存在時會自動建立,文件存在時會覆蓋裏面的內容

    hadoop fs -getmerge -nl < hdfs dir > < local file >

    加上 nl 後,合併到 local file 中的 hdfs 文件之間會空出一行

7.cp

    hadoop fs -cp < hdfs file > < hdfs file >

    目標文件不能存在,不然命令不能執行,至關於給文件重命名並保存,源文件還存在

    hadoop fs -cp < hdfs file or dir >... < hdfs dir >

    目標文件夾要存在,不然命令不能執行

8.mv

    hadoop fs -mv < hdfs file > < hdfs file >

    目標文件不能存在,不然命令不能執行,至關於給文件重命名並保存,源文件不存在

    hadoop fs -mv < hdfs file or dir >... < hdfs dir >

    源路徑有多個時,目標路徑必須爲目錄,且必須存在。

    注意:跨文件系統的移動(local 到 hdfs 或者反過來)都是不容許的

9.count

    hadoop fs -count < hdfs path >

    統計 hdfs 對應路徑下的目錄個數,文件個數,文件總計大小

    顯示爲目錄個數,文件個數,文件總計大小,輸入路徑

10.du

    hadoop fs -du < hdsf path>

    顯示 hdfs 對應路徑下每一個文件夾和文件的大小

    hadoop fs -du -s < hdsf path>

    顯示 hdfs 對應路徑下全部文件和的大小

    hadoop fs -du - h < hdsf path>

    顯示 hdfs 對應路徑下每一個文件夾和文件的大小,文件的大小用方便閱讀的形式表示,例如用 64M 代替 67108864

11.text

    hadoop fs -text < hdsf file>

    將文本文件或某些格式的非文本文件經過文本格式輸出

12.setrep

    hadoop fs -setrep -R 3 < hdfs path >

    改變一個文件在 hdfs 中的副本個數,上述命令中數字 3 爲所設置的副本個數,-R 選項能夠對一我的目錄下的全部目錄+文件遞歸執行改變副本個數的操做

13.stat

    hdoop fs -stat [format] < hdfs path >

    返回對應路徑的狀態信息

    [format]可選參數有:%b(文件大小),%o(Block 大小),%n(文件名),%r(副本個數),%y(最後一次修改日期和時間)

    能夠這樣書寫 hadoop fs -stat %b%o%n < hdfs path >,不過不建議,這樣每一個字符輸出的結果不是太容易分清楚

14.tail

    hadoop fs -tail < hdfs file >

    在標準輸出中顯示文件末尾的 1KB 數據

15.archive

    hadoop archive -archiveName name.har -p < hdfs parent dir > < src >* < hdfs dst >

    命令中參數 name:壓縮文件名,本身任意取;< hdfs parent dir > :壓縮文件所在的父目錄;<src >*:要壓縮的文件名;< hdfs dst >:壓縮文件存放路徑

    示例:hadoop archive -archiveName hadoop.har -p /user 1.txt 2.txt /des    

    示例中將 hdfs 中/user 目錄下的文件 1.txt,2.txt 壓縮成一個名叫 hadoop.har 的文件存放在 hdfs中/des 目錄下,若是 1.txt,2.txt 不寫就是將/user 目錄下全部的目錄和文件壓縮成一個名叫hadoop.har 的文件存放在 hdfs 中/des 目錄下

    顯示 har 的內容能夠用以下命令:

    hadoop fs -ls /des/hadoop.jar

    顯示 har 壓縮的是那些文件能夠用以下命令

    hadoop fs -ls -R har:///des/hadoop.har

    **注意:**har 文件不能進行二次壓縮。若是想給.har 加文件,只能找到原來的文件,從新建立一個。

    har 文件中原來文件的數據並無變化,har 文件真正的做用是減小 NameNode 和 DataNode 過多的空間浪費

16.balancer

    hdfs balancer

    若是管理員發現某些 DataNode 保存數據過多,某些 DataNode 保存數據相對較少,可使用上述命令手動啓動內部的均衡過程

17.dfsadmin

    hdfs dfsadmin -help

    管理員能夠經過 dfsadmin 管理 HDFS,用法能夠經過上述命令查看

    hdfs dfsadmin -report

    顯示文件系統的基本數據

    hdfs dfsadmin -safemode < enter | leave | get | wait >

    enter:進入安全模式;leave:離開安全模式;get:獲知是否開啓安全模式;

    wait:等待離開安全模式

18.distcp

    用來在兩個 HDFS 之間拷貝數據

    hadoop distcp hdfs://caozhan:9000/a  hdfs://cao:9000/ca

    命令行中還能夠指定多個源目錄:

    hadoop distcp hdfs://caozhan:9000/a hdfs://caozhan:9000/a  hdfs://cao:9000/ca

    或者使用-f選項,從文件裏得到多個源:        

    hadoop distcp -f hdfs://caozhan:9000/dirlist hdfs://caozhan:9000/d

    其中dirlist下是:

    hdfs://caozhan:9000/dirlist/a
    hdfs://caozhan:9000/dirlist/b

HDFS_JAVA_API:

    HDFS 是一個分佈式文件系統,既然是文件系統,就能夠對其文件進行操做,好比說新建文件、刪除文件、讀取文件內容等操做。

    Java 程序使用 HDFS Java API 與 HDFS 交互。使用這個 API,咱們能夠從 Java 程序中使用存儲在 HDFS 中的數據,以及使用其它非 Hadoop 計算框架來處理這些數據。

    有時,也會碰見這種狀況-想要從一個 MapReduce 應用程序中直接訪問 HDFS。不過,若是是直接從一個 Map 或 Reduce 任務中寫入或修改 HDFS 中的文件,請注意這違背了MapReduce 的 side-effect-free(無反作用)特性,這有可能致使數據一致性問題。

    對分佈在 HDFS 中的文件操做主要涉及一下幾個類:
         Configuration類:該類的對象封裝了客戶端或者服務器的配置。

         FileSystem類:該類的對象表明一個文件系統對象,能夠用該對象的一些方法來對文件進行操做。

            FileSystem fs = FileSystem.get(conf); // 經過 FileSystem 類的靜態方法 get 得到該對象

         FSDataInputStream 和 FSDataOutputStream:這兩個類是 HDFS 中的輸入輸出流。分別經過 FileSystem 的 open 方法和 create 方法得到。

         Path:表明文件或文件對象。
        下面這個示例演示了怎樣經過 Java 程序使用 HDFS Java API 來執行在 HDFS 上的文件系統操做。

【示例】經過 Java 程序使用 HDFS Java API 操做 HDFS 文件系統。請按如下步驟執行:

    一、在 Eclipse 中新建立一個名爲 HDFSJavaAPIExample 的 project;

    二、在項目的 src 目錄下建立一個名爲 HDFSJavaAPIDemo.java 的源文件,該 java 程序會在 HDFS 中建立一個新的文件,並在其中寫入一些文本,而後從 HDFS 讀取回這個文件。編輯代碼以下:

package com.edu360.api;

import com.edu360.Util.HadoopUtil;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.io.IOUtils;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

/**
 * java 一出 誰與爭鋒
 * <p>
 * .............................................
 * 佛祖保佑             永無BUG
 *
 * @Auther: caozhan
 * @Date: 2018/10/13 17:54
 * @Description:
 */
public class HadoopApi {
    public static void main(String [] args){
        FileSystem fs = HadoopUtil.getFileSystem();
        download(fs,"/test/test1.txt","/Users/caozhan/a.txt");

    }
    //建立文件
    public static  FSDataOutputStream createFile(FileSystem fileSystem,String path){
        try{
           FSDataOutputStream outputStream = fileSystem.create(new Path(path));
           if(outputStream!=null){
                System.out.println("建立成功");
               return outputStream;
           }
        }catch (Exception e){
            e.printStackTrace();
        }
        System.out.println("建立失敗");
        return null;
    }

    //寫入文件
    public static  void writeFile(FileSystem fileSystem,String Filepath,String values){
        FSDataOutputStream out;
        try{
                System.out.println("文件不存在,正在建立...");
                out = createFile( fileSystem, Filepath);
                out.writeBytes(values);
                out.close();

        }catch (Exception e){
            e.printStackTrace();
        }

    }

    //讀取文件
    public static void readFile(FileSystem fileSystem,String Filepath){
        try{
            FSDataInputStream input = fileSystem.open(new Path(Filepath));
            IOUtils.copyBytes(input,System.out,1024,true);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    //刪除文件
    public static void delFile(FileSystem fileSystem,String Filepath){
        try{
            boolean flag=fileSystem.delete(new Path(Filepath));
            if(flag==true){
                tell("刪除成功");
            }else {
                tell("刪除失敗");
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    //上穿文件
    public static void upload(FileSystem fileSystem,String resp,String destp){
        try{
            Path resP = new Path(resp);
            Path destP = new Path(destp);
            if(!fileSystem.exists(destP)){
                fileSystem.mkdirs(destP);
            }
            fileSystem.copyFromLocalFile(resP,destP);
            fileSystem.close();
            System.out.println("***********************");
            System.out.println("上傳成功!");
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    //下載文件
    public static void download(FileSystem fileSystem,String destp,String local){
        try {
            FSDataInputStream input = fileSystem.open(new Path(destp));
            OutputStream output=new FileOutputStream(local);
            IOUtils.copyBytes(input,output,4096,true);
            System.out.println("***********************");
            System.out.println("下載成功!");
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    //查看目錄信息
    public static void listDir(FileSystem fileSystem,String path) throws IOException {
        RemoteIterator<LocatedFileStatus> fileIter = fileSystem.listFiles(new Path(path),true);
        while(fileIter.hasNext()){
            LocatedFileStatus fileInfo = fileIter.next();
            tell("文件路徑"+fileInfo.getPath());
            tell("文件所屬組"+fileInfo.getGroup());
            tell(fileInfo.getBlockLocations());
            tell("--------------------------------------");
        }
    }
    //輸出語句
    public static void tell(Object obj){
        System.out.println(obj);
    }


}
相關文章
相關標籤/搜索