目錄html
參考資料:java
HDFS Namenode啓動過程linux
一、概念介紹:
Edits文件:NameNode在本地操做hdfs系統的文件都會保存在Edits日誌文件中。也就是說當文件系統中的任何元數據產生操做時,都會記錄在Edits日誌文件中。eg:在HDFS上建立一個文件,NameNode就會在Edits中插入一條記錄。一樣若是修改或者刪除等操做,也會在Edits日誌文件中新增一條數據。
FsImage映像文件:包括數據塊到文件的映射,文件的屬性等等,都存儲在一個稱爲FsImage的文件中,這個文件也是放在NameNode所在的文件系統中。web二、流程介紹:
①、加載fsimage映像文件到內存
②、加載edits文件到內存
③、在內存將fsimage映像文件和edits文件進行合併
④、將合併後的文件寫入到fsimage中
⑤、清空原先edits中的數據,使用一個空的edits文件進行正常操做shell三、流程圖分析:
四、疑問
由於NameNode只有在啓動的階段才合併fsimage和edits,那麼若是運行時間長了,edits文件可能會愈來愈大,在下一次啓動NameNode時會花很長的時間,請問可否讓fsimage映像文件和edits日誌文件按期合併呢?
答案確定是能夠的,爲了解決這個問題咱們就要用到Secondary NameNode了,Secondary NameNode主要的做用是什麼呢?他是如何將fsimage和edits進行合併的呢?帶着疑問再次進行分析。apache2、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
來源:簡書
簡書著做權歸做者全部,任何形式的轉載都請聯繫做者得到受權並註明出處。
下圖描述了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數據 |
對四臺機器都作下面的步驟
先安裝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/bin
和hadoop-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的設計支持在集羣中存在多個NameNode,且支持水平擴展。
修改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>
掛載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每秒。
監控下網絡流量狀況
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/秒