hdfs的客戶端操作
hdfs的客戶端有多種形式:
網頁形式
命令行形式
客戶端在哪里運行,沒有約束,只要運行客戶端的機器能夠跟hdfs集群聯網
文件的切塊大小和存儲的副本數量,都是由客戶端決定!
所謂的由客戶端決定,是通過配置參數來定的
hdfs的客戶端會讀以下兩個參數,來決定切塊大小、副本數量:
切塊大小的參數: dfs.blocksize
副本數量的參數: dfs.replication
上面兩個參數應該配置在客戶端機器的hadoop目錄中的hdfs-site.xml中配置
<property> <name>dfs.blocksize</name> <value>64m</value> </property> <property> <name>dfs.replication</name> <value>2</value> </property>
hdfs命令行客戶端的常用操作命令
查看hdfs中的目錄信息
hadoop fs -ls /hdfs路徑
上傳文件到hdfs中
hadoop fs -put /本地文件 /aaa
hadoop fs -copyFromLocal /本地文件 /hdfs路徑 ## copyFromLocal等價於 put hadoop fs -moveFromLocal /本地文件 /hdfs路徑 ## 跟copyFromLocal的區別是:從本地移動到hdfs中
下載文件到客戶端本地磁盤
hadoop fs -get /hdfs中的路徑 /本地磁盤目錄
hadoop fs -copyToLocal /hdfs中的路徑 /本地磁盤路徑 ## 跟get等價 hadoop fs -moveToLocal /hdfs路徑 /本地路徑 ## 從hdfs中移動到本地
在hdfs中創建文件夾
hadoop fs -mkdir -p /aaa/xxx
移動hdfs中的文件(改名)
hadoop fs -mv /hdfs的路徑 /hdfs的另一個路徑
刪除hdfs中的文件或文件夾
hadoop fs -rm -r /aaa
修改文件的權限
hadoop fs -chown user:group /aaa
hadoop fs -chmod 700 /aaa
追加內容到已存在的文件
hadoop fs -appendToFile /本地文件 /hdfs中的文件
顯示文本文件的內容
hadoop fs -cat /hdfs中的文件
hadoop fs -tail /hdfs中的文件
public class HdfsClientDemo { FileSystem fs = null; @Before public void init() throws Exception{ Configuration conf = new Configuration(); conf.set("dfs.replication", "2"); conf.set("dfs.blocksize", "64m"); fs = FileSystem.get(new URI("hdfs://hdp-01:9000/"), conf, "root"); } /** * 上傳文件到HDFS * @throws IOException * @throws IllegalArgumentException */ @Test public void testSet() throws IllegalArgumentException, IOException{ fs.copyFromLocalFile(new Path("D:/install-pkgs/hbase-1.2.1-bin.tar.gz"), new Path("/")); fs.close(); } /** * 從HDFS中下載文件到客戶端本地磁盤 * @throws IOException * @throws IllegalArgumentException */ @Test public void testGet() throws IllegalArgumentException, IOException{ fs.copyToLocalFile(new Path("/hdp20-05.txt"), new Path("f:/")); fs.close(); } /** * 在hdfs內部移動文件\修改名稱 */ @Test public void testRename() throws Exception{ fs.rename(new Path("/install.log"), new Path("/aaa/in.log")); fs.close(); } /** * 在hdfs中創建文件夾 */ @Test public void testMkdir() throws Exception{ fs.mkdirs(new Path("/xx/yy/zz")); fs.close(); } /** * 在hdfs中刪除文件或文件夾 */ @Test public void testRm() throws Exception{ fs.delete(new Path("/aaa"), true); fs.close(); } /** * 查詢hdfs指定目錄下的文件信息 */ @Test public void testLs() throws Exception{ // 只查詢文件的信息,不返回文件夾的信息 RemoteIterator<LocatedFileStatus> iter = fs.listFiles(new Path("/"), true); while(iter.hasNext()){ LocatedFileStatus status = iter.next(); System.out.println("文件全路徑:"+status.getPath()); System.out.println("塊大小:"+status.getBlockSize()); System.out.println("文件長度:"+status.getLen()); System.out.println("副本數量:"+status.getReplication()); System.out.println("塊信息:"+Arrays.toString(status.getBlockLocations())); System.out.println("--------------------------------"); } fs.close(); } /** * 查詢hdfs指定目錄下的文件和文件夾信息 */ @Test public void testLs2() throws Exception{ FileStatus[] listStatus = fs.listStatus(new Path("/")); for(FileStatus status:listStatus){ System.out.println("文件全路徑:"+status.getPath()); System.out.println(status.isDirectory()?"這是文件夾":"這是文件"); System.out.println("塊大小:"+status.getBlockSize()); System.out.println("文件長度:"+status.getLen()); System.out.println("副本數量:"+status.getReplication()); System.out.println("--------------------------------"); } fs.close(); }