熟練掌握HDFS的Shell訪問和Java API訪問


官方文檔鏈接:http://hadoop.apache.org/docs/r2.6.5/hadoop-project-dist/hadoop-common/FileSystemShell.html#test

 HDFS設計的主要目的是對海量數據進行處理,也就是說在其上能夠存儲很大量文件(可以存儲TB級的文件)。HDFS將這些文件分割之后,存儲在不同的DataNode上, HDFS 提供了兩種數據訪問接口:Shell接口和Java API 接口,對HDFS里面的文件進行操作,具體每個Block放在哪台DataNode上面,對於開發者來說是透明(簡而言之就是看不見的)的。

Shell 接口

        HDFS 處理文件的命令和 Linux 命令基本相同,這里區分大小寫。下面介紹 HDFS 操作分布式文件系統的命令。

        HDFS基本命令:

hadoop fs -cmd
cmd:具體的操作,基本上與UNIX的命令行相同
args:參數

        HDFS 資源URI格式:

scheme://authority/path
scheme:協議名,file或hdfs
authority:namenode主機名
path:路徑
示例:hdfs://cloud004:9000/middle/test.txt
假設已經在core-site.xml里配置了fs.default.name=hdfs://cloud004:9000,則僅使用/middle/test.txt即可。

 

shell 操作單個 HDFS 集群

 

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

        1、創建文件夾

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

[hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop fs -mkdir  /middle/weibo

        2、上傳文件 weibo.txt 到 weibo 目錄下。

[hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop fs -put weibo.txt /middle/weibo/

        還可以使用 -copyFromLocal 參數。

[hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop fs -copyFromLocal weibo.txt /middle/weibo/

        3、查看 weibo.txt 文件內容。

[hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop fs -text /middle/weibo/weibo.txt

        還可以用 -cat、-tail 參數查看文件的內容。但是對於壓縮的結果文件只能用 -text 參數來查看,否則是亂碼。

[hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop fs -cat /middle/weibo/weibo.txt
[hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop fs -tail /middle/weibo/weibo.txt

        4、把 weibo.txt 文件復制到本地。

[hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop fs -get /middle/weibo/weibo.txt

        還可以用 -copyToLocal 參數。

[hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop fs -copyToLocal /middle/weibo/weibo.txt

        5、刪除 weibo.txt 文件。

[hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop fs -rm /middle/weibo/weibo.txt

        刪除/middle/weibo文件夾。

[hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop fs -rmr /middle/weibo

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

[hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop fs -ls /middle

 

shell 操作多個 HDFS 集群

 

        上面我們介紹的是單線程訪問的 HDFS 訪問模型,但是 多個Hadoop 集群需要復制數據該怎么辦呢?幸運的是,Hadoop 有一個有用的 distcp 分布式復制程序,該程序是由 MapReduce 作業來實現的,它是通過集群中並行運行的 map 來完成集群之間大量數據的復制。 下面我們將介紹 distcp 在不同場景下該如何使用。

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

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

[hadoop@cloud0042 hadoop-2.2.0-x64]$ hadoop distcp hdfs://cloud004:9000/weather hdfs://cloud0042:9000/middle

        這條指令把第一個集群/weather 目錄及其內容復制到第二個集群的/middle 目錄下,所以第二個集群最后的目錄結構為/middle/weather。如果/middle 不存在,則新建一個。 也可以指定多個源路徑,並把所有路徑都復制到目標路徑下。這里的源路徑必須是絕對路徑。

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

[hadoop@cloud0042 hadoop-2.2.0-x64]$ hadoop distcp -overwrite hdfs://cloud004:9000/weather hdfs://cloud0042:9000/middle

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

[hadoop@cloud0042 hadoop-2.2.0-x64]$ hadoop distcp -update hdfs://cloud004:9000/weather hdfs://cloud0042:9000/middle

        兩個集群運行不同版本的 Hadoop。

        不同版本 Hadoop 集群的 RPC 是不兼容的,使用distcp 復制數據並使用 hdfs 協議,會導致復制作業失敗。想要彌補這種情況,可以使用基於只讀 HTTP 協議的 HFTP 文件系統並從源文件系統中讀取數據。 這個作業必須運行在目標集群上,進而實現 hdfs RPC 版本的兼容。

        還以兩個 HDFS 集群之間傳輸數據為例。

[hadoop@cloud0042 hadoop-2.2.0-x64]$ hadoop distcp hftp://cloud004:9000/weather hdfs://cloud0042:9000/middle

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

        如果使用新出的 webhdfs 協議(替代 hftp)后,對源集群和目標集群均可以使用 HTTP 協議進行通信,且不會造成任何不兼容的問題。

[hadoop@cloud0042 hadoop-2.2.0-x64]$ hadoop distcp webhdfs://cloud004:9000/weather webhdfs://cloud0042:9000/middle

 

Hadoop 管理員其他常見shell操作

 

        掌握了 shell 如何訪問 HDFS,作為 Hadoop 管理員,還需要掌握如下常見命令:

        1、查看正在運行的 Job。

[hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop job -list

 
        

        2、關閉正在運行的 Job。

[hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop job -kill job_1432108212572_0001

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

[hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop fsck /
[hadoop@test jar]$ hadoop fsck /
DEPRECATED: Use of this script to execute hdfs command is deprecated.
Instead use the hdfs command for it.

18/04/08 19:57:11 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Connecting to namenode via http://test:50070
FSCK started by hadoop (auth:SIMPLE) from /192.168.80.128 for path / at Sun Apr 08 19:57:19 CST 2018
..
/second/anagram.txt:  Under replicated BP-1804412879-192.168.80.128-1522874281586:blk_1073741827_1003. Target Replicas is 3 but found 1 replica(s).
.....Status: HEALTHY
 Total size:    1483101 B
 Total dirs:    12
 Total files:    7
 Total symlinks:        0
 Total blocks (validated):    6 (avg. block size 247183 B)
 Minimally replicated blocks:    6 (100.0 %)
 Over-replicated blocks:    0 (0.0 %)
 Under-replicated blocks:    1 (16.666666 %)
 Mis-replicated blocks:        0 (0.0 %)
 Default replication factor:    1
 Average block replication:    1.0
 Corrupt blocks:        0
 Missing replicas:        2 (25.0 %)
 Number of data-nodes:        1
 Number of racks:        1
FSCK ended at Sun Apr 08 19:57:19 CST 2018 in 80 milliseconds


The filesystem under path '/' is HEALTHY

 

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

[hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop fsck / -delete

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

[hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop dfsadmin -report
Configured Capacity: 18569568256 (17.29 GB)
Present Capacity: 16106115072 (15.00 GB)
DFS Remaining: 16104345600 (15.00 GB)
DFS Used: 1769472 (1.69 MB)
DFS Used%: 0.01%
Under replicated blocks: 1
Blocks with corrupt replicas: 0
Missing blocks: 0

-------------------------------------------------
Live datanodes (1):

Name: 192.168.80.128:50010 (test)
Hostname: test
Decommission Status : Normal
Configured Capacity: 18569568256 (17.29 GB)
DFS Used: 1769472 (1.69 MB)
Non DFS Used: 2463453184 (2.29 GB)
DFS Remaining: 16104345600 (15.00 GB)
DFS Used%: 0.01%
DFS Remaining%: 86.72%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 1
Last contact: Sun Apr 08 19:58:51 CST 2018

 

        6、Hadoop 進入安全模式。

[hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop dfsadmin -safemode enter
[hadoop@test jar]$ hadoop dfsadmin -safemode enter
DEPRECATED: Use of this script to execute hdfs command is deprecated.
Instead use the hdfs command for it.

18/04/08 19:59:57 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Safe mode is ON

 

        7、Hadoop 離開安全模式。

[hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop dfsadmin -safemode leave
[hadoop@test jar]$ hdfs dfsadmin -safemode leave
18/04/08 20:00:59 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Safe mode is OFF

 

        8、平衡集群中的文件

[hadoop@cloud004 hadoop-2.2.0-x64]$ sbin/start-balancer.sh

Java API接口

        HDFS提供了Java API接口對HDFS進行操作。如果以下程序在 Hadoop 集群上運行, Path 中的路徑可以寫為相對路徑,比如 "/middle/weibo"; 如果以下程序在本地 Eclipse 上面測試,Path 中的路徑需要寫為絕對路徑,比如"hdfs://cloud004:9000/middle/weibo"。

        1、獲取 HDFS 文件系統

 
         
public static FileSystem getFileSystem() throws IOException, URISyntaxException{
        //1、獲取配置文件
        Configuration conf = new Configuration();
        
//        FileSystem fs = FileSystem.get(conf);//集群環境下直接獲取默認文件系統
        //2、指定的文件系統地址
        URI path = new URI("hdfs://test:9000");
        //3、返回指定的文件系統地址 ------本地測試使用此方法
        FileSystem fs = FileSystem.get(path, conf);
        //4、此處關閉文件系統流會報錯,導致之后的操作無法進行
        /**
         * fs.close();
         * Exception in thread "main" java.io.IOException: Filesystem closed
    at org.apache.hadoop.hdfs.DFSClient.checkOpen(DFSClient.java:795)
    at org.apache.hadoop.hdfs.DFSClient.primitiveMkdir(DFSClient.java:2743)
    at org.apache.hadoop.hdfs.DFSClient.mkdirs(DFSClient.java:2724)
    at org.apache.hadoop.hdfs.DistributedFileSystem$17.doCall(DistributedFileSystem.java:870)
    at org.apache.hadoop.hdfs.DistributedFileSystem$17.doCall(DistributedFileSystem.java:866)
    at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)
    at org.apache.hadoop.hdfs.DistributedFileSystem.mkdirsInternal(DistributedFileSystem.java:866)
    at org.apache.hadoop.hdfs.DistributedFileSystem.mkdirs(DistributedFileSystem.java:859)
    at org.apache.hadoop.fs.FileSystem.mkdirs(FileSystem.java:1817)
    at com.dajiangtai.hdfsJavaAPI.FileTest.mkdir(FileTest.java:33)
    at com.dajiangtai.hdfsJavaAPI.FileTest.main(FileTest.java:46)

         * 
         * */
        return fs;
    }

 

        如果放到 hadoop 集群上面運行,獲取文件系統可以直接使用 FileSystem.get(conf)。

        2、創建文件目錄

//創建文件目錄
    public static void mkdir() throws IOException, URISyntaxException{
    
        //1、調用剛剛獲得的HDFS文件系統,返回文件系統對象
        FileSystem fs = getFileSystem();
        //2、指定創建的文件系統路徑
        fs.mkdirs(new Path("hdfs://test:9000/filetest"));
        //3、關閉文件流--------此處不關閉流的情況下,創建文件會正常運行,且不報錯
        fs.close();
    }

 

 

        3、刪除文件或文件目錄

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

 

        4、獲取目錄下的所有文件

    //獲取目錄下的所有文件
    public static void getAllFile() throws IOException, URISyntaxException{
        //1、獲取文件系統對象
        FileSystem fs = getFileSystem();
        //2、獲取該目錄下的文件名稱---FileStatus獲取文件的元數據
        FileStatus[] listStatus = fs.listStatus(new Path("hdfs://test:9000/filetest/"));
        //3.獲取文件的path路徑
        Path[] stat2Paths = FileUtil.stat2Paths(listStatus);
        //4、循環遍歷路徑,輸出結果
        for(Path path: stat2Paths){
            System.out.println(path);
        }
        fs.close();
        /**打印結果
         * hdfs://test:9000/filetest/file0.txt
hdfs://test:9000/filetest/file1.txt
hdfs://test:9000/filetest/file2.txt
hdfs://test:9000/filetest/file3.txt
hdfs://test:9000/filetest/file4.txt
hdfs://test:9000/filetest/file5.txt
         * */
    }
    

 

        5、文件上傳至 HDFS

//上傳文件到hdfs
    public static void copyToHdfs() throws IOException, URISyntaxException{
        //1、獲取文件系統對象
        FileSystem fs = getFileSystem();
        /*
         * Exception in thread "main" java.io.FileNotFoundException: File does not exist: /home/hadoop/app/hadoop-2.6.0/filetest/copyToHdfs.txt
         * 
         * Exception in thread "main" java.lang.IllegalArgumentException: Pathname /C:/Users/yizhijing/Desktop/llllllll/file1.txt from C:/Users/yizhijing/Desktop/llllllll/file1.txt is not a valid DFS filename.
         * */
        //本地文件路徑,並且集群中同文件目錄下不存在同名文件的情況下
        //2、獲取本地文件路徑------在windows環境下就是wondows路徑,在Linux環境下就是linux路徑eg:/home/hadoop/app/hadoop-2.6.0/filetest/file.txt
        Path path = new Path("D://file.txt");
        //3、獲取集群文件路徑
        Path path2 = new Path("hdfs://test:9000/filetest");
        //4、調用文件系統的方法上傳文件
        fs.copyFromLocalFile(path, path2);
        //5、關閉文件流
        fs.close();
    }

 

 

        6、從 HDFS 下載文件

//從hdfs下載文件到到本地windows系統
    public static void copyToLocal() throws IOException, URISyntaxException{
        //1、獲取文件系統對象
        FileSystem fs = getFileSystem();
        //2、指定下載的hdfs文件路徑
        Path path = new Path("hdfs://test:9000/filetest/file.txt");
        //3、指定本地接收的文件路徑
        Path path2 = new Path("F://軟件all/微信/WeChat Files/WeChat Files/l1067021152/Files");
        //4、調用文件系統的下載文件系統方法
        fs.copyToLocalFile(path, path2);
        //5、關閉文件流
        fs.close();
    }    

 

        7、獲取 HDFS 集群節點信息

//獲取hdfs節點信息
    public static void getNodeMessage() throws IOException, URISyntaxException{
        //1、獲取文件系統對象
        FileSystem fs = getFileSystem();
        //2、獲取分布式文件系統對象
        DistributedFileSystem hdfs = (DistributedFileSystem)fs;
        //3、獲取分布式系統所有節點信息
        DatanodeInfo[] dataNodeStats = hdfs.getDataNodeStats();
        //4、打印節點
        for(int i = 0;i<dataNodeStats.length;i++){
            System.out.println("datanode_"+i+"name:"+dataNodeStats[i].getHostName());
        }
    }

 

        8、查找某個文件在 HDFS 集群的位置

//查詢某個文件在集群中的位置信息
    public static void getFileMessage() throws IOException, URISyntaxException{
        //1、獲取分布式文件系統
        FileSystem fs = getFileSystem();
        //2、獲取某文件的路徑
        Path path = new Path("hdfs://test:9000/filetest/file.txt");
        //3、獲取某文件的目錄
        FileStatus fileStatus = fs.getFileStatus(path);
        //4、獲取文件塊位置列表
        BlockLocation[] fileBlockLocations = fs.getFileBlockLocations(fileStatus, 0, fileStatus.getLen());
        //5、循環輸出塊信息
        for (int i = 0; i < fileBlockLocations.length; i++) {
            String[] hosts = fileBlockLocations[i].getHosts();
            System.out.println("block"+i+"location"+hosts[0]);
        }
    }

 

        上述 Java API對 HDFS 的操作方法,完整代碼如下所示:

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

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 FileTest {
    //獲取HDFS文件系統
    public static FileSystem getFileSystem() throws IOException, URISyntaxException{
        //1、獲取配置文件
        Configuration conf = new Configuration();
        
//        FileSystem fs = FileSystem.get(conf);//集群環境下直接獲取默認文件系統
        //2、指定的文件系統地址
        URI path = new URI("hdfs://test:9000");
        //3、返回指定的文件系統地址 ------本地測試使用此方法
        FileSystem fs = FileSystem.get(path, conf);
        /**
         * fs.close();
         * Exception in thread "main" java.io.IOException: Filesystem closed
    at org.apache.hadoop.hdfs.DFSClient.checkOpen(DFSClient.java:795)
    at org.apache.hadoop.hdfs.DFSClient.primitiveMkdir(DFSClient.java:2743)
    at org.apache.hadoop.hdfs.DFSClient.mkdirs(DFSClient.java:2724)
    at org.apache.hadoop.hdfs.DistributedFileSystem$17.doCall(DistributedFileSystem.java:870)
    at org.apache.hadoop.hdfs.DistributedFileSystem$17.doCall(DistributedFileSystem.java:866)
    at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)
    at org.apache.hadoop.hdfs.DistributedFileSystem.mkdirsInternal(DistributedFileSystem.java:866)
    at org.apache.hadoop.hdfs.DistributedFileSystem.mkdirs(DistributedFileSystem.java:859)
    at org.apache.hadoop.fs.FileSystem.mkdirs(FileSystem.java:1817)
    at com.dajiangtai.hdfsJavaAPI.FileTest.mkdir(FileTest.java:33)
    at com.dajiangtai.hdfsJavaAPI.FileTest.main(FileTest.java:46)

         * 
         * */
        return fs;
    }
    
    //創建文件目錄
    public static void mkdir() throws IOException, URISyntaxException{
    
        //1、調用剛剛獲得的HDFS文件系統,返回文件系統對象
        FileSystem fs = getFileSystem();
        //2、指定創建的文件系統路徑
        fs.mkdirs(new Path("hdfs://test:9000/filetest"));
        
        for(int i=0;i<6;i++){
            Path path = new Path("hdfs://test:9000/filetest/file"+i+".txt");
            fs.create(path);
        }
        //3、關閉文件流
        fs.close();
    }
    
    //刪除文件操作
    public static void rmFile() throws IOException, URISyntaxException{
        //1、獲取文件系統對象
        FileSystem fs = getFileSystem();
        //刪除指定的文件系統路徑
        fs.delete(new Path("hdfs://test:9000/filetest"),true);
        //3、關閉文件流
        fs.close();
    }
    
    //獲取目錄下的所有文件
    public static void getAllFile() throws IOException, URISyntaxException{
        //1、獲取文件系統對象
        FileSystem fs = getFileSystem();
        //2、獲取該目錄下的文件名稱---FileStatus獲取文件的元數據
        FileStatus[] listStatus = fs.listStatus(new Path("hdfs://test:9000/filetest/"));
        //3.獲取文件的path路徑
        Path[] stat2Paths = FileUtil.stat2Paths(listStatus);
        //4、循環遍歷路徑,輸出結果
        for(Path path: stat2Paths){
            System.out.println(path);
        }
        fs.close();
        /**打印結果
         * hdfs://test:9000/filetest/file0.txt
hdfs://test:9000/filetest/file1.txt
hdfs://test:9000/filetest/file2.txt
hdfs://test:9000/filetest/file3.txt
hdfs://test:9000/filetest/file4.txt
hdfs://test:9000/filetest/file5.txt
         * */
    }
    
    //上傳文件到hdfs
    public static void copyToHdfs() throws IOException, URISyntaxException{
        //1、獲取文件系統對象
        FileSystem fs = getFileSystem();
        /*
         * Exception in thread "main" java.io.FileNotFoundException: File does not exist: /home/hadoop/app/hadoop-2.6.0/filetest/copyToHdfs.txt
         * 
         * Exception in thread "main" java.lang.IllegalArgumentException: Pathname /C:/Users/yizhijing/Desktop/llllllll/file1.txt from C:/Users/yizhijing/Desktop/llllllll/file1.txt is not a valid DFS filename.
         * */
        //本地文件路徑,並且集群中同文件目錄下不存在同名文件的情況下
        //2、獲取本地文件路徑
        Path path = new Path("D://file.txt");
        //3、獲取集群文件路徑
        Path path2 = new Path("hdfs://test:9000/filetest");
        //4、調用文件系統的方法上傳文件
        fs.copyFromLocalFile(path, path2);
        //5、關閉文件流
        fs.close();
    }
    
    //從hdfs下載文件到到本地windows系統
    public static void copyToLocal() throws IOException, URISyntaxException{
        //1、獲取文件系統對象
        FileSystem fs = getFileSystem();
        //2、指定下載的hdfs文件路徑
        Path path = new Path("hdfs://test:9000/filetest/file.txt");
        //3、指定本地接收的文件路徑
        Path path2 = new Path("F://軟件all/微信/WeChat Files/WeChat Files/l1067021152/Files");
        //4、調用文件系統的下載文件系統方法
        fs.copyToLocalFile(path, path2);
        //5、關閉文件流
        fs.close();
    }
    
    //獲取hdfs節點信息
    public static void getNodeMessage() throws IOException, URISyntaxException{
        //1、獲取文件系統對象
        FileSystem fs = getFileSystem();
        //2、獲取分布式文件系統對象
        DistributedFileSystem hdfs = (DistributedFileSystem)fs;
        //3、獲取分布式系統所有節點信息
        DatanodeInfo[] dataNodeStats = hdfs.getDataNodeStats();
        //4、打印節點
        for(int i = 0;i<dataNodeStats.length;i++){
            System.out.println("datanode_"+i+"name:"+dataNodeStats[i].getHostName());
        }
    }
    
    //查詢某個文件在集群中的位置信息
    public static void getFileMessage() throws IOException, URISyntaxException{
        //1、獲取分布式文件系統
        FileSystem fs = getFileSystem();
        //2、獲取某文件的路徑
        Path path = new Path("hdfs://test:9000/filetest/file.txt");
        //3、獲取某文件的目錄
        FileStatus fileStatus = fs.getFileStatus(path);
        //4、獲取文件塊位置列表
        BlockLocation[] fileBlockLocations = fs.getFileBlockLocations(fileStatus, 0, fileStatus.getLen());
        //5、循環輸出塊信息
        for (int i = 0; i < fileBlockLocations.length; i++) {
            String[] hosts = fileBlockLocations[i].getHosts();
            System.out.println("block"+i+"location"+hosts[0]);
        }
    }
    
    public static void main(String[] args) throws IOException, URISyntaxException {

//        getFileSystem();
//        mkdir();
//        rmFile();
//        getAllFile();
//        copyToHdfs();
//        copyToLocal();
//        getNodeMessage();
        getFileMessage();
    }

}

 

 

運行程序

        以上 Java API 操作 HDFS 的各種方法,在本地測試完成后,可以根據自己實際情況,稍加修改Path路徑就可以直接放到 Hadoop 環境下運行。大致需要以下幾步:

        第一步:我們使用 myEclipse 將 FileTest.java 類打包為 FileTest.jar。因為這里不涉及第三方 jar 包,而且 Hadoop 集群上面已經存在 hadoop 所需要的jar包,所以我們只需要打包 FileTest.java 即可。

FileTest.jar

        第二步:在hadoop用戶下,通過 xshell 客戶端,將 test.jar 上傳至 hadoop服務器本地目錄/home/hadoop/app/hadoop-2.6.0/filetest/的下面。

[hadoop@test djt]$ ls
FileTest.jar

        第3步:我們需要切換到 hadoop 的安裝目錄bin下來運行 FileTest.jar 文件,否則無法找到需要的 jar包來執行程序。

[hadoop@testhadoop-2.2.0-x64]$ hadoop jar /home/hadoop/djt/FileTest.jar 包名.類名


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM