常用的HDFS操作

常用HDFS操作

進入hadoop目錄

cd /usr/local/hadoop

然後啓動hadoop服務

./sbin/start-all.sh

進入集羣根目錄

hadoop dfs -ls /

創建兩個文本文件

echo "hello world" >> test_local.txt
echo "hello hadoop" >> test_put.txt

創建用戶工作目錄

hadoop fs -mkdir -p /user/hadoop
echo $?     //檢查上一條指令的執行狀態,若爲0則代表執行成功並退出,若爲1則代表執行失敗

上傳文件到HDFS系統

hadoop fs -put test_put.txt
//將test_put文件上傳到集羣中

向HDFS中上傳任意文本文件,如果指定的文件在HDFS中已經存在,由用戶指定是追加到原有文件末尾還是覆蓋原有的文件先移動到hadoop文件夾

追加到原有文件末尾

hadoop fs -appendToFile test_local.txt test_put.txt
//將test_local.txt的內容追加到test_put.txt文件裏去

將本地文件拷貝至HDFS系統

hadoop fs -copyFromLocal local.txt test.txt
//只能將本地文件內容拷貝至集羣中的test.txt(文件不可以存在,沒有會自動創建)
hadoop fs -copyFromLocal local.txt
//將本地文件local.txt的內容拷貝至集羣中,若有相同文件名則拷貝失敗

強制覆蓋文件

hadoop fs -put -f local.txt(本地的文件) local.txt(HDFS的文件)

查看集羣中文件內容

hadoop fs -cat test_put.txt

從HDFS中下載指定文件,如果本地文件與要下載的文件名稱相同,則自動對下載的文件重命名

若本地文件中沒有local.txt文件可以直接拷貝

hadoop fs -get local.txt
hadoop fs -copyToLocal local.txt

若本地文件中存在local.txt需要創建local_1.txt文件

hadoop fs -copyToLocal local.txt local_1.txt

將HDFS中指定文件的內容輸出到終端中

hadoop fs -cat local.txt

顯示HDFS中指定的文件的讀寫權限、大小、創建時間、路徑等信息

hadoop fs -ls local.txt

給定HDFS中某一個目錄,輸出該目錄下的所有文件的讀寫權限、大小、創建時間、路徑等信息,如果該文件是目錄,則遞歸輸出該目錄下所有文件相關信息

hadoop fs -ls -R -h . 
//查看當前目錄下的文件

提供一個HDFS內的文件的路徑,對該文件進行創建和刪除操作。如果文件所在目錄不存在,則自動創建目錄

hadoop fs -rm ./put.txt
hadoop fs -mkdir ./test
hadoop fs -mkdir ./test/test.txt

提供一個HDFS的目錄的路徑,對該目錄進行創建和刪除操作。創建目錄時,如果目錄文件所在目錄不存在則自動創建相應目錄;刪除目錄時,由用戶指定當該目錄不爲空時是否還刪除該目錄

hadoop fs -mkdir -p /test_2/test_3
//遞歸創建文件夾
hadoop fs -rm /test_2
//刪除文件夾
hadoop fs -rm -r /test_2/test_3 
//遞歸刪文件夾

向HDFS中指定的文件追加內容,由用戶指定內容追加到原有文件的開頭或結尾

hadoop fs -appendToFile append.txt /test1.txt //向結尾追加
//向開頭追加
hadoop fs -get /test1.txt
cat test1.txt >> append.txt
hadoop fs -put -f append.txt /test1.txt

刪除HDFS中指定的文件

hadoop fs -rm /test1.txt

刪除HDFS中指定的目錄,由用戶指定目錄中如果存在文件時是否刪除目錄

hdfs dfs -mkdir -p /dir

在HDFS中,將文件從源路徑移動到目的路徑

hadoop fs -mv /test1.txt /test2.txt

編程實現一個類“MyFSDataInputStream”,該類繼承“org.apache.hadoop.fs.FSDataInputStream”,要求如下:實現按行讀取HDFS中指定文件的方法“readLine()”,如果讀到文件末尾,則返回空,否則返回文件一行的文本

package hadoop.apache.prg.example;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.util.Progressable;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
 
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URI;

public class MyFSDataInputStream {
	private FileSystem fileSystem = null;
    //配置文件
    private Configuration configuration = null;
    //虛擬機的HDFS的訪問URI
    private static final String HDFS_URI = "hdfs://localhost:9000";
    public static void main(String args[]){
    	MyFSDataInputStream ms = new MyFSDataInputStream();
    	try{
    		ms.setUp();
    		ms.cat_test();
    		ms.clearTail();
    	}catch(Exception e){
    		System.out.println(e.toString());
    	}
    }
	//編程實現一個類“MyFSDataInputStream”,該類繼承“org.apache.hadoop.fs.FSDataInputStream”,
    //要求如下:實現按行讀取HDFS中指定文件的方法“readLine()”,如果讀到文件末尾,則返回空,否則返回文件一行的文本。
    public void cat_test() throws Exception {
    	FSDataInputStream fin = fileSystem.open(new Path("/hdfs_test/hello.txt"));    
        //此路徑爲集羣上的路徑,不是本地路徑
    	BufferedReader in = new BufferedReader(new InputStreamReader(fin, "UTF-8"));
    	String s = in.readLine();
    	while(s!=null)//如果當前行不爲空
    	{
    	System.out.println(s);//打印當前行
    	s= in.readLine();//讀取下一行
    	}
    	in.close();
    	}
    //開始前操作--初始化資源
    
    public void setUp() throws Exception {
        System.out.println("=====================start========================");
        configuration = new Configuration();
        fileSystem = FileSystem.get(new URI(HDFS_URI), configuration, "hadoop");
    }
 //結束後操作--釋放資源
    
    public void clearTail() throws Exception {
        configuration = null;
        fileSystem = null;
        System.out.println("=====================end========================");
    }

}

查看Java幫助手冊或其它資料,用“java.net.URL”和“org.apache.hadoop.fs.FsURLStreamHandlerFactory”編程完成輸出HDFS中指定文件的文本到終端中

package hadoop.apache.prg.example;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;
import org.apache.hadoop.fs.Path;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.io.IOUtils;
public class ShowTheContent {
static {
	URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
}
public static void cat(String remoteFilePath) {
try (InputStream in = new URL("hdfs", "localhost", 9000, remoteFilePath).openStream()) {
	IOUtils.copyBytes(in, System.out, 4096, false);
	IOUtils.closeStream(in);
	} catch (IOException e) {
		e.printStackTrace();
	}
}
public static void main(String[] args) {
String remoteFilePath = "/hdfs_test/hello.txt"; // HDFS路徑
try {
System.out.println("讀取文件: " + remoteFilePath);
ShowTheContent.cat(remoteFilePath);
System.out.println("\n讀取完成");
} catch (Exception e) {
e.printStackTrace();
		}
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章