HDFS部署測試記錄(2019/05)

HDFS部署測試記錄

參考資料:java

0、HDFS基礎知識

一、基本組成結構與文件訪問過程

二、NameNode啓動時如何維護元數據

一、概念介紹:
Edits文件:NameNode在本地操做hdfs系統的文件都會保存在Edits日誌文件中。也就是說當文件系統中的任何元數據產生操做時,都會記錄在Edits日誌文件中。eg:在HDFS上建立一個文件,NameNode就會在Edits中插入一條記錄。一樣若是修改或者刪除等操做,也會在Edits日誌文件中新增一條數據。
FsImage映像文件:包括數據塊到文件的映射,文件的屬性等等,都存儲在一個稱爲FsImage的文件中,這個文件也是放在NameNode所在的文件系統中。web

二、流程介紹:

①、加載fsimage映像文件到內存
②、加載edits文件到內存
③、在內存將fsimage映像文件和edits文件進行合併
④、將合併後的文件寫入到fsimage中
⑤、清空原先edits中的數據,使用一個空的edits文件進行正常操做shell

三、流程圖分析:

img

四、疑問

由於NameNode只有在啓動的階段才合併fsimage和edits,那麼若是運行時間長了,edits文件可能會愈來愈大,在下一次啓動NameNode時會花很長的時間,請問可否讓fsimage映像文件和edits日誌文件按期合併呢?
答案確定是能夠的,爲了解決這個問題咱們就要用到Secondary NameNode了,Secondary NameNode主要的做用是什麼呢?他是如何將fsimage和edits進行合併的呢?帶着疑問再次進行分析。apache

2、Secondary NameNode工做流程:vim

一、Secondary NameNode和NameNode的區別:安全

NameNode:
①、存儲文件的metadata,運行時全部數據都保存在內存中,這個的HDFS可存儲的文件受限於NameNode的內存。
②、NameNode失效則整個HDFS都失效了,因此要保證NameNode的可用性。
Secondary NameNode:
①、定時與NameNode進行同步,按期的將fsimage映像文件和Edits日誌文件進行合併,並將合併後的傳入給NameNode,替換其鏡像,並清空編輯日誌。若是NameNode失效,須要手動的將其設置成主機。
②、Secondary NameNode保存最新檢查點的目錄和NameNode的目錄結構相同。因此NameNode能夠在須要的時候應用Secondary NameNode上的檢查點鏡像。bash

二、何時checkpoint
①、連續兩次的檢查點最大時間間隔,默認是3600秒,能夠經過配置「fs.checkpoint.period」進行修改
②、Edits日誌文件的最大值,若是超過這個值就會進行合併即便不到1小時也會進行合併。能夠經過「fs.checkpoint.size」來配置,默認是64M;

三、Secondary NameNode的工做流程
①、NameNode通知Secondary NameNode進行checkpoint。
②、Secondary NameNode通知NameNode切換edits日誌文件,使用一個空的。
③、Secondary NameNode經過Http獲取NmaeNode上的fsimage映像文件(只在第一次的時候)和切換前的edits日誌文件。
④、Secondary NameNode在內容中合併fsimage和Edits文件。
⑤、Secondary NameNode將合併以後的fsimage文件發送給NameNode。
⑥、NameNode用Secondary NameNode 傳來的fsImage文件替換原先的fsImage文件。
四、流程圖分析:

做者:0aaadcfeb361

連接:https://www.jianshu.com/p/f01e3626fbf9

來源:簡書

簡書著做權歸做者全部,任何形式的轉載都請聯繫做者得到受權並註明出處。

三、HDFS文件上傳流程

原文連接

下圖描述了Client向HDFS上傳一個200M大小的日誌文件的大體過程:

1)首先,Client發起文件上傳請求,即經過RPC與NameNode創建通信。

2)NameNode與各DataNode使用心跳機制來獲取DataNode信息。NameNode收到Client請求後,獲取DataNode信息,並將可存儲文件的節點信息返回給Client。

3)Client收到NameNode返回的信息,與對應的DataNode節點取得聯繫,並向該節點寫文件,寫入文件被切分紅128m大小的數據塊,最後一塊可能不夠128m,一個數據塊裏不能同時存儲2個以上文件的數據。

4)文件寫入到DataNode後,以流水線的方式複製到其餘DataNode(以3份冗餘爲例,數據塊副本策略爲:第一個塊寫入最近的機架上的一臺服務器,第二個塊由第一個塊複製到同一個機架上的另外一臺主機上,最後一個副本被第二個副本主機複製到不一樣機架的不一樣主機上),至於複製多少份,與所配置的hdfs-default.xml中的dfs.replication相關。

一、系統環境

硬件準備以下:

兩臺臺式機、兩臺筆記本

操做系統:CentOS 7 1810版本

一、安裝大體記錄:

一、安裝操做系統,每臺機器預留一個盤未使用。安裝的時候選擇基本服務器,選中安裝Java環境。

二、設置靜態IP

nmtui --> Edit Connect --> p8p1 --> Manual --> 設置靜態IP
          編輯鏈接          網卡設備   手動        IP地址
# 設置成功後須要從新啓動網絡服務
systemctl restart network
ip a #查看是否有效

三、配置Master免密碼SSH登陸Slave

首先,在Master主機上,使用ssh-keygen命令生成rsa公私鑰對文件:

> ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hdfs/.ssh/id_rsa): 
Created directory '/home/hdfs/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/hdfs/.ssh/id_rsa.
Your public key has been saved in /home/hdfs/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:DhiGxXsKCgLB8neD6O8kITIB51rBnnE/N7vgkwelxLQ hdfs@hdfs.0
The key's randomart image is:
+---[RSA 2048]----+
|+oo..            |
|++o+o .          |
|+o+=o* .         |
|o+*.+oE +        |
|Bo.o.=.*So       |
|oo... +o.        |
|  .... +..       |
|   o. + o        |
|   ..  o         |
+----[SHA256]-----+

而後將使用ssh-copy-id命令將公鑰ID發送到三臺Slave主機上:

> ssh-copy-id 192.168.0.31
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/hdfs/.ssh/id_rsa.pub"
The authenticity of host '192.168.0.31 (192.168.0.31)' can't be established.
ECDSA key fingerprint is SHA256:aALaCB/ir5BTIA2EUWyN1jRmLSRcnDs2ffr3Jo5+niw.
ECDSA key fingerprint is MD5:3d:b6:ba:a8:e2:56:0f:93:31:9b:66:61:98:c9:fb:e2.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
hdfs@192.168.0.31's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '192.168.0.31'"
and check to make sure that only the key(s) you wanted were added.


/home/hdfs [hdfs@hdfs] [14:25]
> ssh-copy-id 192.168.0.32

/home/hdfs [hdfs@hdfs] [14:25]
> ssh-copy-id 192.168.0.33

完成上述操做以後,在Master主機上就能夠無需密碼登陸三臺Slave主機了。

二、磁盤分區

安裝好系統後,對未使用的磁盤進行分區,可使用parted命令進行:

sudo parted 
GNU Parted 3.1
使用 /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
# 輸入help查看命令列表
(parted) help                                                             
  align-check TYPE N                        check partition N for TYPE(min|opt) alignment
  help [COMMAND]                           print general help, or help on COMMAND
  mklabel,mktable LABEL-TYPE               create a new disklabel (partition table)
  mkpart PART-TYPE [FS-TYPE] START END     make a partition
  name NUMBER NAME                         name partition NUMBER as NAME
  print [devices|free|list,all|NUMBER]     display the partition table, available devices, free space, all found partitions, or a particular partition
  quit                                     exit program
  rescue START END                         rescue a lost partition near START and END
  
  resizepart NUMBER END                    resize partition NUMBER
  rm NUMBER                                delete partition NUMBER
  select DEVICE                            choose the device to edit
  disk_set FLAG STATE                      change the FLAG on selected device
  disk_toggle [FLAG]                       toggle the state of FLAG on selected device
  set NUMBER FLAG STATE                    change the FLAG on partition NUMBER
  toggle [NUMBER [FLAG]]                   toggle the state of FLAG on partition NUMBER
  unit UNIT                                set the default unit to UNIT
  version                                  display the version number and copyright information of GNU Parted
# 打印輸出當前磁盤分區情況。可以使用select命令選擇當前磁盤
(parted) print list
Model: ATA ST1000DM003-1ER1 (scsi)
Disk /dev/sda: 1000GB
Sector size (logical/physical): 512B/4096B
Partition Table: msdos
Disk Flags: 

Number  Start   End    Size    Type     File system     標誌
 1      1049kB  107GB  107GB   primary  xfs             啓動
 2      107GB   116GB  8590MB  primary  linux-swap(v1)
# 使用mkpart命令建立分區,建立分區後須要進行格式化
 (parted) mkpart                                                           
分區類型?  primary/主分區/extended/擴展分區? primary                     
文件系統類型?  [ext2]? ext4                                              
起始點? 116G                                                              
結束點? 1000G
# 再次查看
(parted) print list                                                     
Model: ATA ST1000DM003-1ER1 (scsi)
Disk /dev/sda: 1000GB
Sector size (logical/physical): 512B/4096B
Partition Table: msdos
Disk Flags: 

Number  Start   End     Size    Type     File system     標誌
 1      1049kB  107GB   107GB   primary  xfs             啓動
 2      107GB   116GB   8590MB  primary  linux-swap(v1)
 3      116GB   1000GB  884GB   primary

建立分區以後進行格式化

sudo mkfs --type=ext4 /dev/sda3
mke2fs 1.42.9 (28-Dec-2013)
文件系統標籤=
OS type: Linux
塊大小=4096 (log=2)
分塊大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
53977088 inodes, 215878656 blocks
10793932 blocks (5.00%) reserved for the super user
第一個數據塊=0
Maximum filesystem blocks=2363490304
6589 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
    4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
    102400000, 214990848

Allocating group tables: 完成                            
正在寫入inode表: 完成                            
Creating journal (32768 blocks): 完成
Writing superblocks and filesystem accounting information: 完成

使用lsblk命令查看分區的UUID

> lsblk -f                 
NAME   FSTYPE LABEL UUID                                 MOUNTPOINT
sda                                                      
├─sda1 xfs    root  96b41d6f-ec6b-4f99-bafc-928f7e1a6ff3 /
├─sda2 swap         305435df-f273-42e0-84c0-75ee168dd73d [SWAP]
└─sda3 ext4         fad60377-af57-4bb0-b192-71c14996c051 
sr0

添加掛載信息到/etc/fstab文件中,而後執行mount -a掛載。

三、配置好的機器狀況

IP 主機 磁盤情況
192.168.0.30 hdfs0(Namenode/Master) 128G-SSD系統,500G-HDD數據
192.168.0.31 hdfs1(DataNode/Slave1) 1T-HDD(100G系統,900G 數據)
192.168.0.32 hdfs2(DataNode/Slave2) 120G-SSD系統,1T-HDD數據
192.168.0.33 hdfs3(DataNode/Slave3) 128G-SSD系統,1T-HDD數據

二、安裝HDFS

對四臺機器都作下面的步驟

先安裝java(Hadoop 3.1.2必須是安裝1.8.0版本JDK)基礎運行環境:

sudo yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel java-1.8.0-openjdk-headless java-1.8.0-openjdk-javadoc java-1.8.0-openjdk-accessibility

而後添加JAVA_HOME環境變量,這裏修改/etc/profile文件來添加:

vim /etc/profile
# 在最後面添加
JAVA_HOME=/usr
export JAVA_HOME
export PATH=$PATH:/home/hdfs/hadoop-3.1.2/bin:/home/hdfs/hadoop-3.1.2/sbin

下載Hadoop包,這裏直接下載編譯好的二進制文件:

wget http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-3.1.2/hadoop-3.1.2.tar.gz

下載完成以後直接解壓:

tar -xzvf hadoop-3.1.2.tar.gz

解壓以後能夠進入hadoop-3.1.2/binhadoop-3.1.2/sbin(須要把這兩個路徑導入環境變量PATH中,也是在/etc/profile文件中添加export語句)運行一下里面的程序,若是能正常運行的話就沒有問題了。

> export PATH=$PATH:/home/hdfs/hadoop-3.1.2/bin:/home/hdfs/hadoop-3.1.2/sbin
> hdfs 
Usage: hdfs [OPTIONS] SUBCOMMAND [SUBCOMMAND OPTIONS]

  OPTIONS is none or any of:

--buildpaths                       attempt to add class files from build tree
--config dir                       Hadoop config directory
--daemon (start|status|stop)       operate on a daemon
--debug                            turn on shell script debug mode
--help                             usage information
--hostnames list[,of,host,names]   hosts to use in worker mode
--hosts filename                   list of hosts to use in worker mode
--loglevel level                   set the log4j level for this command
--workers                          turn on worker mode

  SUBCOMMAND is one of:


    Admin Commands:
........

三、配置HDFS

當前HDFS的設計支持在集羣中存在多個NameNode,且支持水平擴展。

HDFS Federation Architecture

修改NameNode機器上的/home/hdfs/hadoop-3.1.2/etc/hadoop/目錄下的core-site.xml文件,修改後大體以下:

<configuration>
<property>
  <name>fs.defaultFS</name>
  <value>hdfs://192.168.0.30:9000</value>
  <description>NameNode主機的 HDFS的URI,hdfs://namenode_ip:port</description>
</property>

<property>
  <name>hadoop.tmp.dir</name>
  <value>/home/hdfs/tmp</value>
  <description>namenode 上傳到 hadoop 的臨時文件夾</description>
</property>

<property>
    <name>fs.trash.interval</name>
    <value>4320</value>
</property>
</configuration>

修改NameNode機器上的/home/hdfs/hadoop-3.1.2/etc/hadoop/目錄下的hdfs-site.xml文件,修改後大體以下:

<configuration>
<property>
   <name>dfs.namenode.name.dir</name>
   <value>/home/hdfs/name</value>
   <description>DataNode上存儲 hdfs 名字空間元數據的目錄</description>
 </property>
 
 <property>
   <name>dfs.datanode.data.dir</name>
   <value>/home/hdfs/data</value>
   <description>DataNode上數據塊的存儲位置</description>
 </property>
 
 <property>
   <name>dfs.replication</name>
   <value>2</value>
   <description>副本個數,默認配置是 3,應小於datanode機器數量</description>
 </property>
 
 <property>
   <name>dfs.webhdfs.enabled</name>
   <value>true</value>
 </property>
 
 <property>
   <name>dfs.permissions.superusergroup</name>
   <value>staff</value>
 </property>
 
 <property>
   <name>dfs.permissions.enabled</name>
   <value>false</value>
 </property>
</configuration>

修改完成以後,拷貝這兩個文件覆蓋DataNode主機下面的同名文件。

在NameNode機器上的/home/hdfs/hadoop-3.1.2/etc/hadoop/目錄下添加slaves文件,逐行寫入DataNode主機的IP。

vim slaves
192.168.0.31
192.168.0.32
192.168.0.33

在NameNode節點上執行下面命令進行HDFS格式化操做,執行操做後會在配置文件指定的相關目錄下生成相關的文件。

hdfs namenode -format

而後執行start-dfs.sh啓動HDFS服務。

遇到的錯誤及處理

錯誤:Error: JAVA_HOME is not set and could not be found.

打開/home/hdfs/hadoop-3.1.2/etc/hadoop/hadoop-env.sh文件,添加export JAVA_HOME=/usr(根據實際狀況修改路徑)。

錯誤:ERROR: Cannot set priority of datanode process

權限緣由,這裏是由於指定的data目錄擁有者不是當前運行hdfs的用戶,因此直接執行sudo chown hdfs:hdfs /home/hdfs/data修改便可。

(這裏是由於默認掛載磁盤的是root用戶)

錯誤:Unresolved datanode registration: hostname cannot be resolved (ip=192.168.0.33, hostname=192.168.0.33)

這個須要在NameNode主機上修改/etc/hosts文件,添加幾個DataNode主機名。(這個錯誤是在NameNode主機執行hdfs namenode,DataNode主機執行hdfs datanode出現的,由於直接執行start-dfs.sh不出現錯誤提示,也沒有成功啓動,這個問題還有待研究)

192.168.0.31 hdfs1
192.168.0.32 hdfs2
192.168.0.33 hdfs3

錯誤:沒法在NameNode以外的主機訪問http://namenodeip:50070地址。

這個是由於在服務綁定的是本地環回地址,而不是對外網絡地址。這裏修改NameNode主機上的hdfs-site.xml文件,在裏面添加以下設置便可:

<property>
  <name>dfs.http.address</name>
  <value>0.0.0.0:50070</value>
</property>

完成配置後,對HDFS系統概覽

HDFSWeb概覽

hdfs數據節點預覽

四、讀寫文件測試

掛載window共享目錄

sudo mount -t cifs -o username=Administrator -o password=xxxxxxxxx //192.168.0.46/d /mnt/46

在要操做HDFS的機器上,必需要可以經過主機名訪問對應的DataNode節點,因此須要將DataNode節點的名稱和IP映射寫入Hosts文件(或者可使用一個本地的域名服務器,並在上添加相應的記錄)。

上傳一個目錄到HDFS上:

> time hadoop fs -put /mnt/46/src_data/xx512/* /rsimage/xx-512   
hadoop fs -put /mnt/46/src_data/xx512/* /rsimage/xx-512 456.41s user 467.21s system 31% cpu 49:12.57 total

上傳的目錄上有271GB大小的文件,這裏的速度差很少是94MB每秒。

監控下網絡流量狀況

1557897728833

dd命令測試讀取速度(在非DataNode節點測試)

dd bs=64k if=/mnt/hdfs/rsimage/xx-512/xxxx.img of=/dev/null
記錄了24421+1 的讀入
記錄了24421+1 的寫出
1600485903字節(1.6 GB)已複製,14.9559 秒,107 MB/秒
#-----------------省略多餘的分割線----------------
dd bs=64k if=/mnt/46/src_data/xx/xxxx.img of=/dev/null
記錄了23952+1 的讀入
記錄了23952+1 的寫出
1569778398字節(1.6 GB)已複製,13.4775 秒,116 MB/秒
#-----------------省略多餘的分割線----------------
dd bs=64k if=/mnt/46/src_data/xx/xxxx.img of=/dev/null
記錄了23952+1 的讀入
記錄了23952+1 的寫出
1569778398字節(1.6 GB)已複製,13.343 秒,118 MB/秒
#-----------------省略多餘的分割線----------------
dd bs=64k if=/mnt/hdfs/rsimage/xx-512/xxxx.img of=/dev/null
記錄了24421+1 的讀入
記錄了24421+1 的寫出
1600485903字節(1.6 GB)已複製,13.7455 秒,116 MB/秒

在某個DataNode節點測試

/home/hdfs/test/caddy [hdfs@hdfs] [14:01]
> dd bs=64k if=/mnt/46/src_data/xx/xxxx.img of=/dev/null
記錄了23952+1 的讀入
記錄了23952+1 的寫出
1569778398字節(1.6 GB)已複製,13.45 秒,117 MB/秒

/home/hdfs/test/caddy [hdfs@hdfs] [14:02]
> dd bs=64k if=/mnt/hdfs/rsimage/xx-512/xxxx.img of=/dev/null
記錄了24421+1 的讀入
記錄了24421+1 的寫出
1600485903字節(1.6 GB)已複製,9.56565 秒,167 MB/秒
相關文章
相關標籤/搜索