Hadoop详解(四):HDFS shell操作和Java API操作
1. HDFS環境準備
1.1 HDFS的格式化與啟動
HDFS配置完之后就可以對其進行格式化操作。在NameNode所在機器上執行如下命令進行HDFS的格式化操作:
hadoop namenode --format
在完成hdfs的格式化之后,就可以開始啟動HDFS系統了,執行如下命令啟動HDFS:
bin/start-dfs.sh
1.2. HDFS運行檢查
用戶可以使用HDFS的管理員命令查看HDFS集群系統的狀況,命令如下:
bin/hadoop dfsadmin -report
2. HDFS命令的運行
Hadoop作為一個分布式文件系統和Linux的文件系統一樣,也具有類似的命令行接口,所有的命令由bin/hadoop腳本引發。
通常的用法:
hadoop [–config confdir] COMMAND
2.1 fs shell
fs shell 是HDFS的調用文件系統shell命令,大多數fs shell命令的行為和對應的unix shell命令類似。
下面我們來詳細講述以下fs shell命令的使用:
cat
使用方法:hadoop fs -cat URI [URI …]將路徑指定文件的內容輸出到stdout。
ls
使用方法:hadoop fs -ls <`args`>如果是文件,則按照如下格式返回文件信息:
文件名 <副本數> 文件大小 修改日期 修改時間 權限 用戶ID 組ID
如果是目錄,則返回它直接子文件的一個列表,就像在Unix中一樣。目錄返回列表的信息如下:
目錄名 <dir> 修改日期 修改時間 權限 用戶ID 組ID
chgrp
使用方法:hadoop fs -chgrp [-R] GROUP URI [URI …]改變文件所屬的組。
chmod
使用方法:hadoop fs -chmod [-R] <MODE[,MODE]... | OCTALMODE> URI [URI …]改變文件的權限
chown
使用方法:hadoop fs -chown [-R] [OWNER][:[GROUP]] URI [URI ]改變文件的擁有者。使用-R將使改變在目錄結構下遞歸進行。
copyFromLocal
使用方法:hadoop fs -copyFromLocal <localsrc> URI
將本地文件復制到本地文件系統上去。
cp
將文件從源路徑復制到目標路徑。這個命令允許有多個源路徑,此時目標路徑必須是一個目錄。
使用方法:hadoop fs -cp URI [URI …] <dest>du
顯示目錄中所有文件的大小,或者當只指定一個文件時,顯示此文件的大小。
使用方法:hadoop fs -du URI [URI …]dus
使用方法:hadoop fs -dus <args>顯示文件的大小。
get
使用方法:hadoop fs -get [-ignorecrc] [-crc] <src> <localdst>復制文件到本地文件系統。可用-ignorecrc選項復制CRC校驗失敗的文件。使用-crc選項復制文件以及CRC信息。
getmerge
使用方法:hadoop fs -getmerge <src> <localdst> [addnl]接受一個源目錄和一個目標文件作為輸入,并且將源目錄中所有的文件連接成本地目標文件。addnl是可選的,用于指定在每個文件結尾添加一個換行符。
lsr
ls命令的遞歸版本。類似于Unix中的ls -R。
使用方法:hadoop fs -lsr <args>mkdir
使用方法:hadoop fs -mkdir <paths>接受路徑指定的uri作為參數,創建這些目錄。其行為類似于Unix的mkdir -p,它會創建路徑中的各級父目錄。
mv
使用方法:hadoop fs -mv URI [URI …] <dest>將文件從源路徑移動到目標路徑。這個命令允許有多個源路徑,此時目標路徑必須是一個目錄。不允許在不同的文件系統間移動文件。
put
使用方法:hadoop fs -put <localsrc> ... <dst>從本地文件系統中復制單個或多個源路徑到目標文件系統。也支持從標準輸入中讀取輸入寫入目標文件系統。
rm
刪除指定的文件。只刪除非空目錄和文件。請參考rmr命令了解遞歸刪除。
使用方法:hadoop fs -rm URI [URI …]rmr
使用方法:hadoop fs -rmr URI [URI …]delete的遞歸版本。
setrep
使用方法:hadoop fs -setrep [-R] <path>改變一個文件的副本系數。-R選項用于遞歸改變目錄下所有文件的副本系數。
stat
使用方法:hadoop fs -stat URI [URI …]返回指定路徑的統計信息。
tail
使用方法:hadoop fs -tail [-f] URI將文件尾部1K字節的內容輸出到stdout。支持-f選項,行為和Unix中一致。
test
使用方法:hadoop fs -test -[ezd] URI選項:
- -e 檢查文件是否存在。如果存在則返回0。
- -z 檢查文件是否是0字節。如果是則返回0。
- -d 如果路徑是個目錄,則返回1,否則返回0。
3. 使用Java API 操作 HDFS
用戶在使用HDFS的Java API之前需要了解兩個和HDFS讀寫等操作最為密切的Hadoop
包:org.apache.hadoop.fs和org.apache.hadoop.conf。fs包主要是文件系統的抽象,可以理解為支持多種文件系統實現的統一文件訪問接口;conf用于讀conf包,就是讀取系統配置,它依賴于fs包,主要是在讀取配置文件的時候需要使用文件系統,而部分文件系統的功能在fs包中被抽象了。對于Hadoop用戶來講要使用HDFS來對文件進行讀、寫、刪除等操作就需要了解fs包中的相關類和API接口。
3.1 寫入文件
public class HdfsWriteTest {public static void main(String[] args) throws IOException {String url=args[0];Configuration configuration=new Configuration();FileSystem fileSystem= FileSystem.get(URI.create(url),configuration);LocalFileSystem localFileSystem = FileSystem.getLocal(configuration);Path localDir=new Path(args[0]);Path hdfFile=new Path(args[1]);try {FileStatus[] fileStatuses = localFileSystem.listStatus(localDir);FSDataOutputStream fsDataOutputStream = fileSystem.create(hdfFile, new Progressable() {@Overridepublic void progress() {System.out.println(".");}});for (FileStatus fileStatus : fileStatuses) {FSDataInputStream inputStream = localFileSystem.open(fileStatus.getPath());byte buffer[]=new byte[1024];int read=0;while ((read=inputStream.read(buffer))!=-1){fsDataOutputStream.write(buffer,0,read);}}} finally {fileSystem.close();localFileSystem.close();}} }3.2 讀取文件
public class HdfsReadTest {public static void main(String[] args) throws IOException {String url=args[0];Configuration configuration=new Configuration();FileSystem fileSystem=FileSystem.get(URI.create(url),configuration);FSDataInputStream inputStream = null;try {inputStream = fileSystem.open(new Path(url));byte buffer[] =new byte[1024];int read=0;while ((read=inputStream.read(buffer))!=-1){System.out.println(new String (buffer,0,read));}} finally {inputStream.close();}} }總結
以上是生活随笔為你收集整理的Hadoop详解(四):HDFS shell操作和Java API操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hadoop详解(二):HDFS存储系统
- 下一篇: 大数据:Hive和Hbase的区别于优势