常用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();
}
}
}