下面列舉出幾個經常使用場景下的命令。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
上面咱們介紹的是單線程訪問的 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
掌握了 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
HDFS提供了Java API接口對HDFS進行操做。若是如下程序在 Hadoop 集羣上運行, Path 中的路徑能夠寫爲相對路徑,好比 "/middle/weibo"; 若是如下程序在本地 Eclipse 上面測試,Path 中的路徑須要寫爲絕對路徑,好比"hdfs://single.hadoop.dajiangtai.com:9000/middle/weibo"。
//獲取文件系統 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(); } }