基本文件命令:html
格式爲:hadoop fs -cmd <args>java
cmd的命名一般與unix對應的命令名相同。例如,文件列表命令: hadoop fs -lsapache
一、添加目錄和文件編程
HDFS有一個默認的工做目錄 /user/$USER,其中$USER是你的登陸用戶名。不過目錄不會自動創建,咱們如今用mkdir創建它,我使用的是chen做爲用戶名。oop
hadoop fs -mkdir /user/chenspa
(hadoop的mkdir命令會自動建立父目錄,相似於帶-p的unix命令)unix
咱們如今放本地文件系統的一個文件進去。code
hadoop fs -put example.txt .htm
最後一個參數是句點,至關於放入了默認的工做目錄,等價於 hadoop fs -put example.txt /user/chen對象
當你把文件放入HDFS上後,你就能夠運行Hadoop程序來處理它。
二、檢索文件
get命令與put命令相反,它從HDFS複製文件回到本地文件系統。
hadoop fs -get example.txt .
複製到本地的當前工做目錄中。
另外一種是顯示數據,用cat
hadoop fs -cat example.txt
三、刪除文件
rm命令
hadoop fs -rm example.txt
也能夠用來刪除空目錄
編程讀寫HDFS
利用HDFS給咱們提供的API,咱們一樣能夠訪問它。
在Hadoop中用做文件操做的主類位於org.apache.hadoop.fs軟件包中。包括常見的open、read、write、close。Hadoop文件的API起點是FileSystem類,這是一個與文件系統交互的抽象類,咱們經過調用factory的方法FileSystem.get(Configuration conf)來取得所需的FileSystem實例,以下咱們能夠得到與HDFS接口的FileSystem對象:
Configuration conf = new Configuration();
FileSystem hdfs = FileSystem.get(conf);//得到HDFS的FileSystem對象
若是咱們要實現HDFS與本地文件系統的交互,咱們還須要獲取本地文件系統的FileSystem對象
FileSystem local = FileSystem.getLocal(conf);//得到本地文件系統的FileSystem對象
如下代碼講解了一個例子,咱們開發一個PutMerge程序,用於合併本地文件後放入HDFS,由於大文件HDFS處理起來比較容易,因此這個程序常常會在之後的開發中用到
import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; public class PutMerge { public static void main(String[] args) throws IOException { Configuration conf = new Configuration(); FileSystem hdfs =FileSystem.get(conf); //得到HDFS文件系統的對象 FileSystem local = FileSystem.getLocal(conf);//得到本地文件系統的對象 Path inputDir = new Path(args[0]);//設定輸入目錄 Path hdfsFile = new Path(args[1]);//設定輸出目錄 try{ FileStatus[] inputFiles = local.listStatus(inputDir);//FileStatus的listStatus()方法得到一個目錄中的文件列表 FSDataOutputStream out = hdfs.create(hdfsFile);//生成HDFS輸出流 for(int i = 0; i < inputFiles.length; i ++){ System.out.println(inputFiles[i].getPath().getName()); FSDataInputStream in = local.open(inputFiles[i].getPath());//打開本地輸入流 byte[] buffer = new byte[256]; int bytesRead = 0; while((bytesRead = in.read(buffer))>0){ out.write(buffer,0,bytesRead);//經過一個循環來寫入 } in.close(); } out.close(); }catch (IOException e) { e.printStackTrace(); } } |
Hadoop:第一個程序操做HDFS