NameNode:Master主管管理者,管理HDFS的名稱空間、配置副本策略、管理數據塊Block的映射信息、處理客戶端讀寫請求;node
DataNode:Slave,執行NN下達的命令,存儲實際的數據塊、執行數據塊的讀寫操做;瀏覽器
Client:①文件切分,將文件切分紅一個個Block再上傳;②與NameNode交互,獲取文件的位置信息;③與DataNode交互讀取或寫入數據;④Client提供一些命令來管理HDFS,如格式化NameNode;⑤經過一些命令來訪問HDFS,如對HDFS的增刪改查操做;緩存
SecondaryNameNode:輔助NameNode,如按期合併FSimage和Edits並推送給NameNode;②緊急狀況下輔助恢復NameNode;安全
塊:HDFS中的文件在物理上分塊存儲Block,塊的大小可經過配置參數 dfs.blocksize來規定,在Hadoop2.x中默認128M,若是尋址時間約爲10ms(查找目標Block的時間10ms),尋址時間爲傳輸時間的1%最佳,所以傳輸時間=10ms/0.01=1s;目前磁盤的傳輸廣泛在100MB/S;則Block的大小爲1s*100M/S=100M,湊個整數就是128M了。服務器
①客戶端經過Distributed FileSystem向NameNode請求上傳文件,NameNode檢查目標文件是否已存在,父目錄是否存在。網絡
②NameNode返回是否能夠上傳;app
③Client請求第一個Block上傳到哪幾個DataNode服務器上;ide
④NameNode返回3個DataNode節點DN一、DN二、DN3;oop
⑤Client經過FSDataOutputStream模塊請求向DN1發起上傳請求創建通訊通道,DN1-->DN2-->DN3依次串行,DN3-->DN2-->DN1依次應答成功告知Client性能
⑥Client客戶端開始往DN1上傳第一個Block(先從磁盤讀取數據放到一個本地內存緩存),以Packet爲單位,DN1收到一個Packet就會傳給DN2,DN2傳給DN3;DN1每傳一個packet會放入一個應答隊列等待應答。
⑦當一個Block傳輸完成以後,客戶端再次請求NameNode上傳第二個Block的服務器。重複步驟⑤--⑦;
在HDFS寫數據的過程當中,NameNode會選擇距離待上傳數據最近距離的DataNode接收數據。那麼這個最近距離怎麼計算呢?
節點距離:兩個節點到達最近的共同祖先的距離總和。
DN1是最近的,DN2和DN3是根據第一個節點DN1選出來的;
第二次的DN四、DN五、DN6可能跟第一次傳輸的DN同樣,也可能不同取決於內部集羣的情況;兩次返回的DN都是獨立的。
N1與N2之間的距離爲2;(找線條數)
假設N一、N二、N3三臺機器,從N1上傳數據,則最短的節點就是它自己0;
後兩個的選擇是根據機架感知來選:
For the common case, when the replication factor is three, HDFS’s placement policy is to put one replica on one node in the local rack,
another on a different node in the local rack, and the last on a different node in a different rack.
第二個副本和第一個副本位於相同機架,隨機節點;
第三個副本位於不一樣機架的隨機節點;前提都是在相同數據中心的。
串行而不是並行;在於集羣的性能限制,第一是NameNode的內存;第二個限制是IO(網絡IO| 磁盤IO ),串行每一個都是一進一出,而並行所有集中在client上致使傳輸的性能降低;
1)客戶端經過Distributed FileSystem向NameNode請求下載文件,NameNode經過查詢元數據,找到文件塊所在的DataNode地址。給Client響應;
2)Client發起請求下載第一塊Block數據;NameNode返回DN一、DN二、DN3表示用這3個節點存儲的數據;
3)Client挑選一臺DataNode(就近原則,而後隨機)服務器,發起創建通訊通道請求,DN1迴應應答成功;
4 )Client打開一個流FSDataInoutStream 請求讀取數據,DataNode開始傳輸數據給客戶端(從磁盤裏面讀取數據輸入流,以Packet爲單位來作校驗)。
4)客戶端以Packet爲單位接收,先在本地緩存,而後寫入目標文件。
5 )依次重複 2)--4)直到所有下載完成;NameNode響應數據傳輸完畢,流FSDataInputStream關閉;
NameNode的元數據須要存放在內存中,由於常常須要進行隨機訪問還有響應客戶請求,爲了提升效率;
同時在磁盤中備份元數據的FsImage,爲了數據的安全性防止斷電等致使元數據的丟失;
引入Edits文件(只進行追加操做,效率很高),(是爲了解決內存中元數據更新時,若同時更新FsImage致使效率下降;若不更新產生一致性問題一旦NameNode節點斷電致使數據丟失)每當元數據有更新或者添加元數據時,修改內存中的元數據並追加到Edits中。這樣,一旦NameNode節點斷電,能夠經過FsImage和Edits的合併,合成元數據。
引入一個新的節點SecondaryNamenode,專門用於FsImage和Edits的合併。(若是長時間添加數據到Edits中,會致使該文件數據過大,效率下降,並且一旦斷電,恢復元數據須要的時間過長。所以,須要按期進行FsImage和Edits的合併,若是這個操做由NameNode節點完成,又會效率太低。)
這種保存機制相似在Redis的RDB和AOF:
RDB保存的快,讀取的慢;AOF保存的快安全性高,讀取慢;
相似AOF的保存是edits.log(每個對元數據的變更,增刪改查,都會當即持久化到edits.log)
相似RDB的是FSimage,隨着NN的操做,每隔一段時間存一個檔; 啓動的時候先加載這個存檔,而後再加載很短的一段edits.log;
NN是隻寫edits.log這個文件而且負責edits.log和FSimage的合併;
先加載fsimage(存檔),再加載edits.log(過程);
先寫edits,再讀寫到內存(爲了數據的安全性);
edits-inprogress_002這種的都不會刪除,而fsimage是隻保留最新的2份;
Fsimage:NameNode內存中元數據序列化後造成的文件。包含HDFS文件系統的全部目錄和文件inode的序列化信息;是HDFS文件系統元數據的永久性檢查點;
Edits:記錄客戶端更新--增刪改元數據信息的每一步操做。
NameNode啓動時,先滾動Edits並生成一個空的edits.inprogress,而後加載Edits和Fsimage到內存中,此時NameNode內存就持有最新的元數據信息。
第一階段:NameNode啓動
1 )第一次啓動NameNode格式化後,建立Fsimage和Edits文件。若是不是第一次啓動,直接加載編輯日誌eidts_inprogress_001和鏡像文件Fsimage到內存(先加載Fsimage--存檔,再加載edits_inprogress_001;)。
2 )客戶端對元數據進行增刪改的請求。(先記錄在edits_inprogress_001再加載到內存爲了數據的安全性;)
3 )記錄操做日誌edits_inprogress_001和更新滾動日誌;這些請求的操做首先會被記錄到edits.inprogress中(查詢元數據的操做不會被記錄在Edits中,由於查詢操做不會更改元數據信息); 若是此時NameNode掛掉,重啓後會從Edits中讀取元數據的信息。
4 )而後,NameNode會在內存中執行元數據的增刪改的操做。
第二階段:Secondary NameNode工做
1 )Secondary NameNode詢問NameNode是否須要CheckPoint。直接帶回NameNode是否檢查結果。
2 )Secondary NameNode請求執行CheckPoint。
3 )NameNode滾動正在寫的Edits日誌,並生成一個空的edits_inprogress_002,滾動Edits的目的是給Edits打個標記,之後全部新的操做都寫入edits_inprogress_002
4)將滾動前的編輯日誌Edits_001和鏡像文件fsimage 拷貝到Secondary NameNode。
5)加載到內存,併合並。(所謂合併,就是將Edits和Fsimage加載到內存中,照着Edits中的操做一步步執行,最終造成新的Fsimage。)
6)生成新的鏡像文件fsimage.chkpoint。
7)拷貝fsimage.chkpoint到NameNode。
8)NameNode將fsimage.chkpoint從新命名成fsimage,替換掉原來的Fsimage。
[kris@hadoop101 current]$ ll 總用量 7256 -rw-rw-r--. 1 kris kris 1048576 1月 17 17:10 edits_0000000000000000001-0000000000000000001 -rw-rw-r--. 1 kris kris 42 1月 18 11:08 edits_0000000000000000002-0000000000000000003 -rw-rw-r--. 1 kris kris 1048576 1月 18 17:12 edits_0000000000000000004-0000000000000000020 -rw-rw-r--. 1 kris kris 1048576 1月 18 18:27 edits_0000000000000000021-0000000000000000021 -rw-rw-r--. 1 kris kris 42 1月 18 18:29 edits_0000000000000000022-0000000000000000023 -rw-rw-r--. 1 kris kris 3869 1月 18 19:29 edits_0000000000000000024-0000000000000000074 -rw-rw-r--. 1 kris kris 922 1月 18 20:29 edits_0000000000000000075-0000000000000000090 -rw-rw-r--. 1 kris kris 1048576 1月 18 20:37 edits_0000000000000000091-0000000000000000107 -rw-rw-r--. 1 kris kris 42 1月 19 11:28 edits_0000000000000000108-0000000000000000109 -rw-rw-r--. 1 kris kris 42 1月 19 12:28 edits_0000000000000000110-0000000000000000111 -rw-rw-r--. 1 kris kris 42 1月 19 13:28 edits_0000000000000000112-0000000000000000113 -rw-rw-r--. 1 kris kris 1276 1月 19 14:28 edits_0000000000000000114-0000000000000000127 -rw-rw-r--. 1 kris kris 42 1月 19 15:28 edits_0000000000000000128-0000000000000000129 -rw-rw-r--. 1 kris kris 42 1月 19 16:28 edits_0000000000000000130-0000000000000000131 -rw-rw-r--. 1 kris kris 1048576 1月 19 16:28 edits_0000000000000000132-0000000000000000132 -rw-rw-r--. 1 kris kris 1048576 1月 19 20:45 edits_0000000000000000133-0000000000000000133 -rw-rw-r--. 1 kris kris 14290 1月 20 12:24 edits_0000000000000000134-0000000000000000254 -rw-rw-r--. 1 kris kris 42 1月 20 13:24 edits_0000000000000000255-0000000000000000256 -rw-rw-r--. 1 kris kris 42 1月 20 14:24 edits_0000000000000000257-0000000000000000258 -rw-rw-r--. 1 kris kris 1048576 1月 20 14:24 edits_inprogress_0000000000000000259 -rw-rw-r--. 1 kris kris 2465 1月 20 13:24 fsimage_0000000000000000256 -rw-rw-r--. 1 kris kris 62 1月 20 13:24 fsimage_0000000000000000256.md5 -rw-rw-r--. 1 kris kris 2465 1月 20 14:24 fsimage_0000000000000000258 -rw-rw-r--. 1 kris kris 62 1月 20 14:24 fsimage_0000000000000000258.md5 -rw-rw-r--. 1 kris kris 4 1月 20 14:24 seen_txid -rw-rw-r--. 1 kris kris 206 1月 20 11:36 VERSION [kris@hadoop101 current]$ [kris@hadoop101 current]$ cat seen_txid //文件保存的是一個數字,就是最後一個edit_數字 259 [kris@hadoop101 current]$ hdfs oiv -p XML -i fsimage_0000000000000000258 -o /opt/module/hadoop-2.7.2/fsimage.xml [kris@hadoop101 current]$ sz /opt/module/hadoop-2.7.2/fsimage.xml
能夠看出,Fsimage中沒有記錄塊所對應DataNode
在集羣啓動後,要求DataNode上報數據塊信息,並間隔一段時間後再次上報。
[kris@hadoop101 current]$ hdfs oev -p XML -i edits_0000000000000000257-0000000000000000258 -o /opt/module/hadoop-2.7.2/edits.xml
[kris@hadoop101 current]$ sz /opt/module/hadoop-2.7.2/edits.xml
NameNode如何肯定下次開機啓動的時候合併哪些Edits
1)一般狀況下,SecondaryNameNode每隔一小時執行一次。
2)一分鐘檢查一次操做次數;
3 )當操做次數達到1百萬時,SecondaryNameNode執行一次。
方法一
將SecondaryNameNode中數據拷貝到NameNode存儲數據的目錄; 這樣作有隱患,會使得數據有丟失,2NN有一部分數據還沒合併(沒到合併觸發機制) [kris@hadoop103 dfs]$ ll 總用量 8 drwx------. 3 kris kris 4096 1月 20 11:37 data drwxrwxr-x. 3 kris kris 4096 1月 20 11:37 namesecondary [kris@hadoop103 dfs]$ scp -r namesecondary hadoop101:/opt/module/hadoop-2.7.2/data/tmp/dfs [kris@hadoop101 dfs]$ ll 總用量 8 drwx------. 2 kris kris 4096 1月 20 15:51 data drwxrwxr-x. 3 kris kris 4096 1月 20 15:52 namesecondary [kris@hadoop101 dfs]$ mv namesecondary/ name [kris@hadoop101 dfs]$ ll 總用量 8 drwx------. 2 kris kris 4096 1月 20 15:51 data drwxrwxr-x. 3 kris kris 4096 1月 20 15:52 name kris@hadoop101 dfs]$ start-dfs.sh Starting namenodes on [hadoop101] hadoop101: starting namenode, logging to /opt/module/hadoop-2.7.2/logs/hadoop-kris-namenode-hadoop101.out
bin/hadoop fs 具體命令 OR bin/hdfs dfs 具體命令 dfs是fs的實現類。 bin/hadoop fs 可獲得全部的命令 可直接建立並寫入文件;ctrl+c結束;>>是追加 [kris@hadoop101 ~]$ cat >> 1 a f d >是把以前的覆蓋掉了 [kris@hadoop101 ~]$ cat > 1 2 3 4
方法二
1.修改hdfs-site.xml中的 <property> <name>dfs.namenode.checkpoint.period</name> <value>120</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>/opt/module/hadoop-2.7.2/data/tmp/dfs/name</value> </property> 2.kill -9 NameNode進程 [kris@hadoop101 hadoop]$ kill -9 5553 3. 刪除NameNode存儲的數據(/opt/module/hadoop-2.7.2/data/tmp/dfs/name) rm -rf /opt/module/hadoop-2.7.2/data/tmp/dfs/name/* 4. 若是SecondaryNameNode不和NameNode在一個主機節點上,須要將SecondaryNameNode存儲數據的目錄拷貝到NameNode存儲數據的平級目錄,並刪除in_use.lock文件 [kris@hadoop103 dfs]$ scp -r namesecondary hadoop101:/opt/module/hadoop-2.7.2/data/tmp/dfs [kris@hadoop101 namesecondary]$ rm -rf in_use.lock [atguigu@hadoop101 dfs]$ pwd /opt/module/hadoop-2.7.2/data/tmp/dfs [atguigu@hadoop101 dfs]$ ls data name namesecondary [kris@hadoop101 hadoop-2.7.2]$ hdfs namenode -importCheckpoint [kris@hadoop101 hadoop-2.7.2]$ hadoop-daemon.sh start namenode starting namenode, logging to /opt/module/hadoop-2.7.2/logs/hadoop-kris-namenode-hadoop101.out
集羣處於安全模式,不能執行重要操做(寫操做)。集羣啓動完成後,自動退出安全模式。 (1)bin/hdfs dfsadmin -safemode get (功能描述:查看安全模式狀態) (2)bin/hdfs dfsadmin -safemode enter (功能描述:進入安全模式狀態) (3)bin/hdfs dfsadmin -safemode leave (功能描述:離開安全模式狀態) (4)bin/hdfs dfsadmin -safemode wait (功能描述:等待安全模式狀態)
工做機制
1)一個數據塊在DataNode上以文件形式存儲在磁盤上,包括兩個文件,一個是數據自己,一個是數據塊的元數據包括數據塊的長度,塊數據的校驗和,以及時間戳。
2)DataNode啓動後向NameNode註冊(拜山頭)來獲取集羣的ID,經過後,週期性(1小時)的向NameNode上報全部的塊信息。首次上報是集羣剛剛啓動時安全模式下;塊所在位置的信息並不禁NameNode來維護,由於要求塊的信息是動態(週期性的彙報)的而不能是靜態的,這也是觸發自動備份機制的條件。
3)心跳是每3秒一次,心跳返回結果帶有NameNode給該DataNode的命令如複製塊數據到另外一臺機器,或刪除某個數據塊。若是超過10分鐘沒有收到某個DataNode的心跳,則認爲該節點不可用。
4)集羣運行中能夠安全加入和退出一些機器。
校驗和(crc 、md五、sha1)用小的數據段來表示長的數據段的特徵
DataNode節點保證數據完整性的方法。
1)當DataNode讀取Block的時候,它會計算CheckSum。
2)若是計算後的CheckSum,與Block建立時值不同,說明Block已經損壞。
3)Client讀取其餘DataNode上的Block。
4)DataNode在其文件建立後周期驗證CheckSum
須要注意的是hdfs-site.xml 配置文件中的heartbeat.recheck.interval的單位爲毫秒,dfs.heartbeat.interval的單位爲秒。
環境準備
(1)在hadoop103主機上再克隆一臺hadoop104主機
(2)修改IP地址和主機名稱
(3)刪除原來HDFS文件系統留存的文件(/opt/module/hadoop-2.7.2/data和log)
(4)source一下配置文件
[kris@hadoop104 hadoop-2.7.2]$ source /etc/profile
服役新節點具體步驟 (1)直接啓動DataNode,便可關聯到集羣 [kris@hadoop104 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start datanode [atguigu@hadoop104 hadoop-2.7.2]$ sbin/yarn-daemon.sh start nodemanager
添加到白名單的主機節點,都容許訪問NameNode,不在白名單的主機節點,都會被退出。
配置白名單的具體步驟以下:
1)在NameNode的/opt/module/hadoop-2.7.2/etc/hadoop目錄下建立dfs.hosts文件
[kris@hadoop101 hadoop]$ pwd /opt/module/hadoop-2.7.2/etc/hadoop [kris@hadoop101 hadoop]$ touch dfs.hosts [kris@hadoop101 hadoop]$ vi dfs.hosts #添加以下主機名稱(不添加hadoop104) hadoop101 hadoop102 hadoop103
2)在NameNode的hdfs-site.xml配置文件中增長dfs.hosts屬性
<property> <name>dfs.hosts</name> <value>/opt/module/hadoop-2.7.2/etc/hadoop/dfs.hosts</value> </property>
3)配置文件分發
[kris@hadoop101 hadoop]$ xsync hdfs-site.xml
4)刷新NameNode
[kris@hadoop101 hadoop]$ hdfs dfsadmin -refreshNodes Refresh nodes successful 5)更新ResourceManager節點 [kris@hadoop101 hadoop]$ yarn rmadmin -refreshNodes 19/01/20 20:29:10 INFO client.RMProxy: Connecting to ResourceManager at hadoop102/192.168.1.102:8033 若是數據不均衡,能夠用命令實現集羣的再平衡 [kris@hadoop101 sbin]$ ./start-balancer.sh starting balancer, logging to /opt/module/hadoop-2.7.2/logs/hadoop-atguigu-balancer-hadoop102.out Time Stamp Iteration# Bytes Already Moved Bytes Left To Move Bytes Being Moved
黑名單退役
在黑名單上面的主機都會被強制退出。
1.在NameNode的/opt/module/hadoop-2.7.2/etc/hadoop目錄下建立dfs.hosts.exclude文件
[kris@hadoop101 hadoop]$ touch dfs.hosts.exclude [kris@hadoop101 hadoop]$ vi dfs.hosts.exclude
添加以下主機名稱(要退役的節點)
hadoop105
2.在NameNode的hdfs-site.xml配置文件中增長dfs.hosts.exclude屬性
<property> <name>dfs.hosts.exclude</name> <value>/opt/module/hadoop-2.7.2/etc/hadoop/dfs.hosts.exclude</value> </property>
3.刷新NameNode、刷新ResourceManager
[kris@hadoop101 hadoop-2.7.2]$ hdfs dfsadmin -refreshNodes Refresh nodes successful [kris@hadoop101 hadoop-2.7.2]$ yarn rmadmin -refreshNodes 17/06/24 14:55:56 INFO client.RMProxy: Connecting to ResourceManager at hadoop102/192.168.1.103:8033
4. 檢查Web瀏覽器,退役節點的狀態爲decommission in progress(退役中),說明數據節點正在複製塊到其餘節點,如圖
5. 等待退役節點狀態爲decommissioned(全部塊已經複製完成),中止該節點及節點資源管理器。注意:若是副本數是3,服役的節點小於等於3,是不能退役成功的,須要修改副本數後才能退役。
[kris@hadoop105 hadoop-2.7.2]$ sbin/hadoop-daemon.sh stop datanode stopping datanode [kris@hadoop105 hadoop-2.7.2]$ sbin/yarn-daemon.sh stop nodemanager stopping nodemanager
6. 若是數據不均衡,能夠用命令實現集羣的再平衡
[kris@hadoop102 hadoop-2.7.2]$ sbin/start-balancer.sh starting balancer, logging to /opt/module/hadoop-2.7.2/logs/hadoop-atguigu-balancer-hadoop102.out Time Stamp Iteration# Bytes Already Moved Bytes Left To Move Bytes Being Moved
注意:不容許白名單和黑名單中同時出現同一個主機名稱。
[kris@hadoop101 hadoop-2.7.2]$ hadoop fs -ls / Found 3 items -rw-r--r-- 3 kris supergroup 6 2019-01-18 17:09 /t1.txt -rw-r--r-- 3 kris supergroup 6 2019-01-18 17:12 /t2.txt drwxr-xr-x - kris supergroup 0 2019-01-18 17:05 /test hadoop fs -mkdir -p /sanguo/shuguo -p能夠建立多級目錄,不加-p只能建立單級 從本地到遠程 剪切 [kris@hadoop101 hadoop-2.7.2]$ hadoop fs -moveFromLocal localTest/1.txt /test 複製 [kris@hadoop101 hadoop-2.7.2]$ hadoop fs -copyFromLocal localTest/2.txt /test hadoop fs -put jpsall /test 追加 [kris@hadoop101 hadoop-2.7.2]$ hadoop fs -appendToFile localTest/2.txt /test/1.txt 查看 [kris@hadoop101 hadoop-2.7.2]$ hadoop fs -cat /test/1.txt
從遠程到本地 複製 從HDFS拷貝到本地
[kris@hadoop101 hadoop-2.7.2]$ hadoop fs -copyToLocal /test/1.txt ./ <==等效==> hadoop fs -get /t1.txt ./localTest [kris@hadoop101 hadoop-2.7.2]$ ll 總用量 72 -rw-r--r--. 1 kris kris 61 1月 18 19:00 1.txt 複製 從HDFS的一個路徑拷貝到HDFS的另外一個路徑 [kris@hadoop101 hadoop-2.7.2]$ hadoop fs -cp /test/1.txt / 移動 在HDFS目錄中移動文件 [kris@hadoop101 hadoop-2.7.2]$ hadoop fs -mv /test/2.txt / 獲取併合並 [kris@hadoop101 hadoop-2.7.2]$ ll -rw-r--r--. 1 kris kris 61 1月 18 19:00 1.txt [kris@hadoop101 hadoop-2.7.2]$ hadoop fs -getmerge /test/* ./1.txt ###不能合併到一個目錄文件夾 [kris@hadoop101 hadoop-2.7.2]$ ll -rw-r--r--. 1 kris kris 96 1月 18 19:14 1.txt
查看尾部 [kris@hadoop101 hadoop-2.7.2]$ hadoop fs -tail /test/jpsall rmdir:刪除空目錄 hadoop fs -rmdir /test 刪除文件夾 [kris@hadoop101 hadoop-2.7.2]$ hadoop fs -rm /test/1.txt 19/01/18 19:22:53 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 0 minutes, Emptier interval = 0 minutes. Deleted /test/1.txt 遞歸刪除 [kris@hadoop101 hadoop-2.7.2]$ hadoop fs -rm -r /bigdata 19/01/18 19:27:26 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 0 minutes, Emptier interval = 0 minutes. Deleted /bigdata du統計文件夾的大小信息 [kris@hadoop101 hadoop-2.7.2]$ hadoop fs -du -s -h /test 35 /test [kris@hadoop101 hadoop-2.7.2]$ hadoop fs -du -h /test 29 /test/2.txt 6 /test/t1.txt 設置HDFS中文件的副本數量 [kris@hadoop101 hadoop-2.7.2]$ hadoop fs -setrep 10 /1.txt Replication 10 set: /1.txt
-chgrp 、-chmod、-chown:Linux文件系統中的用法同樣,修改文件所屬權限
[kris@hadoop101 hadoop-2.7.2]$ sudo yum install -y lrzsz
sz 是下載到本地; rz -E是從本地上傳文件