HDFS的使用


HDFS-namenode 原理:記錄元數據(hdfs的目錄結構、塊信息等) 

1.會將樹形的數據結構對象序列化到namenode工作目錄中的faimages文件中,隔一段時間序列化一次。  對hdfs的修改操作被記錄下來,存在磁盤--edits日志文件。 如果掛機了先反序列化faimages的文件,但是不是最新的元數據,再把edits文件中的操作記錄解析與faimages合並成最新的元數據。

2.namenode本身不會做faimages和edits文件的合並,使用Secondarynamenode節點來完成合並操作。第一次先下載faimages和edits到自己的磁盤中,反序列化faimages到內存,啟動一個程序讀edits文件再更新faimages文件。上傳faimages到namenode上。

 

 

 

 

查看 hadoop fs -ls     hdfs文件 一個文件按照128MB每塊來切分  每塊保存3個副本 比如 170MB的文件會被切分成2塊128MB的塊,第一塊128MB 第二塊42MB 每塊有3個副本 

1、向hdf上傳文件:hadoop fs -put 文件 hdfs中的路徑 

2、向hdfs下載文件:hadoop fs -get hdfs中的文件路徑 本地路徑

3、創建文件夾:hadoop fs -mkdir /aaa

4、移動文件夾: hadoop fs -mv /一個路徑  /另一個路徑

5、刪除:hadoop fs -rm -r /xxx

6、查看hdfs中的文本內容:hadoop fs  -cat /demo.txt     hadoop fs -tail -f /demo.txt 倒數幾行

7、追加內容 hadoop fs -appendToFile xxx.txt /aaa.txt

8、hadoop fs 提示可用的命令

Java客戶端:

//new Configuration()會從項目的classpath中加載core-default.xml 等  也可以自己創建一個core-site.xml 加載時會覆蓋core-default.xml
Configuration conf = new Configuration();
//指定客戶端上傳到hdfs的文件的副本數  不是必須的操作 有默認值
conf.set("dfs.replication","2");
//構造一個訪問HDFS的客戶端對象:參1:hdfs的uri 參2:配置文件 參3:客戶端身份
FileSystem fs = FileSystem.get(new URI("hdfs://hdp-01:9000/"),conf,"root");
//上傳一個文件到HDFS
fs.copyFromLocalFile(new Path("本地路徑"),new Path("HDFS的路徑"));
//下載HDFSS上的文件 fs訪問本地的磁盤,就需要使用hadoop系統的C語言庫,就需要使用hadoop/bin 配置HADOOP_HOME
fs.copyToLocalFile(new Path("HDFS的路徑"),new path("本地路徑"));
// hdfs內的移動
fs.rename(new Path(),new Path());
//創建文件夾
fs.mkdirs(new Path());
//刪除文件夾
fs.delete(new Path(),true);
//查詢hdfs目錄下的文件信息 參2 遞歸查詢下去 返回的是迭代器
fs.listFiles(enw Path,true)
//查詢hdfs目錄下的文件夾和文件信息 只看一級 返回數組
fs.status(new Path)
fs.close();

  

/**
	 * 讀取hdfs中文件的指定偏移量范圍的內容
	 * 
	 * 
	 * 作業題:用本例中的知識,實現讀取一個文本文件中的指定BLOCK塊中的所有數據
	 * 
	 * @throws IOException
	 * @throws IllegalArgumentException
	 */
	@Test
	public void testRandomReadData() throws IllegalArgumentException, IOException {

		FSDataInputStream in = fs.open(new Path("/xx.dat"));

		// 將讀取的起始位置進行指定
		in.seek(12);

		// 讀16個字節
		byte[] buf = new byte[16];
		in.read(buf);

		System.out.println(new String(buf));

		in.close();
		fs.close();

	}

	/**
	 * 往hdfs中的文件寫內容
	 * 
	 * @throws IOException
	 * @throws IllegalArgumentException
	 */

	@Test
	public void testWriteData() throws IllegalArgumentException, IOException {

		FSDataOutputStream out = fs.create(new Path("/zz.jpg"), false);

		// D:\images\006l0mbogy1fhehjb6ikoj30ku0ku76b.jpg

		FileInputStream in = new FileInputStream("D:/images/006l0mbogy1fhehjb6ikoj30ku0ku76b.jpg");

		byte[] buf = new byte[1024];
		int read = 0;
		while ((read = in.read(buf)) != -1) {
			out.write(buf,0,read);
		}
		
		in.close();
		out.close();
		fs.close();

	}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM