1. 使用命令行操作
1)4個通用命令行
<1>archive 歸檔文件的創建
用途:
由於hadoop的設計是爲了處理大數據,理想的數據應該blocksize的倍數。namenode在啓動時會將所有的元數據load到內存中
當大量小於blocksize的文件存在的時候,,不僅佔用了大量的存儲空間,也佔用了大量的namenode內存。
archive可以將多個小文件打包成一個大文件進行存儲,並且打包後的文件仍然可以通過mapreduce來操作,因爲
打包後的文件由索引和存儲兩大部分組成,索引部分記錄了原有的目錄結構和文件狀態。
用法:
hadoop archive -archiveName test.har -p /A/B /E/F /G/G1 /home
-archiveName test.har表示指定歸檔文件的名稱(har爲後綴名),-p指定要打包文件的路徑,可以有多個,
最後的參數表示歸檔文件放在哪(相對路徑)
示例:
hadoop archive -archiveName ins.har -p hdfs://192.168.80.11:9000/user.hadoop/in in
運行發現,也是用的mapreduce
<2>distcp 分佈式複製
用途:
在相同的文件系統中並行的複製文件,且必須是相同版本。
如果版本不一致,使用hdfs會產生錯誤,因爲rpc不兼容,這時候可以使用基於HTTP協議的hftp協議,
但目標仍然得是hdfs的:
hadoop distcp hftp://namenode:50070/user/hadoop/input hdfs://namenode:9000/user/hadoop/input1
也可使用webhdfs,源地址和目標地址都可以使用webhdfs,可以完全兼容
hadoop distcp webhdfs://namenode:50070/user/hadoop/input webhdfs://namenode:50070/user/hadoop/input1
用法:
hadoop distcp hdfs://namenode1/foo hdfs://namenode2/bar
把第一個集羣中的foo目錄中的內容複製到第二個集羣的bar目錄下,如果bar不存在,則會新建一個。
可以指定多個源路徑,源路徑必須是絕對路徑。
默認情況下,distcp會跳過目標路徑已經存在的文件,但可以通過-overwrite選項進行覆蓋,
也可以使用-updata來選擇只更新哪些修改過的文件。
distcp會將一大堆文件平均分攤開交給map去執行,每個文件單獨一個map。如果總大小小於256M,
distcp只會分配一個map。但如果平分的結果出現map和超過20的情況,每個節點的map數就會按20算。
可以使用-m講maps設置的大一些。
<3>jar
用途:
運行一個內含hadoop運行代碼的jar文件
示例:
hadoop jar jar包名字 主類方法 參數
如:
hadoop jar sample.jar mainmethod args
<4>fs
用途:
運行一個常規的文件基本命令
2)18個常用的基本命令的操作
格式爲:hadoop fs -cmd <agrs>,可以使用hadoop fs -help來獲取幫助
<1>-cat
用途: 將路經指定的文件輸出到屏幕
示例: hadoop fs -cat URI
<2>-copyFromLocal
用途: 將本地文件複製到HDFS中
示例:hadoop fs -copyFromLocal localURI
<3>-copyToLocal
用途:將一個文件從HDFS中複製到本地文件
示例:hadoop fs -copyToLocal localURI
<4>-cp
用途:將文件從原路徑複製到目標路徑,原路徑可以有多個,目標路徑只有一個
示例:
hadoop fs -cp /user/file /user/files
hadoop fs -cp /user/file1 /user/file2 /user/files
<5>-du
用途:不指定具體文件只指定目錄時,顯示目錄下文各件的大小;指定了某個具體目錄,顯示該目錄下所有文件的大小
什麼都不指定時,顯示HDFS所有文件大小
示例:hadoop fs -du URI
<6>-dus
用途:顯示目標文件或者目錄的大小
示例:hadoop fs -dus 或者
hadoop fs -dus hdfs://master:9000/user/hadoop/in
<7>-expunge
用途:清空回收站
示例:hadoop fs -expunge
<8>-get
用途:複製文件到本地文件系統
示例:hadoop fs -get hdfs://master:9000/user/hadoop/in/ins /home/hadoop/
<9>-ls
用途:遍歷,如果是一個目錄,返回其子文件的一個列表
示例:hadoop fs -ls返回文件相同中的所有文件夾列表
hadoop fs -ls hdfs://master:9000/user/hadoop/in返回in文件夾下所有文件和文件夾
<10>-lsr
用途:遞歸的查閱文件
示例:hadoop fs -lsr展示文件系統中所有的文件列表
<11>-mkdir
用途:創建文件夾,如果父母路不存在,則一起創建父目錄
示例:hadoop fs -mkdir hdfs://master:9000/user/hadopp/in2
<12>-mv
用途:同一個文件系統中移動文件,目標可以有多個
示例:hadoop fs -mv src target
<13>-put
用途:從本地文件系統複製單個或者多個路徑到目標文件系統
示例:hadoop fs -put localfile hdfs://master:9000/user/hadoop/in
hadoop fs -put /home/hadoop/jdk1.6.0_24/ hdfs://master:9000/user/hadoop/in
<14>-rm
用途:刪除指定的文件,要求非空的目錄和文件
示例:hadoop fs -rm URI
<15>-rmr
用途:遞歸的刪除指定目錄及其子文件
示例:hadoop fs -rmr URI
<16>-setrep
用途:改變一個文件副本數
示例:hadoop fs -setrep -w 3 -R hdfs://master:9000/uer/hadoop/in/ins
<17>-test
用途:使用ezd對文件進行檢查
示例:-e檢查文件是否存在,若存在返回0
-z檢查文件是否是0字節,如果是,返回0
-d檢查路徑是否是目錄,是返回1,否返回0
<18>-text
用途:將原文件輸出爲文本格式,運行格式爲zip或者Text類
示例:hadoop fs -text srcfile
*上述HDFS中的文件路徑可以直接寫/user/hadoop/in/ins,省略前面的hdfs://192.68.80.11:9000,
因爲已經在core-site.xml中定義過了。
2.使用web瀏覽器瀏覽HDFS文件
瀏覽器輸入http://192.168.80.11:50070即可查看HDFS的相關信息和日誌
3.使用FileSystem API來操作HDFS文件
1)讀取HDFS上的數據
import java.io.IOException; import java.net.URI; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IOUtils; /** * 讀取數據 */ public class Hdfsoper1 { public static void main(String[] args) throws IOException { Configuration conf = new Configuration(); String path = "hdfs://192.168.80.11:9000/user/hadoop/in/ins"; FileSystem fs = FileSystem.get(URI.create(path), conf); FSDataInputStream fsin = fs.open(new Path(path)); IOUtils.copyBytes(fsin, System.out, 1024); } }
2)有選擇的讀取,即可以自己設置讀取位置
import java.io.IOException; import java.net.URI; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IOUtils; /** * 可以通過seek()方法設置讀取的位置 */ public class hdfsoper2 { public static void main(String[] args) throws IOException { Configuration conf= new Configuration(); String path = "hdfs://192.168.80.11:9000/user/hadoop/in/ins"; FileSystem fs = FileSystem.get(URI.create(path), conf); FSDataInputStream fsin = fs.open(new Path(path)); IOUtils.copyBytes(fsin, System.out, 1024); fsin.seek(18); System.out.println("*********read again**********"); IOUtils.copyBytes(fsin, System.out, 1024); } }
3)上傳本地文件到HDFS中
import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URI; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IOUtils; import org.apache.hadoop.util.Progressable; /** * upload file to HDFS */ public class Hdfsoper3 { public static void main(String[] args) throws IOException { Configuration conf = new Configuration(); //source file String source = "/home/hadoop/jdk-6u24-linux-i586.bin"; InputStream in = new BufferedInputStream(new FileInputStream(source)); //target file String target = "hdfs://192.168.80.11:9000/user/hadoop/in/jdk.bin"; FileSystem fs = FileSystem.get(URI.create(target), conf); OutputStream out = fs.create(new Path(target), new Progressable() { @Override //when upload 64KB to hdfs, then print a * in the console public void progress() { System.out.print("*"); } }); IOUtils.copyBytes(in, out, 4096, true); } }
4)刪除HDFS中的文件
import java.io.IOException; import java.net.URI; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; /** * delete file by FileSystem.delete( new Path(), true); */ public class hdfsoper4 { public static void main(String[] args) throws IOException { Configuration conf = new Configuration(); String path = "hdfs://192.168.80.11:9000/user/hadoop/in/jdk.bin"; FileSystem fs = FileSystem.get(URI.create(path), conf); //if we want delete a directory, then true fs.delete(new Path(path), true); } }