自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

這是一篇最通熟易懂的Hadoop HDFS實踐攻略!

大數(shù)據(jù) Hadoop
以下是HDFS的基礎內容,希望可以幫助您快速熟悉HDFS的思路和使用方式。

[[191824]]

本文主要幫您解決一下幾個問題:

  • HDFS是用來解決什么問題?怎么解決的?
  • 如何在命令行下操作HDFS?
  • 如何使用Java API來操作HDFS?
  • 在了解基本思路和操作方法后,進一步深究HDFS具體的讀寫數(shù)據(jù)流程

學習并實踐本文教程后,可以對HDFS有比較清晰的認識,并可以進行熟練操作,為后續(xù)學習Hadoop體系打好基礎。

目錄:

理論部分

  1. HDFS 基本原理
  2. 文件讀取、寫入機制
  3. 元數(shù)據(jù)管理思路

實踐部分

  1. 安裝實踐環(huán)境
  2. Shell 命令行操作方式
  3. Java API操作方式

一、HDFS基本原理

HDFS(Hadoop Distribute File System)是一個分布式文件系統(tǒng),是Hadoop的重要成員。

1、文件系統(tǒng)的問題

文件系統(tǒng)是操作系統(tǒng)提供的磁盤空間管理服務,只需要我們制定把文件放到哪兒,從哪個路徑讀取文件就可以了,不用關心文件在磁盤上是如何存放的。

當文件所需空間大于本機磁盤空間時,如何處理呢?

一是加磁盤,但是加到一定程度就有限制了;二是加機器,用遠程共享目錄的方式提供網絡化的存儲,這種方式可以理解為分布式文件系統(tǒng)的雛形,可以把不同文件放入不同的機器中,空間不足了可繼續(xù)加機器,突破了存儲空間的限制。但這個方式有多個問題:

  • 單機負載可能極高例如某個文件是熱門,很多用戶經常讀取這個文件,就使得次文件所在機器的訪問壓力極高。
  • 數(shù)據(jù)不安全如果某個文件所在的機器出現(xiàn)故障,這個文件就不能訪問了,可靠性很差。
  • 文件整理困難例如想把一些文件的存儲位置進行調整,就需要看目標機器的空間是否夠用,并且需要自己維護文件位置,如果機器非常多,操作就極為復雜。

2、HDFS的解決思路

HDFS是個抽象層,底層依賴很多獨立的服務器,對外提供統(tǒng)一的文件管理功能,對于用戶來講,感覺就像在操作一臺機器,感受不到HDFS下面的多臺服務器。

例如用戶訪問HDFS中的/a/b/c.mpg這個文件,HDFS負責從底層相應服務器中讀取,然后返回給用戶,這樣用戶只需和HDFS打交道,不關心這個文件是怎么存儲的。

例如用戶需要保存一個文件/a/b/xxx.avi。

HDFS首先會把這個文件進行分割,例如分為4塊,然后分別放到不同服務器上。

這樣做有個好處,不怕文件太大,并且讀文件的壓力不會全部集中在一臺服務器上。但如果某臺服務器壞了,文件就讀不全了。

HDFS為保證文件可靠性,會把每個文件塊進行多個備份:

塊1:A B C

塊2:A B D

塊3:B C D

塊4:A C D

這樣文件的可靠性就大大增強了,即使某個服務器壞了,也可以完整讀取文件。

同時還帶來一個很大的好處,就是增加了文件的并發(fā)訪問能力,比如多個用戶讀取這個文件時,都要讀塊1,HDFS可以根據(jù)服務器的繁忙程度,選擇從那臺服務器讀塊1。

3、元數(shù)據(jù)的管理

HDFS中存了哪些文件?

文件被分成了哪些塊?

每個塊被放在哪臺服務器上?

……

這些都叫做元數(shù)據(jù),這些元數(shù)據(jù)被抽象為一個目錄樹,記錄了這些復雜的對應關系。這些元數(shù)據(jù)由一個單獨的模塊進行管理,這個模塊叫做NameNode。存放文件塊的真實服務器叫做DataNode,所以用戶訪問HDFS的過程可以理解為:

用戶-> HDFS -> NameNode -> DataNode

4、HDFS優(yōu)點

容量可以線性擴展

有副本機制,存儲可靠性高,吞吐量增大

有了NameNode后,用戶訪問文件只需指定HDFS上的路徑

二、HDFS實踐

經過上面介紹,可以對HDFS有個基本的了解,下面開始進行實際操作,在實踐中更好的認識HDFS。

1、安裝實踐環(huán)境

您可以選擇自己搭建環(huán)境,也可以使用打包好的Hadoop環(huán)境(版本2.7.3)

這個Hadoop環(huán)境實際上是一個虛機鏡像,所以需要安裝virtualbox虛擬機、vagrant鏡像管理工具,和我的Hadoop鏡像,然后用這個鏡像啟動虛機就可以了,下面是具體操作步驟:

1)安裝virtualbox

下載地址:https://www.virtualbox.org/wiki/Downloads

2)安裝vagrant

因為官網下載較慢,我上傳到了云盤

Windows版

鏈接: https://pan.baidu.com/s/1pKKQGHl

密碼: eykr

Mac版

鏈接: https://pan.baidu.com/s/1slts9yt

密碼: aig4

安裝完成后,在命令行終端下就可以使用vagrant命令。

3)下載Hadoop鏡像

鏈接: https://pan.baidu.com/s/1bpaisnd

密碼: pn6c

4)啟動

加載Hadoop鏡像

vagrant box add {自定義鏡像名稱} {鏡像所在路徑}

例如您想命名為Hadoop,鏡像下載后的路徑為d:\hadoop.box,加載命令就是這樣:

vagrant box add hadoop d:\hadoop.box

創(chuàng)建工作目錄,例如d:\hdfstest。

進入此目錄,初始化

  1. cd d:\hdfstest 
  2. vagrant init hadoop 

啟動虛機

  1. vagrant up 

啟動完成后,就可以使用SSH客戶端登錄虛機了

IP 127.0.0.1

端口 2222

用戶名 root

密碼 vagrant

登錄后使用命令ifconfig 查看本虛機的IP(如192.168.31.239),可以使用此IP和端口22登錄了

IP 192.168.31.239

端口 22

用戶名 root

密碼 vagrant

Hadoop服務器環(huán)境搭建完成。

2、Shell命令行操作

登錄Hadoop服務器后,先啟動HDFS,執(zhí)行命令:

  1. start-dfs.sh 

查看幫助

  1. hdfs dfs –help 

顯示目錄信息

-ls 后面是要查看的目錄路徑

創(chuàng)建目錄

創(chuàng)建目錄/test

  1. hdfs dfs -mkdir /test 

一次創(chuàng)建多級目錄/aa/bb

  1. hdfs dfs -mkdir -p /aa/bb 

上傳文件

形式

hdfs dfs -put {本地路徑} {hdfs中的路徑}

實例(先創(chuàng)建好一個測試文件mytest.txt,內容隨意,然后上傳到/test)

  1. hadoop fs -put ~/mytest.txt /test 

顯示文件內容

  1. hdfs dfs -cat /test/mytest.txt 

下載文件

  1. hdfs dfs -get /test/mytest.txt ./mytest2.txt 

合并下載

先創(chuàng)建2個測試文件(log.access, log.error),內容隨意,使用-put上傳到/test目錄下

  1. hdfs dfs -put log.* /test 

然后把2個log文件合并下載到一個文件中

  1. hdfs dfs -getmerge /test/log.* ./log 

查看本地log文件內容,應該包含log.access與log.error兩個文件的內容。

復制

從HDFS的一個路徑拷貝HDFS的另一個路徑

  1. hdfs dfs -cp /test/mytest.txt /aa/mytest.txt.2 

驗證

  1. hdfs dfs -ls /aa 

移動文件

  1. hdfs dfs -mv /aa/mytest.txt.2 /aa/bb 

驗證

  1. hdfs dfs -ls /aa/bb 

應列出mytest.txt.2。

刪除

  1. hdfs dfs -rm -r /aa/bb/mytest.txt.2 

使用-r參數(shù)可以一次刪除多級目錄。

驗證

  1. hdfs dfs -ls /aa/bb 

應為空

修改文件權限

與Linux文件系統(tǒng)中的用法一樣,修改文件所屬權限

  1. -chgrp 
  2.  
  3. -chmod 
  4.  
  5. -chown 

示例

  1. hdfs dfs -chmod 666 /test/mytest.txt 
  2.  
  3. hdfs dfs -chown someuser:somegrp /test/mytest.txt 

統(tǒng)計文件系統(tǒng)的可用空間

  1. hdfs dfs -df -h / 

統(tǒng)計文件夾的大小

  1. hdfs dfs -du -s -h /test 

3、Java API操作

(1)環(huán)境配置

因為需要在本機鏈接Hadoop虛機服務器,所以需要配置Hadoop,使其可以被外部訪問。

先登錄Hadoop虛機服務器,然后:

1)查看本機IP

  1. ip address 

例如IP為:192.168.31.239

2)修改文件:

  1. vi /usr/local/hadoop-2.7.3/etc/hadoop/core-site.xml 
  2.  
  3. fs.defaultFS 
  4.  
  5. hdfs://localhost:9000 

把其中的localhost:9000修改為本機IP 192.168.31.239:9000

3)重新啟動HDFS

#停止

  1. stop-dfs.sh 

#啟動

start-dfs.sh

(2)搭建開發(fā)環(huán)境

1)新建項目目錄hdfstest

2)在項目目錄下創(chuàng)建pom.xml

內容:

3)創(chuàng)建源碼目錄src/main/java

現(xiàn)在項目目錄結構

  1. ├── pom.xml 
  2.  
  3. !"" src 
  4.  
  5. │ └── main 
  6.  
  7. │ └── java 

(3)示例代碼

查看文件列表ls

1)新建文件src/main/java/Ls.java

列出/下的文件列表,及遞歸獲取所有文件

2)編譯執(zhí)行

  1. mvn compile 
  2.  
  3. mvn exec:java -Dexec.mainClass="Ls" -Dexec.cleanupDaemonThreads 
  4.  
  5. =false 

創(chuàng)建目錄mkdir

在HDFS中創(chuàng)建目錄/mkdir/a/b

1)新建文件

  1. src/main/java/Mkdir.java 

2)編譯執(zhí)行

  1. mvn compile 
  2.  
  3. mvn exec:java -Dexec.mainClass="Mkdir" -Dexec.cleanupDaemonThre 
  4.  
  5. ads=false 

3)在服務器中使用HDFS命令驗證

  1. hdfs dfs -ls /mkdir 

上傳文件put

在當前項目目錄下新建測試文件,上傳到HDFS中的/mkdir

1)在項目目錄下創(chuàng)建測試文件testfile.txt,內容隨意

2)新建文件src/main/java/Put.java

3)編譯執(zhí)行

  1. mvn compile 
  2. mvn exec:java -Dexec.mainClass="Put" -Dexec.cleanupDaemonThread  
  3. s=false 

4)在服務器中使用HDFS命令驗證

  1. hdfs dfs -ls /mkdir 
  2. hdfs dfs -cat /mkdir/testfile.txt 

下載文件get

1)新建文件src/main/java/Get.java

把HDFS中/mkdir/testfile.txt下載到當前項目目錄下

2)編譯執(zhí)行

  1. mvn compile 
  2. mvn exec:java -Dexec.mainClass="Get" -Dexec.cleanupDaemonThread 
  3. s=false 

3)查看項目目錄下是否存在testfile2.txt及其內容

刪除文件delete

刪除HDFS上之前上傳的/mkdir/testfile.txt

1)新建文件src/main/java/Del.java

2)編譯執(zhí)行

  1. mvn compile 
  2. mvn exec:java -Dexec.mainClass="Del" -Dexec.cleanupDaemonThread 
  3. s=false 

3)在服務器中使用HDFS命令驗證,檢查testfile.txt是否被刪除

  1. hdfs dfs -ls /mkdir 

重命名rename

把HDFS中的/mkdir/a重命名為/mkdir/a2

1)新建文件src/main/java/Rename.java

2)編譯執(zhí)行

  1. mvn compile  
  2. mvn exec:java -Dexec.mainClass="Rename" -Dexec.cleanupDaemonThr  
  3. eads=false 

3)在服務器中使用HDFS命令驗證

  1. hdfs dfs -ls /mkdir 

流方式讀取文件部分內容

上傳一個文本文件,然后使用流方式讀取部分內容保存到當前項目目錄。

1)在服務器中創(chuàng)建一個測試文件test.txt,內容:

  1. 123456789abcdefghijklmn 

上傳到HDFS

  1. hdfs dfs -put test.txt / 

2)在本地項目中新建文件src/main/java/StreamGet.java

2)編譯執(zhí)行

  1. mvn compile 
  2. mvn exec:java -Dexec.mainClass="StreamGet" -Dexec.cleanupDaemon 
  3. Threads=false 

3)執(zhí)行后查看項目目錄下的test.txt.part2

  1. 6789abcdefghijklmn 

前面的12345已經被略過

三、深入了解

1、寫入機制

向HDFS中寫入文件時,是按照塊兒為單位的,client會根據(jù)配置中設置的塊兒的大小把目標文件切為多塊,例如文件是300M ,配置中塊大小值為128M,那么就分為3塊兒。

具體寫入流程:

client向namenode發(fā)請求,說想要上傳文件

namenode會檢查目標文件是否存在、父目錄是否存在,檢查沒有問題后返回確認信息

client再發(fā)請求,問***個block應該傳到哪些datanode上

namenode經過衡量,返回3個可用的datanode(A,B,C)

client與A建立連接,A與B建立連接,B與C建立連接,形成一個pipeline

傳輸管道建立完成后,client開始向A發(fā)送數(shù)據(jù)包,此數(shù)據(jù)包會經過管道一次傳遞到B和C

當***個block的數(shù)據(jù)都傳完以后,client再向namenode請求第二個block上傳到哪些datanode,然后建立傳輸管道發(fā)送數(shù)據(jù)

就這樣,直到client把文件全部上傳完成

大數(shù)據(jù)

2、讀取機制

Client把要讀取的文件路徑發(fā)給namenode,查詢元數(shù)據(jù),找到文件塊所在的datanode服務器

Client直到了文件包含哪幾塊兒、每一塊兒在哪些datanode上,就選擇那些離自己進的datanode(在同一機房,如果有多個離著近的,就隨機選擇),請求簡歷socket流

從datanode獲取數(shù)據(jù)

Client接收數(shù)據(jù)包,先本地緩存,然后寫入目標文件

直到文件讀取完成

3、NameNode機制

通過對HDFS讀寫流程的了解,可以發(fā)現(xiàn)namenode是一個很重要的部分,它記錄著整個HDFS系統(tǒng)的元數(shù)據(jù),這些元數(shù)據(jù)是需要持久化的,要保存到文件中。

Namenode還要承受巨大的訪問量,client讀寫文件時都需要請求namenode,寫文件時要修改元數(shù)據(jù),讀文件時要查詢元數(shù)據(jù)。

為了提高效率,namenode便將元數(shù)據(jù)加載到內存中,每次修改時,直接修改內存,而不是直接修改文件,同時會記錄下操作日志,供后期修改文件時使用。

這樣,namenode對數(shù)據(jù)的管理就涉及到了3種存儲形式:

  1. 內存數(shù)據(jù)
  2. 元數(shù)據(jù)文件
  3. 操作日志文件

namenode需要定期對元數(shù)據(jù)文件和日志文件進行整合,以保證文件中數(shù)據(jù)是新的,但這個過程很消耗性能,namenode需要快速地響應client的大量請求,很難去完成文件整合操作,這時就引入了一個小助手secondnamenode。

secondnamenode會定期從namenode中下載元數(shù)據(jù)文件和操作日志,進行整合,形成新的數(shù)據(jù)文件,然后傳回namenode,并替換掉之前的舊文件。

secondnamenode是namenode的好幫手,替namenode完成了這個重體力活兒,并且還可以作為namenode的一個防災備份,當namenode數(shù)據(jù)丟失時,secondnamenode上有最近一次整理好的數(shù)據(jù)文件,可以傳給namenode進行加載,這樣可以保證最少的數(shù)據(jù)丟失。

 

小結

HDFS的基礎內容介紹完了,希望可以幫助您快速熟悉HDFS的思路和使用方式。

責任編輯:武曉燕 來源: 36大數(shù)據(jù)
相關推薦

2016-03-25 09:59:38

性能調優(yōu)LinuxMySQL

2022-07-14 14:18:59

Kubernetes架構

2022-07-06 08:17:50

C 語言函數(shù)選型

2019-12-13 16:19:15

戴爾

2021-10-11 11:08:33

HDFS快照系統(tǒng)

2022-03-04 08:17:53

PageRank網絡等級

2021-07-08 07:30:13

Webpack 前端Tree shakin

2024-01-09 12:06:55

MVCC并發(fā)控制MySQL

2021-07-29 07:55:20

React實踐代碼

2020-03-13 14:20:02

代碼開發(fā) Rust

2020-08-11 10:40:31

裝飾者模式Java組件

2022-08-01 08:18:58

網絡網絡協(xié)議

2024-05-11 07:56:07

編程語言Java字節(jié)碼

2022-09-20 07:33:15

Jenkinshttps://mp

2022-12-05 08:17:51

FramerMotion動畫

2022-04-19 08:25:14

區(qū)塊鏈

2019-04-08 20:20:37

2021-11-12 07:43:34

版本HDFS工具

2021-09-07 09:20:44

Hadoop數(shù)據(jù)容錯

2024-03-27 18:22:58

Hadoop部件生態(tài)
點贊
收藏

51CTO技術棧公眾號