Hadoop的搭建及節點管理

大數據與Hadoop

  • hadoop是一種分析和處理海量數據的軟件平臺
  • hadoop是一款開源軟件,使用JAVA開發
  • hadoop可以提供一個分佈式基礎架構

Hadoop特點

  • 高可靠性,高擴展性,高效性,高容錯性,低成本

Hadoop的核心組件

  • HDFS: hadoop分佈式文件系統
  • Mapreduce: 分佈式計算框架
  • Yarn: 集羣資源管理系統
    在這裏插入圖片描述
    在這裏插入圖片描述

Hadoop模式

  • 單機
  • 僞分佈式
  • 完全分佈式

部署Hadoop單機版

[root@ecs-hadoop1 ~]# yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel
[root@ecs-hadoop1 ~]# tar -zxvf hadoop-2.7.7.tar.gz 
[root@ecs-hadoop1 ~]# mv hadoop-2.7.7 /usr/local/hadoop
修改hadoop的運行腳本文件指定java_home安裝目錄
[root@ecs-hadoop1 ~]# rpm -ql  java-1.8.0-openjdk  #列出軟件包安裝路徑
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64/jre/bin/policytool
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64/jre/lib/amd64/libawt_xawt.so
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64/jre/lib/amd64/libjawt.so
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64/jre/lib/amd64/libjsoundalsa.so
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64/jre/lib/amd64/libsplashscreen.so
/usr/share/applications/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64-policytool.desktop
/usr/share/icons/hicolor/16x16/apps/java-1.8.0-openjdk.png
/usr/share/icons/hicolor/24x24/apps/java-1.8.0-openjdk.png
/usr/share/icons/hicolor/32x32/apps/java-1.8.0-openjdk.png
/usr/share/icons/hicolor/48x48/apps/java-1.8.0-openjdk.png

[root@ecs-hadoop1 ~]# cd /usr/local/hadoop/
[root@ecs-hadoop1 hadoop]# vim etc/hadoop/hadoop-env.sh  #修改環境腳本文件
修改25export JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64/jre" #指定java安裝路徑
修改33export HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-"/usr/local/hadoop/etc/hadoop"}  #指定hadoop配置文件路徑

[root@ecs-hadoop1 hadoop]# cd /usr/local/hadoop
[root@ecs-hadoop1 hadoop]# mkdir oo #創建統計目錄
[root@ecs-hadoop1 hadoop]# cp *.txt oo  #收集數據材料
[root@ecs-hadoop1 hadoop]# ls oo
LICENSE.txt  NOTICE.txt  README.txt

[root@ecs-hadoop1 hadoop]# ./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar  wordcount oo xx
命令含義解釋:
./bin/hadoop 表示運行hadoop
jar 表示調用一個jar文件(程序員開發出來的jar文件)
share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar  jar文件路徑
wordcount 統計哪個單詞出現的次數最多
oo  表示要統計的目錄
xx  表示分析完的結果放哪裏

[root@ecs-hadoop1 hadoop]# ls  #統計完成後就會出現一個xx的目錄,這裏存放這統計結果	
bin  include  libexec      NOTICE.txt  README.txt  share
etc  lib      LICENSE.txt  oo          sbin        xx

[root@ecs-hadoop1 xx]# ls
part-r-00000 #表示處理完的結果文件		 _SUCCESS #表示分析成功

僞分佈式介紹

僞分佈式和完全分佈式類似,僞分佈式主要用於學習和測試,幾乎是將所有角色都安裝在一臺主機上,使用本地磁盤

分佈式文件系統HDFS介紹

HDFS角色及概念

  • Client: 切分文件,訪問HDFS,與namenode交互獲取文件位置信息,與Datanode交互讀取和寫入數據
  • Namenode : Master節點,配置副本策略(存幾份),處理所有客戶端請求
  • Secondarynode: 定期合併fsimages(文件映像)和fsedits(補丁),推送給namedone
  • Datanode : 數據存儲節點,彙報存儲信息給namenode
    在這裏插入圖片描述

搭建完全分佈式

首先搭建分佈式文件系統HDFS
在這裏插入圖片描述
基礎準備

  • 禁用selinux
  • 卸載firewalld
  • 安裝java-1.8.0-openjdk-devel 和 java-1.8.0-openjdk
  • 修改主機名映射文件
  • 修改3個配置文件
配置主機名映射文件
[root@hadoop1 ~]# vim /etc/hosts
192.168.1.60 hadoop1
192.168.1.61 node-0001
192.168.1.62 node-0002
192.168.1.63 node-0003

部署密鑰(包括本機)要求不需要密碼就可以登錄其他節點
for i in  hadoop1 node-0001 node-0002 node-0003
> do  
> ssh-copy-id root@$i; done
> done

修改ssh配置文件(遠程連接時不需要輸入yes)
[root@hadoop1 ~]# vim /etc/ssh/ssh_config
在第60行添加     StrictHostKeyChecking no
:wq
[root@hadoop1 ~]# systemctl restart sshd

官方文檔地址 http://hadoop.apache.org/docs/r2.7.7/

修改hadoop的核心配置文件core-site
[root@hadoop1 ~]# cd /usr/local/hadoop/etc/hadoop/
[root@hadoop1 hadoop]# vim core-site.xml
<configuration>  #所有的參數必須放在這裏面
    <property>
        <name>fs.defaultFS</name>  #集羣使用什麼存儲介質
        <value>hdfs://hadoop1:9000</value>  #指定hdfs的namenode
    </property>
    <property>
        <name>hadoop.tmp.dir</name> #指定數據存儲的根目錄
        <value>/var/hadoop</value>
    </property>
</configuration>


配置hdfs-site文件
[root@nn01 hadoop]# vim hdfs-site.xml
<configuration>
    <property>
        <name>dfs.namenode.http-address</name> #namenode的地址
        <value>hadoop1:50070</value>  #hadoop1必須能ping通
    </property>
    <property>
        <name>dfs.namenode.secondary.http-address</name> #secondary namenode地址
        <value>hadoop1:50090</value>
    </property>
    <property>
        <name>dfs.replication</name>  #副本數量(存幾份)
        <value>2</value> #存兩份
    </property>
</configuration>


修改slaves文件,指定node節點是誰
[root@nn01 hadoop]# vim slaves  
node-0001 #必須能ping通
node-0002
node-0003

編寫palybook批量部署其他節點

[root@hadoop1 ~]# vim /root/hadoop.yml
---
- name: install hadoop
  hosts: hadoop
  tasks:
    - name: 刪除防火牆
      yum: name=firewalld-* state=removed
    - name: 安裝java環境
      yum: name=java-1.8.0-openjdk,java-1.8.0-openjdk-devel state=installed
    - name: 安裝hadoop
      synchronize: 
        src: /usr/local/hadoop #直接同步hadoop的目錄,hadoop後面不帶/就代表把hadoop目錄也同步過去
        dest: /usr/local/
    - name: 同步主機名映射文件
      copy: src=/etc/hosts dest=/etc/hosts
    - name: 同步配置文件  #後期修改配置文件時可以直接調用標籤
      tags: sync_conf
      template:
        src: "{{ item }}"
        dest: /usr/local/hadoop/etc/hadoop/
        owner: root
        group: root
        mode: 0644
      with_items:
        - /usr/local/hadoop/etc/hadoop/hadoop-env.sh
        - /usr/local/hadoop/etc/hadoop/core-site.xml
        - /usr/local/hadoop/etc/hadoop/hdfs-site.xml
        - /usr/local/hadoop/etc/hadoop/slaves

[root@hadoop1 ~]# ansible-playbook hadoop.yml  --syntax-check
[root@hadoop1 ~]# ansible-playbook hadoop.yml

格式化

[root@hadoop1 hadoop]# mkdir /var/hadoop      #創建hadoop的數據根目錄
[root@hadoop1 hadoop]# ./bin/hdfs namenode -format  #格式化namenode
[root@hadoop1 hadoop]# ./sbin/start-dfs.sh  #啓動hadoop
[root@hadoop1 hadoop]# jps  #驗證角色
4388 NameNode
4682 Jps
4573 SecondaryNameNode

[root@hadoop1 hadoop]# ansible hadoop -m shell -a'jps' #查看節點角色
node-0001 | SUCCESS | rc=0 >>
21320 Jps
21166 DataNode

node-0003 | SUCCESS | rc=0 >>
21346 Jps
21192 DataNode

node-0002 | SUCCESS | rc=0 >>
21366 Jps
21212 DataNode

集羣驗證
[root@hadoop1 hadoop]# ./bin/hdfs dfadmin -report #查看各個節點信息
在這裏插入圖片描述

部署 Mapreduce和Yarn組件

在準備好的環境下給master (nn01)主機添加ResourceManager的角色,在node1,node2,node3上面添加NodeManager的角色
在這裏插入圖片描述

配置mapred-site
[root@hadoop01 ] # cd /usr/local/hadoop/etc/hadoop/
[root@hadoop01 hadoop]# mv mapred-site.xml.template mapred-site.xml
[root@hadoop01 hadoop]# vim mapred-site.xml
<configuration>
   <property>
        <name>mapreduce.framework.name</name>  #指定管理類
        <value>yarn</value>
    </property>
</configuration>

配置yarn-site
[root@hadoop1 hadoop]# vim yarn-site.xml 
<configuration>
   <property>
        <name>yarn.resourcemanager.hostname</name>  #指定resourcemanager位置
        <value>hadoop1</value>
    </property>
    <property>
        <name>yarn.nodemanager.aux-services</name>  #計算框架
        <value>mapreduce_shuffle</value>  #名稱
    </property>
</configuration>

同步配置
[root@hadoop1 hadoop]# for i in node-0001 node-0002 node-0003
> do
> scp /usr/local/hadoop/etc/hadoop/mapred-site.xml root@$i:/usr/local/hadoop/etc/hadoop/mapred-site.xml
> done

[root@hadoop1 hadoop]# for i in node-0001 node-0002 node-0003
> do
> scp /usr/local/hadoop/etc/hadoop/yarn-site.xml  root@$i:/usr/local/hadoop/etc/hadoop/yarn-site.xml
> done

[root@hadoop1 hadoop]# ./sbin/start-yarn.sh #啓動yarn

驗證
[root@hadoop1 hadoop]# jps
2499 Jps
2390 SecondaryNameNode
2198 NameNode
1750 ResourceManager
1086 WrapperSimpleApp

[root@hadoop1 hadoop]# ansible hadoop -m shell -a'jps'  #再次查看各個節點身份
node-0003 | SUCCESS | rc=0 >>
1671 NodeManager
2023 Jps
1864 DataNode
1102 WrapperSimpleApp

node-0001 | SUCCESS | rc=0 >>
1104 WrapperSimpleApp
1896 DataNode
1674 NodeManager
2026 Jps

node-0002 | SUCCESS | rc=0 >>
1896 DataNode
1096 WrapperSimpleApp
1674 NodeManager
2026 Jps

[root@hadoop1 hadoop]# ./bin/yarn node -list  #查看yarn節點
20/07/05 19:30:33 INFO client.RMProxy: Connecting to ResourceManager at hadoop1/192.168.1.60:8032
Total Nodes:3
         Node-Id	     Node-State	Node-Http-Address	Number-of-Running-Containers
 node-0002:41311	        RUNNING	   node-0002:8042	                           0
 node-0003:32822	        RUNNING	   node-0003:8042	                           0
 node-0001:36311	        RUNNING	   node-0001:8042	                           0

web訪問hadoop
http://hadoop1:50070/       #namenode 
http://hadoop1:50090/       #secondory namenode 
http://node(xx):50075/       #datanode (node1,node2,node3)
http://hadoop1:8088/        #resourcemanager
http://node(xx):8042/        #nodemanager (node1,node2,node3)

Hadoop的使用

案例1 Hadoop詞頻統計

  • 在集羣文件系統裏創建文件夾
  • 上傳要分析的文件到目錄中
  • 分析上傳文件
  • 展示結果
[root@hadoop1 ~]# cd /usr/local/hadoop/
[root@hadoop1 hadoop]# ./bin/hadoop  fs  -mkdir /input  #創建目錄
[root@hadoop1 hadoop]# ./bin/hadoop  fs  -ls /    #./bin/hadoop  fs  - 爲固定格式 後面跟命令
drwxr-xr-x   - root supergroup          0 2020-07-05 19:49 /input
[root@hadoop1 hadoop]# ./bin/hadoop  fs  -touchz /file1  #創建文件
[root@hadoop1 hadoop]# ./bin/hadoop  fs  -ls /
-rw-r--r--   2 root supergroup          0 2020-07-05 19:50 /file1
drwxr-xr-x   - root supergroup          0 2020-07-05 19:49 /input
[root@hadoop1 hadoop]# ./bin/hadoop fs -get /file1 /root/  #從hdfs上下載文件
[root@hadoop1 hadoop]# ./bin/hadoop fs -put *.txt  /input   #從本地上傳文件到hdfs
[root@hadoop1 hadoop]# ./bin/hadoop fs -ls /input 
Found 3 items
-rw-r--r--   2 root supergroup      86424 2020-07-05 19:52 /input/LICENSE.txt
-rw-r--r--   2 root supergroup      14978 2020-07-05 19:52 /input/NOTICE.txt
-rw-r--r--   2 root supergroup       1366 2020-07-05 19:52 /input/README.txt

[root@hadoop1 hadoop]# ./bin/hadoop jar  \
share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar  wordcount  /input  /output #hadoop集羣分析大數據,hadoop集羣/input裏的數據存到hadoop集羣/output下

[root@hadoop1 hadoop]# ./bin/hadoop fs -ls /output #查看分析完的目錄
Found 2 items
-rw-r--r--   2 root supergroup          0 2020-07-05 20:02 /output/_SUCCESS
-rw-r--r--   2 root supergroup      30290 2020-07-05 20:02 /output/part-r-00000
[root@hadoop1 hadoop]#  ./bin/hadoop fs -get /output/part-r-00000  .   #將統計完的文件下載到本地
[root@hadoop1 hadoop]#  ./bin/hadoop fs -cat /output/part-r-00000  #或者直接使用cat查看結果文件


也可以利用web網站查看分析的目錄文件(但是統計完的文件需要下載才能看)
在這裏插入圖片描述
在這裏插入圖片描述

HDFS增加節點

  • 修改/etc/hosts
  • 同步配置文件/usr/local/hadoop
  • 卸載防火牆,禁用selinux
  • 拷貝公鑰給新的節點
  • 啓動節點 Datenode
  • 設置帶寬(爲新節點分配數據)
  • 在master主節點查看
[root@hadoop1 ~]# vim /etc/hosts
192.168.1.60	hadoop1
192.168.1.61	node-0001
192.168.1.62	node-0002
192.168.1.63	node-0003
192.168.1.64    newnode

[root@hadoop1 ~]# ssh-copy-id  root@newnode 
[root@hadoop1 ~]# vim /usr/local/hadoop/etc/hadoop/slaves  #添加指定新節點
node-0001
node-0002
node-0003
newnode
[root@hadoop1 ~]# ansible-playbook hadoop.yml  #使用ansible部署新節點

去新的節點啓動datanode

[root@newnode hadoop]# ./sbin/hadoop-daemon.sh start datanode #啓動datenode
[root@newnode hadoop]# jps  #驗證
1393 WrapperSimpleApp
9813 DataNode
9885 Jps

設置同步帶寬(爲新節點分配數據單位字節)
[root@newnode hadoop]# ./bin/hdfs dfsadmin -setBalancerBandwidth 60000000

返回hadoop1查看集羣成員

[root@hadoop1 hadoop]# ./bin/hdfs dfsadmin -report

在這裏插入圖片描述
當我們的數據量沒有預估的那麼大時就需要下線節點,節省資源
HDFS下線節點

  • HDFS 刪除節點狀態
  • 查看狀態 ./bin/hdfs dfsadmin -report
  • Normal: 正常狀態
  • Decommissioned in program: 數據正在遷移
  • Decommissioned: 數據遷移完成
  • 注意:僅當狀態變成Decommissioned才能down機下線
[root@hadoop1 hadoop]# vim /usr/local/hadoop/etc/hadoop/slaves        
//去掉之前添加的newdode
node1
node2
node3

[root@hadoop1 hadoop]# vim /usr/local/hadoop/etc/hadoop/hdfs-site.xml        
//在此配置文件裏面加入下面四行
<property>                                      
    <name>dfs.hosts.exclude</name>  #表示下線節點
    <value>/usr/local/hadoop/etc/hadoop/exclude</value> #下線節點的存放路徑
</property>

[root@hadoop1 hadoop]# vim /usr/local/hadoop/etc/hadoop/exclude  #將需要下線的節點寫入定義的配置文件
node4

導出數據
[root@hadoop1 hadoop]# ./bin/hdfs dfsadmin -refreshNodes  #將下線主機的數據導入到其他主機上
[root@nn01 hadoop]# ./bin/hdfs dfsadmin -report  #查看newnode顯示Decommissioned時纔可下線主機

下線機器
[root@newnode ~]# cd /usr/local/hadoop/
[root@newnode hadoop]#./sbin/hadoop-daemon.sh stop datanode    //停止datanode

[root@node4 hadoop]# ./sbin/yarn-daemon.sh start nodemanager             
//yarn 增加 nodemanager
[root@node4 hadoop]# ./sbin/yarn-daemon.sh stop  nodemanager  //停止nodemanager
stopping nodemanager
[root@node4 hadoop]# ./bin/yarn node -list        
//yarn 查看節點狀態,還是有node4節點,要過一段時間纔會消失
Total Nodes:4
         Node-Id         Node-State    Node-Http-Address    Number-of-Running-Containers
     node3:34628            RUNNING           node3:8042                               0
     node2:36300            RUNNING           node2:8042                               0
     node4:42459            RUNNING           node4:8042                               0
     node1:39196            RUNNING           node1:8042                               0
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章