今天來說說hadoop的一大核心——HDFS,這個是很重要的,它呢,是分佈式文件系統。爲什麼說hadoop能存儲海量數據?其實主要還是依賴與hdfs的能力,主要依賴的是hdfs能存儲海量數據。
1、 爲什麼hdfs能存儲海量數據呢?
一開始拋出這樣的問題來想想。至於HDFS的基本概念什麼的都不用多說了的~我們重在使用,而不是去做“研究”。扯蛋的話就是,“專家的研究”已經成爲名副其實的貶義詞了,很帶有諷刺意義了,在現在這個時代~你們懂的~因爲他們有的沒有真正經歷過,而卻要說着要去“研究”~所以我們不“糾結於”概念,我們只要使用就可以了的~
回到問題,這個是爲什麼呢?其實很簡單,hdfs包含兩大核心——NameNode和DataNode,namenode在集羣中是隻能有一個的,datanode可以有多個,我們要知道,數據其主要實是保存在datanode上的,從字面上也能理解的~並且datanode可以平滑擴展的~這就好比數據可以存儲在一個大型的datanode中的,所以能支持海量數據的存儲。
2、怎麼使用hdfs?
安裝了hadoop的就可以直接使用hdfs了的,一般有兩種方式:
一種是命令式:
我們知道hadoop的bin目錄下有一個hadoop的命令,這個其實算是hadoop的一個管理命令,我們可以使用這個來對hdfs操作的。
hadoop fs -lsr /
以上是遞歸列出hdfs根目錄下的所有文件(夾)
解釋一下:
hadoop 不用解釋了的,fs 指的是hdfs, -ls(r) 這個類似linux的目錄列表命令,列出所有文件(夾),括弧的r表示遞歸,/ 表示根目錄。
其他常用的命令還有:
hadoop fs -mkdir [path] 表示創建文件夾
hadoop fs -put [path] 表示上傳文件到hdfs
hadoop fs -put ~/hello.txt /tmp/input/
等等相關的一系列命令,這邊就不一一講出~
一種是api式:
看下面程序:
public static void main(String[] args) throws Exception {
URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
final URL url = new URL(PathConstant.FILE01);
final InputStream in = url.openStream();
/**
* @param in
* 輸出流
* @param out
* 輸出流
* @param buffSize
* 緩衝區大小
* @param close
* 是否關閉流
*/
IOUtils.copyBytes(in, System.out, 1024, true);
}
public class PathConstant {
public static final String FILE01 = "hdfs://192.168.0.167:9000/tmp/input/micmiu-01.txt";
public static final String DIR_PATH = "hdfs://192.168.0.167:9000/tmp/";
public static final String TEST_PATH = "hdfs://192.168.0.167:9000/tmp/test/";
public static final String FILE_PATH = "hdfs://192.168.0.167:9000/tmp/test/demo.txt";
}
運行上面的程序如下:
直接輸出的是hdfs裏面文件的內容。org.apache.hadoop.io.IOUtils; 這個是hadoop裏面提供的一個操作工具類
以上這種是java.socket的方式,其實hadoop裏面推薦了使用FileSystem這個類來操作:
public static void main(String[] args) throws Exception {
// 創建文件夾
// mkdir();
// 上傳文件
// uploadData();
// 下載文件
// getContent();
// 刪除文件(夾)
// delete();
}
public static void delete() throws IOException {
FileSystem testFileSystem = FileSystem.get(
URI.create(PathConstant.TEST_PATH), new Configuration());
/**
* @param f
* 目錄
* @param recursive
* 遞歸
*/
boolean flag = testFileSystem.delete(new Path(PathConstant.TEST_PATH),
true);
System.out.println(flag);
}
public static void uploadData() throws IOException, FileNotFoundException {
FileSystem testFileSystem = FileSystem.get(
URI.create(PathConstant.TEST_PATH), new Configuration());
FSDataOutputStream out = testFileSystem.create(new Path(
PathConstant.FILE_PATH));
FileInputStream in = new FileInputStream(
"F:\\hadoop.file\\demo\\hello.txt");
IOUtils.copyBytes(in, out, 1024, true);
}
public static void getContent() throws Exception {
FileSystem fileSystem = FileSystem.get(
URI.create(PathConstant.FILE_PATH), new Configuration());
InputStream in = fileSystem.open(new Path(PathConstant.FILE_PATH));
IOUtils.copyBytes(in, System.out, 1024, true);
}
public static void mkdir() throws Exception {
FileSystem fileSystem = FileSystem.get(
URI.create(PathConstant.DIR_PATH), new Configuration());
boolean flag = fileSystem.mkdirs(new Path(PathConstant.TEST_PATH));
System.out.println(flag);
}