Hadoop個人心得筆記之HDFS讀寫刪

                                       HDFS讀寫刪

目錄

                                       HDFS讀寫刪

一、讀流程

1.代碼實現

二、寫流程

1.代碼實現

三、刪流程

1.代碼實現


一、讀流程

  1. 客戶端發起RPC請求到NameNode
  2. NameNode在收到請求之後會先校驗這個文件上是否存在。如果存在,那麼會將這個文件所對應的Block的存儲地址放入一個隊列(順序)中返回給客戶端
  3. 客戶端收到隊列之後會從隊列中將每一個Block對應的地址來依次取出,從3個地址中取出一個較近的地址來進行讀取
  4. 讀取完一個Block之後,對這個Block進行一次checksum的驗證 - 驗證這個Block的數據總量是否準確;如果不一致,則說明該Block產生損壞,客戶端會通知NameNode,然後再從其他節點上重新讀取該Block
  5. 如果讀完一個Block會讀取下一個Block,直到這一次的所有的Block全部讀完
  6. 客戶端在讀完這一批地址會向NameNode要下一批的地址
  7. 等讀完所有的Block,客戶端會給NameNode發送消息通知NameNode關閉文件

1.代碼實現

	// 讀取數據
	@Test
	public void get() throws IOException {
		Configuration conf = new Configuration();
		// 連接HDFS
		// uri:連接地址
		// conf:配置
		FileSystem fs = FileSystem.get(URI.create("hdfs://10.42.60.249:9000"), conf);
		// 打開文件,獲取指向文件的輸入流
		InputStream in = fs.open(new Path("/VERSION"));
		// 創建一個輸出流
		FileOutputStream out = new FileOutputStream("a.txt");
		IOUtils.copyBytes(in, out, conf);
		// 關流
		in.close();
		out.close();
	}

 

二、寫流程

  1. 客戶端發起RPC請求到NameNode,這個請求包含對文件信息的描述
  2. NameNode收到請求之後,校驗這個用戶的權限;如果校驗通過,則檢查這個路徑下是否有同名文件,如果沒有同名文件,則允許寫入
  3. NameNode計算這個文件需要的地址數量,然後會給每一塊分配對應的地址,並且將地址放入隊列中返回給客戶端
  4. 客戶端在收到地址之後,將數據進行封包(packets),寫入DataNode
  5. 在寫的時候,從分配的地址中選取一個較近的節點將數據寫入。在寫完一個Block之後,這個DataNode自動的通過Pipeline(管道,實際上基於NIO的Channel)將這個Block備份到其他節點上構成指定的複本數量
  6. 節點之間依次傳遞ACK信號表示備份成功,在客戶端收到ACK之後會繼續寫下一個Block
  7. 客戶端寫完所有的Block之後會通知NameNode關流,此時這個文件更改爲不可寫

1.代碼實現

// 上傳文件
	@Test
	public void put() throws IOException, URISyntaxException, InterruptedException {
		Configuration conf = new Configuration();
		// 在代碼中指定的配置優先於xml中的配置
		conf.set("dfs.replication", "1");
		FileSystem fs = FileSystem.get(new URI("hdfs://192.168.89.129:9000"), conf, "root");

		// 表示在HDFS上創建指定的文件
		OutputStream out = fs.create(new Path("/a.log"));
		FileInputStream in = new FileInputStream("C:\\gsLauncher.log");
		IOUtils.copyBytes(in, out, conf);
		in.close();
		out.close();

	}

三、刪流程

  1. 客戶端發起RPC請求到NameNode
  2. NameNode收到請求之後,校驗這個文件是否存在,如果存在,校驗這個客戶端是否有刪除權限,如果有權限則允許刪除。
  3. 在通過校驗之後,NameNode就會將這個操作記錄到edits_inprogress文件中,然後修改內存中的元數據,最後向客戶端返回ack表示刪除成功。此時數據並沒有從HDFS上移除
  4. NameNode等待DataNode的心跳,通過DataNode的心跳信息校驗DataNode上是否有要刪除的數據,如果有要刪除的數據,則NameNode會給對應的DataNode發送指令刪除指定的數據,DataNode在接收到指令纔會刪除。此時數據才真正從HDFS上移除

1.代碼實現

@SuppressWarnings("deprecation")
	@Test
	public void delete() throws IOException, InterruptedException {

		Configuration conf = new Configuration();
		FileSystem fs = FileSystem.get(URI.create("hdfs://192.168.89.129:9000"), conf, "root");
		fs.delete(new Path("/VERSION"));

	}

 

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