HDFS的Shell訪問和Java API訪問

Shell訪問HDFS經常使用命令

1.shell 操做單個 HDFS 集羣

下面列舉出幾個經常使用場景下的命令。html

一、建立文件夾java

        HDFS 上的文件目錄結構相似 Linux,根目錄使用 "/" 表示。下面的命令將在 /middle 目錄下創建目錄 weibonode

hadoop fs -mkdir  /middle/weibo

二、上傳文件 weibo.txt 到 weibo 目錄下。注意,最後那個/必須有,不然會傳到middle文件夾下文件名爲weiboweb

hadoop fs -put weibo.txt /middle/weibo/

    還能夠使用 -copyFromLocal 參數。shell

hadoop fs -copyFromLocal weibo.txt /middle/weibo/

三、查看 weibo.txt 文件內容。apache

 hadoop fs -text /middle/weibo/weibo.txt

    還能夠用 -cat、-tail 參數查看文件的內容。可是對於壓縮的結果文件只能用 -text 參數來查看,不然是亂碼。windows

hadoop fs -cat /middle/weibo/weibo.txt
hadoop fs -tail /middle/weibo/weibo.txt

四、把 weibo.txt 文件複製到本地。安全

hadoop fs -get /middle/weibo/weibo.txt

        還能夠用 -copyToLocal 參數。tcp

hadoop fs -copyToLocal /middle/weibo/weibo.txt

五、刪除 weibo.txt 文件。分佈式

hadoop fs -rm /middle/weibo/weibo.txt

        刪除/middle/weibo文件夾。

hadoop-2.2.0-x64]$ hadoop fs -rmr /middle/weibo

        六、顯示 /middle 目錄下的文件。

 hadoop fs -ls /middle

2.shell 操做多個 HDFS 集羣

        上面咱們介紹的是單線程訪問的 HDFS 訪問模型,可是 多個Hadoop 集羣須要複製數據該怎麼辦呢?幸運的是,Hadoop 有一個有用的 distcp 分佈式複製程序,該程序是由 MapReduce 做業來實現的,它是經過集羣中並行運行的 map 來完成集羣之間大量數據的複製。 下面咱們將介紹 distcp 在不一樣場景下該如何使用。

        兩個集羣運行相同版本的 Hadoop。

        兩個 HDFS 集羣之間傳輸數據,默認狀況下 distcp 會跳過目標路徑下已經存在的文件。

hadoop distcp hdfs://single.hadoop.dajiangtai.com:9000/weather
hdfs://hadoop.dajiangtai.com:9000/middle

        這條指令把第一個集羣/weather 目錄及其內容複製到第二個集羣的/middle 目錄下,因此第二個集羣最後的目錄結構爲/middle/weather。若是/middle 不存在,則新建一個。 也能夠指定多個源路徑,並把全部路徑都複製到目標路徑下。這裏的源路徑必須是絕對路徑。

        兩個 HDFS 集羣之間傳輸數據,覆蓋現有的文件使用overwrite。

hadoop distcp -overwrite hdfs://single.hadoop.dajiangtai.com:9000/weather hdfs://hadoop.dajiangtai.com:9000/middle

        兩個 HDFS 集羣之間傳輸數據,更新有改動過的文件使用update。

hadoop distcp -update hdfs://single.hadoop.dajiangtai.com:9000/weather hdfs://hadoop.dajiangtai.com:9000/middle

        兩個集羣運行不一樣版本的 Hadoop。

        不一樣版本 Hadoop 集羣的 RPC 是不兼容的,使用distcp 複製數據並使用 hdfs 協議,會致使複製做業失敗。想要彌補這種狀況,能夠使用基於只讀 HTTP 協議的 HFTP 文件系統並從源文件系統中讀取數據。 這個做業必須運行在目標集羣上,進而實現 hdfs RPC 版本的兼容。

        還以兩個 HDFS 集羣之間傳輸數據爲例。

hadoop distcp hftp://single.hadoop.dajiangtai.com:9000/weather hdfs://hadoop.dajiangtai.com:9000/middle

        注意,這裏須要在 URI 源中指定 namenode 的 Web 端口。這是由 dfs.http.address 屬性決定的,其默認值爲 50070。

        若是使用新出的 webhdfs 協議(替代 hftp)後,對源集羣和目標集羣都可以使用 HTTP 協議進行通訊,且不會形成任何不兼容的問題。

hadoop distcp webhdfs://single.hadoop.dajiangtai.com:9000/weather webhdfs://hadoop.dajiangtai.com:9000/middle

3.Hadoop 管理員其餘常見shell操做

        掌握了 shell 如何訪問 HDFS,做爲 Hadoop 管理員,還須要掌握以下常見命令:

        一、查看正在運行的 Job。

hadoop job -list

        二、關閉正在運行的 Job。

hadoop job -kill job_1432108212572_0001

        三、檢查 HDFS 塊狀態,查看是否損壞。

hadoop fsck /

        四、檢查 HDFS 塊狀態,並刪除損壞的塊。

hadoop fsck / -delete

        五、檢查 HDFS 狀態,包括 DataNode 信息。

hadoop dfsadmin -report

        六、Hadoop 進入安全模式。

hadoop dfsadmin -safemode enter

        七、Hadoop 離開安全模式。

hadoop dfsadmin -safemode leave

        八、平衡集羣中的文件

sbin/start-balancer.sh

Java API接口

        HDFS提供了Java API接口對HDFS進行操做。若是如下程序在 Hadoop 集羣上運行, Path 中的路徑能夠寫爲相對路徑,好比 "/middle/weibo"; 若是如下程序在本地 Eclipse 上面測試,Path 中的路徑須要寫爲絕對路徑,好比"hdfs://single.hadoop.dajiangtai.com:9000/middle/weibo"。

        一、獲取 HDFS 文件系統

//獲取文件系統
public static FileSystem getFileSystem() throws IOException {
    
    //讀取配置文件
    Configuration conf = new Configuration();
    
    //返回默認文件系統  若是在 Hadoop集羣下運行,使用此種方法可直接獲取默認文件系統
    //FileSystem fs = FileSystem.get(conf);
    
    //指定的文件系統地址
    URI uri = new URI("hdfs://single.hadoop.dajiangtai.com:9000");
    //返回指定的文件系統    若是在本地測試,須要使用此種方法獲取文件系統
    FileSystem fs = FileSystem.get(uri,conf);
    
    return fs;
}

        若是放到 hadoop 集羣上面運行,獲取文件系統能夠直接使用 FileSystem.get(conf)。

        二、建立文件目錄

//建立文件目錄
public static void mkdir() throws Exception {
    
    //獲取文件系統
    FileSystem fs = getFileSystem();
    
    //建立文件目錄
    fs.mkdirs(new Path("hdfs://single.hadoop.dajiangtai.com:9000/middle/weibo"));
    
    //釋放資源
    fs.close();
}

        三、刪除文件或文件目錄

//刪除文件或者文件目錄
public static void rmdir() throws Exception {
    
    //返回FileSystem對象
    FileSystem fs = getFileSystem();
    
    //刪除文件或者文件目錄  delete(Path f) 此方法已經棄用
    fs.delete(new Path("hdfs://single.hadoop.dajiangtai.com:9000/middle/weibo"),true);
    
    //釋放資源
    fs.close();
}

        四、獲取目錄下的全部文件

//獲取目錄下的全部文件
public static void ListAllFile() throws IOException{
    
    //返回FileSystem對象
    FileSystem fs = getFileSystem();
    
    //列出目錄內容
    FileStatus[] status = fs.listStatus(new Path("hdfs://single.hadoop.dajiangtai.com:9000/middle/weibo/"));
    
    //獲取目錄下的全部文件路徑
    Path[] listedPaths = FileUtil.stat2Paths(status);
    
    //循環讀取每一個文件
    for(Path p : listedPaths){
        
        System.out.println(p);
        
    }
    //釋放資源
    fs.close();
}

        五、文件上傳至 HDFS

//文件上傳至 HDFS
public static void copyToHDFS() throws IOException{
    
    //返回FileSystem對象
    FileSystem fs = getFileSystem();
    
    //源文件路徑是Linux下的路徑,若是在 windows 下測試,須要改寫爲Windows下的路徑,好比D://hadoop/djt/weibo.txt
    Path srcPath = new Path("/home/hadoop/djt/weibo.txt");
    
    // 目的路徑
    Path dstPath = new Path("hdfs://single.hadoop.dajiangtai.com:9000/middle/weibo");
    
    //實現文件上傳
    fs.copyFromLocalFile(srcPath, dstPath);
    
    //釋放資源
    fs.close();
}

        六、從 HDFS 下載文件

//從 HDFS 下載文件
public static void getFile() throws IOException{
    
    //返回FileSystem對象
    FileSystem fs = getFileSystem();
    
    //源文件路徑
    Path srcPath = new Path("hdfs://single.hadoop.dajiangtai.com:9000/middle/weibo/weibo.txt");
    
    //目的路徑是Linux下的路徑,若是在 windows 下測試,須要改寫爲Windows下的路徑,好比D://hadoop/djt/
    Path dstPath = new Path("/home/hadoop/djt/");
    
    //下載hdfs上的文件
    fs.copyToLocalFile(srcPath, dstPath);
    
    //釋放資源
    fs.close();
}

        七、獲取 HDFS 集羣節點信息

//獲取 HDFS 集羣節點信息
public static void getHDFSNodes() throws IOException{
    
    //返回FileSystem對象
    FileSystem fs = getFileSystem();
    
    //獲取分佈式文件系統
    DistributedFileSystem hdfs = (DistributedFileSystem)fs;
    
    //獲取全部節點
    DatanodeInfo[] dataNodeStats = hdfs.getDataNodeStats();
    //循環打印全部節點
    for(int i=0;i< dataNodeStats.length;i++){
        System.out.println("DataNode_"+i+"_Name:"+dataNodeStats[i].getHostName());
    }
}

        八、查找某個文件在 HDFS 集羣的位置

//查找某個文件在 HDFS 集羣的位置
public static void getFileLocal() throws IOException{
    
    //返回FileSystem對象
    FileSystem fs = getFileSystem();
    
    //文件路徑
    Path path = new Path("hdfs://single.hadoop.dajiangtai.com:9000/middle/weibo/weibo.txt");
    
    //獲取文件目錄
    FileStatus filestatus = fs.getFileStatus(path);
    //獲取文件塊位置列表
    BlockLocation[] blkLocations = fs.getFileBlockLocations(filestatus, 0, filestatus.getLen());
    //循環輸出塊信息
    for(int i=0;i< blkLocations.length;i++){
        String[] hosts = blkLocations[i].getHosts();
        System.out.println("block_"+i+"_location:"+hosts[0]);
    }
}

        上述 Java API對 HDFS 的操做方法,能夠逐個放在 Test 類中進行測試。

package com.dajiangtai.hadoop.middle;
import java.io.IOException;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.BlockLocation;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FileUtil;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hdfs.DistributedFileSystem;
import org.apache.hadoop.hdfs.protocol.DatanodeInfo;
public class Test {

    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        //mkdir();
        //rmdir();
        //ListAllFile();
        //copyToHDFS();
        //getFile();
        //getHDFSNodes();
        //getFileLocal();
    }
}
相關文章
相關標籤/搜索