Hadoop快速瞭解法

Hadoop 核心組件
  HDFS 角色及概念
是Hadoop體系中數據存儲管理的基礎。它是一個高度容錯的系統,用於在低成本的通用硬件上運行。

角色和概念
– Client
– Namenode
– Secondarynode
– Datanode

NameNode
– Master節點,管理HDFS的名稱空間和數據塊映射信
息,配置副本策略,處理全部客戶端請求。

Secondary NameNode
– 按期合併 fsimage 和fsedits,推送給NameNode
– 緊急狀況下,可輔助恢復NameNode,
但Secondary NameNode並不是NameNode的熱備。

DataNode
– 數據存儲節點,存儲實際的數據
– 彙報存儲信息給NameNode。

Client
– 切分文件
– 訪問HDFS
– 與NameNode交互,獲取文件位置信息
– 與DataNode交互,讀取和寫入數據。

Block
– 每塊缺省64MB大小
– 每塊能夠多個副本

Mapreduce 角色及概念
源自於google的MapReduce論文,JAVA實現的分
布式計算框架

角色和概念
– JobTracker
– TaskTracker
– Map Task
– Reducer Task

JobTracker
– Master節點,只有一個
– 管理全部做業
– 做業/任務的監控、錯誤處理等
– 將任務分解成一系列任務,並分派給TaskTracker。

TaskTracker
– Slave節點,通常是多臺
– 運行Map Task和Reduce Task
– 並與JobTracker交互,彙報任務狀態。

Map Task:解析每條數據記錄,傳遞給用戶編寫的map(),並執行,將輸出結果寫入本地磁盤(若是爲map-only做業,直接寫入HDFS)。
Reducer Task:從Map Task的執行結果中,遠程讀取輸入數據,對數據進行排序,將數據按照分組傳遞給用戶編寫的reduce函數執行。

Yarn 角色及概念
Yarn 是 Hadoop 的一個通用的資源管理系統

Yarn 角色
– Resourcemanager
– Nodemanager
– ApplicationMaster
– Container
– Client

ResourceManager
– 處理客戶端請求
– 啓動 / 監控 ApplicationMaster
– 監控 NodeManager
– 資源分配與調度

NodeManager
– 單個節點上的資源管理
– 處理來自 ResourceManager 的命令
– 處理來自 ApplicationMaster 的命令

Container
– 對任務運行行環境的抽象,封裝了 CPU 、內存等
– 多維資源以及環境變量、啓動命令等任務運行相關的信息資源分配與調度

ApplicationMaster
– 數據切分
– 爲應用程序申請資源,並分配給內部任務
– 任務監控與容錯

Client
– 用戶與 YARN 交互的客戶端程序
– 提交應用程序、監控應用程序狀態,殺死應用程序等

YARN 的核心思想
 將 JobTracker 和 TaskTacker 進行分離,它由下面幾大構成組件:
– ResourceManager 一個全局的資源管理器
– NodeManager 每一個節點(RM)代理
– ApplicationMaster 表示每一個應用
– 每個 ApplicationMaster 有多個 Container 在NodeManager 上運行

  Hadoop 安裝配置
Hadoop 的部署模式有三種
– 單機
– 僞分佈式
– 徹底分佈式

Hadoop 的單機模式安裝很是簡單
– 一、獲取軟件
http://hadoop.apache.org
– 二、安裝配置 java 環境,安裝 jps 工具
安裝 Openjdk 和 openjdk-devel
– 三、設置環境變量,啓動運行
– hadoop-env.sh
JAVA_HOME=「」

安裝依賴
yum -y install  java-1.8.0-openjdk-devel  java-1.8.0-openjdk 

安裝hadoop
tar -xf hadoop-2.7.3.tar.gz
mv hadoop-2.7.3 /usr/local/hadoop
cd /usr/local/hadoop
vim /usr/local/hadoop/etc/hadoop/hadoop-env.sh
....
export JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.65-3.b17.el7.x86_64/jre/"
....
export HADOOP_CONF_DIR="/usr/local/hadoop/etc/hadoop"

mkdir input 
cp *.txt input    
./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar wordcount(標準字) input(上傳文件名)  output 
  (統計數據)
cat output/part-r-00000 

   Hadoop 僞分佈式
– 僞分佈式的安裝和徹底分佈式相似,但區別是全部角色安裝在一臺機器上,使用本地磁盤,通常生產環境都會使用徹底分佈式,僞分佈式通常用來學習和測試方面的功能
– 僞分佈式的配置和徹底分佈式配置相似

– Hadoop-env.sh
JAVA_HOME
HADOOP_CONF_DIR

http://hadoop.apache.org/docs/r2.7.5/hadoop-project-dist/hadoop-common/core-default.xml
– Xml 文件配置格式
<property>
<name>關鍵字</name>
<value>變量值</value>
<description> 描述 </description>
</property>

core-site.xml
– 關鍵配置
  fs.defaultFS
  hdfs://localhost:9000

– 經常使用配置
hadoop.tmp.dir

hdfs-site.xml
  dfs.replication
  dfs.namenode.name.dir
  dfs.datanode.data.dir
  dfs.namenode.http-address
  dfs.namenode.secondary.http-address
  dfs.webhdfs.enabled
  dfs.permissions.enabled

yarn-site.xml
  yarn.nodemanager.aux-services
  yarn.nodemanager.aux-services.mapreduce.shuffle.class
  yarn.resourcemanager.address
  yarn.resourcemanager.scheduler.address
  yarn.resourcemanager.resource-tracker.address
  yarn.resourcemanager.admin.address
  yarn.resourcemanager.webapp.address

   HDFS 徹底分佈式系統配置
master 192.168.4.10 部署:NameNode ,Secondary NameNode , Resourcemanager
Data  部署:DataNode  ,Nodemanager

vim /etc/hosts
192.168.4.10  master
192.168.4.11  Data1
192.168.4.12  Data2
192.168.4.13  Data3

一、安裝操做系統
– 注意:只開啓必要的服務,關閉其餘無關的系統服務,
系統最小化,服務最小化
– 注意:關閉系統防火牆
– 注意:關閉 selinux
– iptables-save
– sestatus

二、在全部系統上安裝 JAVA 環境和調試工具 jps
– 注意:保證全部機器系統版本及 java 版本的一致性
– 注意:保證全部安裝路徑的一致性
– java –version
– jps

三、配置 主機名 和 ip 對應關係 /etc/hosts
– 注意 :全部主機的配置都須要修改
– 注意 : master 要能 ping 通全部主機
– 注意 : node 要能 ping 通 master

四、配置 SSH 信任關係
– 注意:不能出現要求輸入 yes 的狀況,每臺機器都要
能登陸成功
– ssh-keygen -b 2048 -t rsa -N '' -f key
– ssh-copy-id -i ./key.pub root@ip.xx.xx.xx

五、HDFS 徹底分佈式配置
配置 HADOOP_CONF_DIR 路徑
/usr/local/hadoop/etc/hadoop
vim hadoop-env.sh
which java
readlink –f $(which java)
– JAVA_HOME=「」
HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-"/etc/hadoop"} 

 HDFS 徹底分佈式系統配置
– 配置 hadoop-env.sh
– 配置 core-site.xml
– 配置 hdfs-site.xml

  配置hdfs-site.xml
– dfs.namenode.http-address
– dfs.namenode.secondary.http-address
– dfs.namenode.name.dir
– dfs.datanode.data.dir
– dfs.replication
– dfs.webhdfs.enabled
– dfs.permissions.enabled

cd /usr/local/hadoop
vim /usr/local/hadoop/etc/hadoop/hadoop-env.sh
....
export JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.65-3.b17.el7.x86_64/jre/"
....
export HADOOP_CONF_DIR="/usr/local/hadoop/etc/hadoop"

vim  /usr/local/hadoop/etc/hadoop/core-site.xml 
.....
<configuration>
 <property>
   <name>fs.defaultFS</name>
   <value>hdfs://master:9000</value>  #masterIP地址
 </property>
 <property>
   <name>hadoop.tmp.dir</name>
   <value>/var/hadoop</value>     #路徑
   <description>A base for other temporary directories.</description>
 </property>
</configuration>

注意:全部機器上都要建立
mkdir –p /var/hadoop

vim /usr/local/hadoop/etc/hadoop/hdfs-site.xml
.....
<configuration>
 <property>
   <name>dfs.namenode.http-address</name>  #namenode在matser上
   <value>master:50070</value>     #masterIP地址
 </property>
 <property>
   <name>dfs.namenode.secondary.http-address</name> #namenode.secondary也搭在master上
   <value>master:50090</value>  
 </property>
 <property>
   <name>dfs.replication</name>
   <value>2</value>
 </property>
</configuration>

vim /usr/local/hadoop/etc/hadoop/slaves
node1
node2
node3

 hdfs-site.xml配置項
– dfs.namenode.http-address
– dfs.namenode.secondary.http-address
– dfs.namenode.name.dir
– dfs.datanode.data.dir
– dfs.replication
– dfs.webhdfs.enabled
– dfs.permissions.enabled

配置完成之後,把 hadoop 的文件夾拷貝到全部機器
– 在 namenode 上執行格式化操做
/usr/local/hadoop/bin/hdfs namenode –format
– 在沒有報錯的狀況下啓動集羣
/usr/local/hadoop/sbin/start-dfs.sh

驗證:
啓動之後分別在 namenode 和 datanode執行命令
jps
– 成功的狀況下應該能夠看見
– NameNode
– SecondaryNode
– DataNode

/usr/local/hadoop/bin/hdfs --help
/usr/local/hadoop/bin/hdfs dfsadmin -report (查看節點數)
.......
-------------------------------------------------
Live datanodes (3):
.......

HDFS 基本命令
/usr/local/hadoop/bin/hadoop fs –ls /
– 對應 shell 命令 ls /
/usr/local/hadoop/bin/hadoop fs –mkdir /abc
– 對應 shell 命令 mkdir /abc
/usr/local/hadoop/bin/hadoop fs –rmdir /abc
– 對應 shell 命令 rmdir /abc

– 上傳文件
/usr/local/hadoop/bin/hadoop fs –put localfile /remotefile
– 下載文件
/usr/local/hadoop/bin/hadoop fs –get /remotefile

cd /usr/local/hadoop
/usr/local/hadoop/bin/hadoop fs -mkdir /abc
/usr/local/hadoop/bin/hadoop  fs -put *.txt  /abc
/usr/local/hadoop/bin/hadoop fs -ls /abc

  Yarn 安裝與配置
yarn 配置文件
– mapred-site.xml
– yarm-site.xml
cd /usr/local/hadoop/etc/hadoop
cp mapred-site.xml.template mapred-site.xml

vim mapred-site.xml
...
<configuration>
 <property>
  <name>mapreduce.framework.name</name>
  <value>yarn</value>
 </property>
</configuration>
...

vim yarn-site.xml
.....
<configuration>
<!-- Site specific YARN configuration properties -->
 <property>
   <name>yarn.nodemanager.aux-services</name>
   <value>mapreduce_shuffle</value>
 </property>
 <property>
  <name>yarn.resourcemanager.hostname</name>
  <value>master</value>
 </property>
</configuration>
....

配置完成之後把配置同步到全部主機
– 啓動 yarn 服務
/usr/local/hadoop/sbin/start-yarn.sh
– 在全部主機上執行 jps ,查看是否啓動成功
resourcemanager
nodemanager

for i in  11 12 13  ;do  scp -r  /usr/local/hadoop/etc/hadoop/mapred-site.xml yarn-site.xml  192.168.4.$i:/usr/local/hadoop/etc/hadoop/mapred-site.xml yarn-site.xml ;done

/usr/local/hadoop/bin/yarn --help
/usr/local/hadoop//bin/yarn node -list
Total Nodes:3

  徹底分佈式
Hadoop最大的優點就是分佈式集羣計算,因此在生產環境下都是搭建的最後一種模式:徹底分佈模式

http://192.168.4.10:50070    namenode
http://192.168.4.10:50090    secondarynamenode
http://192.168.4.11:50075    datanode  
http://192.168.4.10:8088     resourcemanager
http://192.168.4.11:8042     nodemangager

Hadoop 驗證
建立文件夾
/usr/local/hadoop/bin/hadoop fs –mkdir /input
導入要分析的文件
/usr/local/hadoop/bin/hadoop fs –put *.txt /input

提交分析
– ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar wordcount /input  /output
• 查看結果
– ./bin/hadoop fs –cat /output/part-r-00000

Access time 打開文件時,變化
Modify time  修改文件時,變化
Change time   修改權限和文件內容等時,變化

    NFS 網關
NFS 網關用途
– 1.用戶能夠經過操做系統兼容的本地NFSv3客戶端來閱覽HDFS文件系統
– 2.用戶能夠從HDFS文件系統下載文檔到本地文件系統
– 3.用戶能夠經過掛載點直接流化數據。支持文件附加,可是不支持隨機寫
– NFS 網關支持NFSv3和容許HDFS 做爲客戶端文件系統的一部分被掛載

特性與注意事項
– 不支持隨機寫
– 在非安全模式,運行網關的用戶是代理用戶
– 在安全模式時,Kerberos keytab中的用戶是代理用戶
– AIX NFS有一些知道的問題,不能讓默認的HDFS NFS 網關正常工做,若是想在 AIX 訪問 NFS 網關須要配置下面的參數
<property>
<name>nfs.aix.compatibility.mode.enabled</name>
<value>true</value>
</property>

特性與注意事項

– HDFS超級用戶是與NameNode進程自己具備相同標識的用戶,超級用戶能夠執行任何操做,由於權限檢查永遠不會爲超級用戶失敗。
<property>
<name>nfs.superuser</name>
<value>the_name_of_hdfs_superuser</value>
</property>

特性與注意事項
– 若是客戶端安裝容許訪問時間更新,在某些Unix系統上,用戶能夠經過使用「noatime」安裝來禁用訪問時間更新。
<property>
<name>dfs.namenode.accesstime.precision</name>
<value>0</value>
<description>The access time for HDFS file is precise
upto this value.
The default value is 1 hour. Setting a value of 0 disables
access times for HDFS.
</description>
</property>

特性與注意事項
– nfs.dump.dir
– 用戶須要更新文件轉儲目錄參數。NFS客戶端常常從新安排寫操做,順序的寫操做會以隨機到達NFS網關。這個目錄經常使用於臨時存儲無序的寫操做。對於每一個文件,無序的寫操做會在他們積累在內存中超過必定閾值(如。1 mb)被轉儲。須要確保有足夠的空間的目錄。例如,若是應用上傳10個100M,那麼這個轉儲目錄推薦有1GB左右的空間,以便每一個文件都發生最壞的狀況。只有NFS網關須要在設置該屬性後重啓。

特性與注意事項
– nfs.exports.allowed.hosts
– 默認狀況下,export能夠被任何客戶端掛載。爲了更好的控制訪問,能夠設置屬性。值字符串爲機器名和訪問策略,經過空格來分割。機器名的格式能夠是單一的主機,Java的正則表達式或者IPv4地址。訪問權限使用rw或ro來指定導出目錄的讀/寫或機器只讀訪問。若是訪問策略沒被提供,默認爲只讀的。每一個條目使用「;」來分割。

調試與日誌排錯
– 在配置 NFS 網關過程當中常常會碰到各類各樣的錯誤,若是出現了錯誤,打開調試日誌是一個不錯的選擇。
 log4j.property
– log4j.logger.org.apache.hadoop.hdfs.nfs=DEBUG
– log4j.logger.org.apache.hadoop.oncrpc=DEBUG

NFS & portmap 相關配置
– core-site.xml
– hdfs-site.xml

master:
core-site.xml
– hadoop.proxyuser.{nfsuser}.groups
– hadoop.proxyuser.{nfsuser}.hosts
– 這裏的 nfsuser 是你機器上真實運行 nfsgw 的用戶
– 在非安全模式,運行nfs網關的用戶爲代理用戶
– groups 爲掛載點用戶所使用的組
– hosts 爲掛載點主機地址

/usr/local/hadoop/sbin/stop-all.sh
vim /usr/local/hadoop/etc/hadoop/core-site.xml
.......
<property>
<name>hadoop.proxyuser.nfsuser.groups</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.nfsuser.hosts</name>
<value>*</value>
</property>
........

adduser -g 10 -u 10003 nfsuser
scp  /usr/local/hadoop/etc/hadoop/core-site.xml 192.168.4.11 12 13:/usr/local/hadoop/etc/hadoop/core-site.xml
/usr/local/hadoop/sbin/start-all.sh

scp -r /usr/local/hadoop/   192.168.4.14:/usr/local/hadoop/      ip14=nfs

nfs:
hdfs-site.xml
– nfs.exports.allowed.hosts
– 設置容許訪問 NFS 主機列與權限,默認 「ro」
<property>
<name>nfs.exports.allowed.hosts</name>
<value>* rw</value>
</property>

hdfs-site.xml
– dfs.namenode.accesstime.precision
– 關閉 access time
<property>
<name>dfs.namenode.accesstime.precision</name>
<value>3600000</value>
</property>

hdfs-site.xml
– nfs.dump.dir
– 設置轉儲目錄
<property>
<name>nfs.dump.dir</name>
<value>/tmp/.hdfs-nfs</value>
</property>

hdfs-site.xml
– nfs.rtmax & nfs.wtmax
– 用戶能夠像訪問本地文件系統的一部分同樣訪問HDFS,但硬連接和隨機寫還不支持。對於大文件I/O的優化,能夠在mount的時候增長NFS傳輸的大小(rsize和wsize)。在默認狀況下,NFS網關支持1MB做爲最大的傳輸大小。更大的數據傳輸大小,須要在hdfs-site.xml中設置「nfs.rtmax」和「nfs.wtmax」.

hdfs-site.xml
– nfs.rtmax & nfs.wtmax
<property>
<name>nfs.rtmax</name>
<value>4194304</value>
</property>
<property>
<name>nfs.wtmax</name>
<value>1048576</value>
</property>

hdfs-site.xml
– nfs.port.monitoring.disabled
– 容許從沒有權限的客戶端掛載 nfs
<property>
<name>nfs.port.monitoring.disabled</name>
<value>false</value>
</property>

nfs.map
– 系統管理員必須確保在NFS客戶端的用戶和在HDFS網關主機上的用戶有相同的名稱和UID。不一樣主機上建立的用戶須要修改UID(例如使用「usermod -u 123 myusername」),在NFS客戶端或者NFS網關主機來進行。若是客戶端的用戶和NFS網關的用戶 uid 不能保持一致須要咱們配置 nfs.map 的靜態映射關係– nfs.map uid 10 100 # Map the remote UID 10 the local UID 100 gid 11 101 # Map the remote GID 11 to the local GID 101

hdfs-site.xml 基本配置
<property>
<name>nfs.exports.allowed.hosts</name>
<value>* rw</value>
</property>
<property>
<name>nfs.dump.dir</name>
<value>/tmp/.hdfs-nfs</value>
</property>

啓動與掛載
– 配置完全部的參數之後就能夠啓動服務了
– 這裏要注意 關閉系統的 portmap 和 nfs 服務
– 添加用戶
– 首先打開 log4j 的調試日誌
– 重啓 hdfs 集羣服務
– 啓動 portmap 服務
– 啓動 nfs3 服務

啓動與掛載
– 啓動 portmap 服務
./sbin/hadoop-daemon.sh --script ./bin/hdfs start portmap
– 啓動 nfs3
./sbin/hadoop-daemon.sh --script ./bin/hdfs start nfs3
– 這裏要特別注意:
– 啓動 portmap 須要使用 root 用戶
– 啓動 nfs3 須要使用 core-site 裏面設置的用戶

啓動與掛載
– 掛載 nfs
– 目前NFS v3僅使用TCP做爲傳輸協議。 不支持NLM,所以須要安裝選項「nolock」。 強烈建議使用安裝選項「sync」,由於它能夠最小化或避免從新排序寫入,這將致使更可預測的吞吐量。 未指定同步選項可能會致使上傳大文件時出現不可靠的行爲– 若是必須使用軟安裝,用戶應該給它一個相對較長的超時(至少不小於主機上的默認超時)。

啓動與掛載
– 掛載 NFS 參數
– vers=3
– proto=tcp
– nolock
– noacl
– noatime
– sync
mount -t nfs -o vers=3,proto=tcp,nolock,noacl,noatime,sync ip.xx.xx.xx:/ /localdir

yum search rpcbind
yum -y remove rpcbind  nfs-utils
vim  hdfs-site.xml
.....
<property>
  <name>nfs.exports.allowed.hosts</name>
  <value>* rw</value>
</property>
<property>
  <name>dfs.namenode.accesstime.precision</name>
  <value>36000000</value>
</property>
<property>
  <name>nfs.dump.dir</name>
  <value>/var/nfstemp</value>
</property>
<property>
  <name>nfs.rtmax</name>
  <value>4194304</value>
</property>
<property>
  <name>nfs.wtmax</name>
  <value>1048576</value>
</property>
<property>
  <name>nfs.port.monitoring.disabled</name>
  <value>false</value>
</property>
......

mkdir /var/nfstemp
chown 1003.10 /var/nfstemp

setfacl -m u:nfsuser:rwx  /usr/local/hadoop/logs/

啓動與掛載
– 啓動 portmap 服務
/usr/local/hadoop/sbin/hadoop-daemon.sh --script ./bin/hdfs start portmap
– 啓動 nfs3
/usr/local/hadoop/sbin/hadoop-daemon.sh --script ./bin/hdfs start nfs3
– 這裏要特別注意:
– 啓動 portmap 須要使用 root 用戶
– 啓動 nfs3 須要使用 core-site 裏面設置的用戶

 客戶機
yum -y ins nfs-utils
mount -t nfs -o  vers=3,port=tcp,nolock,sync,noatime,noacl 192.168.4.14:/  /mnt/

   HDFS 增長節點
– 1. 配置全部hadoop環境,包括主機名、ssh免密碼登
錄、禁用 selinux、iptables、安裝 java 環境
– 2. 把namnode的配置文件複製到配置文件目錄下
– 3. 修改namenode的slaves文件增長該節點
– 5. 在該節點啓動Datanode
./sbin/hadoop-daemon.sh start datanode
– 6. 設置同步帶寬,並同步數據
./bin/hdfs dfsadmin -setBalancerBandwidth 67108864
./sbin/start-balancer.sh -threshold 5
– 7. 查看集羣狀態
./bin/hdfs dfsadmin -report

master:
vim   /usr/local/hadoop/etc/hadoop/slaves
Data1
Data2
Data3
task1  #增長的節點主機名

vim  /etc/hosts
192.168.4.10  master
192.168.4.11  Data1
192.168.4.12  Data2
192.168.4.13  Data3
192.168.4.14  nfs
192.168.4.15  task1

scp /etc/hosts  192.168.4.15:/etc/hosts

scp /usr/local/hadoop/  192.168.4.15:/usr/local/hadoop/

./sbin/hadoop-daemon.sh start datanode

HDFS 刪除節點
– 配置NameNode的hdfs-site.xml
– dfs.replication 副本數量
– 增長 dfs.hosts.exclude 配置
<property>
<name>dfs.hosts.exclude</name>
<value>/usr/local/hadoop/etc/hadoop/exclude</value>
</property
– 增長 exclude 配置文件,寫入要刪除的節點 ip
– 更新數據
./bin/hdfs dfsadmin -refreshNodes

vim etc/hadoop/slaves
Data1
Data2
Data3
#task1  #增長的節點主機名
vim  /usr/local/hadoop/etc/hadoop/exclude
task1

– 更新數據
./bin/hdfs dfsadmin -refreshNodes

./bin/hdfs dfsadmin -report
Decommission  ...  -----> Decommissioned 才能刪除task1

task1:
./sbin/hadoop-daemon.sh stop datanode

HDFS 修復節點
– 修復節點比較簡單
– 單獨配置一臺新 datanode
– 啓動服務
./sbin/hadoop-daemon.sh start datanode
– 數據恢復是自動的
– 咱們上線之後會自動恢復數據,若是數據量很是巨大,可能須要必定的時間.

Yarn 的相關操做
– 因爲在 2.x hadoop 引入了 yarn 框架,對於計算節點的操做已經變得很是簡單
– 增長節點
sbin/yarn-daemon.sh start nodemanager
– 刪除節點
sbin/yarn-daemon.sh stop nodemanager
– 查看節點 (Resourcemanager)
./bin/yarn node -list

HDFS 還有不少其餘的應用方式,好比 native-hdfs,有興趣的能夠自行測試.
– 用到的軟件依賴
– cmake, fuse-devel
– protobuf
– protobuf-c
– native-hdfs-fuse

Hadoop 徹底分佈式安裝的配置
– java 環境
– ssh key 認證
– hosts 配置
– hadoop-env.sh
– core-site.xml
– hdfs-site.xml
– mapred-site.xml
– yarn-site.xml
– slaves

Hadoop NFS網關
– hadoop-env.sh
– core-site.xml
– hdfs-site.xml
– mount 參數

Hadoop 節點管理
– datanode 的增長 刪除 修復
– nodemanager 的增長 刪除 修復

 zookeeper
– ZooKeeper是一個分佈式的,開放源碼的分佈式應用程序協調服務

 ZooKeeper能幹什麼
– ZooKeeper是用來保證數據在集羣間的事務性一致

zookeeper 應用場景
– 集羣分佈式鎖
– 集羣統一命名服務
– 分佈式協調服務
– ......

zookeeper 角色與特性*
– Leader:(領導)
– 接受全部Follower的提案請求並統一協調發起提案的投票,負責與全部的Follower進行內部的數據交換。
– Follower:(隨同)
– 直接爲客戶端服務並參與提案的投票,同時與Leader進行數據交換。
– Observer:(臨時工)
– 直接爲客戶端服務但並不參與提案的投票,同時也與。
Leader進行數據交換

zookeeper 角色與選舉
– 服務在啓動的時候是沒有角色的 (LOOKING)
– 角色是經過選舉產生的
– 選舉產生一個 leader,剩下的是 follower
– 選舉 leader 原則:
– 集羣中超過半數機器投票選擇leader.
– 假如集羣中擁有n臺服務器,那麼leader必須獲得(n/2)+1臺服務器投票
– 若是 leader 死亡,重新選舉 leader
– 若是死亡的機器數量達到一半,集羣掛起
– 若是沒法獲得足夠的投票數量,就從新發起投票,若是參與投票的機器不足(n/2)+1集羣中止工做
– 若是 follower 死亡過多,剩餘機器不足(n/2)+1集羣也會中止工做
– observer 不計算在投票總設備數量裏面

zookeeper 可伸縮擴展性原理與設計
– leader 全部寫相關操做
– follower 讀操做與響應leader提議
– 在Observer出現之前,ZooKeeper的伸縮性由Follower來實現,咱們能夠經過添加Follower節點的數量來保證ZooKeeper服務的讀性能。可是隨看Follower節點數量的增長,ZooKeeper服務的寫性能受到了影響。爲何會出現這種狀況?在此,咱們須要首先了解一下這個"ZK服務"是如何工做的。
– 客戶端提交一個請求,如果讀請求,則由每臺Server的本地副本數據庫直接響應。如果寫請求,須要經過一致性協議(Zab)來處理
– Zab協議規定:來自Client的全部寫請求,都要轉發給ZK服務中惟一的Leader,由Leader根據該請求發起一個Proposal。而後,其餘的Server對該Proposal進行Vote。以後,Leader對Vote進行收集,當Vote數量過半時Leader會向全部的Server發送一個通知消息。最後,當Client所鏈接的Server收到該消息時,會把該操做更新到內存中並對Client的寫請求作出迴應。
(每一次客戶端發起寫請求,zookeeper集羣都要自主投票,投票數過一半以上才能夠寫入。)
– ZooKeeper 服務器在上述協議中實際扮演了兩個職能。它們一方面從客戶端接受鏈接與操做請求,另外一方面對操做結果進行投票。這兩個職能在ZooKeeper集羣擴展的時候彼此制約。
– 從Zab協議對寫請求的處理過程當中咱們能夠發現,增長follower的數量,則增長了對協議中投票過程的壓力。由於Leader節點必須等待集羣中過半Server響應投票,因而節點的增長使得部分計算機運行較慢,從而拖慢整個投票過程的可能性也隨之提升,隨着集羣變大,寫操做也會隨之降低。
–因此,咱們不得不,在增長Client數量的指望和咱們但願保持較好吞吐性能的指望間進行權衡。要打破這一耦合關係,咱們引入了不參與投票的服務器,稱爲Observer。 Observer能夠接受客戶端的鏈接,並將寫請求轉發給Leader節點。可是,Leader節點不會要求 Observer參加投票。相反,Observer不參與投票過程,僅僅在上述第3歩那樣,和其餘服務節點一塊兒獲得投票結果。
– Observer的擴展,給 ZooKeeper 的可伸縮性帶來了全新的景象。咱們如今能夠加入不少 Observer 節點,而無須擔憂嚴重影響寫吞吐量。但他並不是是無懈可擊的,由於協議中的通知階段,仍然與服務器的數量呈線性關係。可是,這裏的串行開銷很是低。所以,咱們能夠認爲在通知服務器階段的開銷不會成爲瓶頸。
– Observer提高讀性能的可伸縮性
– Observer提供了廣域網能力
(爲了減輕寫速度,因此Observer能夠接受客戶端的鏈接,但不要求Observer參加投票)

  ZK 集羣的安裝配置
– 一、安裝 openjdk 環境
– 二、解壓建立配置文件
– 三、設置集羣機器 id、ip、port
– 四、拷貝分發到全部集羣節點
– 五、啓動服務
– 六、查看狀態

ZK 集羣的安裝配置
– 一、安裝 openjdk 環境
– 二、解壓建立配置文件
– 三、設置集羣機器 id、ip、port
– 四、拷貝分發到全部集羣節點
– 五、建立目錄和 myid 文件
– 六、啓動服務
– 七、查看狀態

– zoo.cfg
– server.1=Data1:2888:3888  servier.1的1表示(id) 
– server.2=Data2:2888:3888
– server.3=Data3:2888:3888
– server.4=master:2888:3888:observer

zoo.cfg 集羣的安裝配置
– 建立 datadir 指定的目錄
– mkdir /tmp/zookeeper
– 在目錄下建立 id 對應的主機名的 myid 文件
– 關於myid文件:
– myid文件中只有一個數字
– 注意,請確保每一個server的myid文件中id數字不一樣
– server.id 中的 id 與 myid 中的 id 必須一致
– id的範圍是1~255
– 啓動集羣,查看驗證
– 在全部集羣節點執行
– /usr/local/zk/bin/zkServer.sh start
– 查看角色
– /usr/local/zk/bin/zkServer.sh status
– or
– { echo 'stat';yes; }|telnet 192.168.4.10 2181
– Zookeeper 管理文檔

Zookeeper 實驗
– 搭建 zookeeper 集羣
– 添加 observer
– 查找 leader
– 模擬 leader 故障
– 模擬 follower 故障
– 故障恢復

tar -xf zookeeper-3.4.10.tar.gz 
mv zookeeper-3.4.10 /usr/local/zookeeper
cp /usr/local/zookeeper/conf/zoo_sample.cfg  /usr/local/zookeeper/conf/zoo.cfg 
vim /usr/local/zookeeper/conf/zoo_sample.cfg 
...
server.1=Data1:2888:3888   
server.2=Data2:2888:3888
server.3=Data3:2888:3888
server.4=master:2888:3888:observer

for i in 10 11 12 13;do ssh 192.168.4.$i mkdir /tmp/zookeeper;done

全部主機同步/usr/local/zookeeper  
Data1:echo 1 > /tmp/zookeeper/myid
Data2:echo 2 > /tmp/zookeeper/myid
Data3:echo 3 > /tmp/zookeeper/myid
master:echo 4 > /tmp/zookeeper/myid

1-4: 
/usr/local/zookeeper/bin/zkServer.sh start
jps

vim a.sh
#!/bin/bash
function zkstatus(){
    exec 9<>/dev/tcp/$1/2181
    echo "$2" >&9
    cat  <&9
    exec 9<&-
}

for i in master Data{1..3}
do 
 echo -ne "${i}\t"
 zkstatus ${i} stat |grep -P "^Mode"
done 

zkstatus Data2 ruok
echo

bash a.sh

kafka集羣 
kafka是什麼  (中介)
– Kafka是由LinkedIn開發的一個分佈式的消息系統
– kafka是使用Scala編寫
– kafka是一種消息中間件
爲何要使用 kafka
– 解耦、冗餘、提升擴展性、緩衝
– 保證順序,靈活,削峯填谷
– 異步通訊

kafka 角色與集羣結構
– producer:生產者,負責發佈消息
– consumer:消費者,負責讀取處理消息
– topic:消息的類別
– Parition:每一個Topic包含一個或多個Partition.
– Broker:Kafka集羣包含一個或多個服務器
– Kafka經過Zookeeper管理集羣配置,選舉leader

kafka 集羣的安裝配置
– kafka集羣的安裝配置是依賴 zookeeper的,搭建kafka 集羣以前,首先請建立好一個可用 zookeeper集羣。
– 安裝 openjdk 運行環境
– 分發 kafka 拷貝到全部集羣主機
– 修改配置文件
– 啓動與驗證

kafka 集羣的安裝配置
server.properties
– broker.id
– 每臺服務器的broker.id都不能相同
– zookeeper.connect
– zookeeper 集羣地址,不用都列出,寫一部分便可

kafka 集羣的安裝配置
– 在全部主機啓動服務
– /usr/local/kafka/bin/kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties
– 驗證
– jps 命令應該能看到 kafka 模塊
– netstat 應該能看到 9092 在監聽

集羣驗證與消息發佈
– 建立一個 topic
./bin/kafka-topics.sh --create --partitions 2 --replication-factor 2 --zookeeper Data1:2181 --topic mymsg
– 查看全部 topic
./bin/kafka-topics.sh --list --zookeeper Data1:2181
– 查看 topic的詳細信息
./bin/kafka-topics.sh --describe --zookeeper Data1:2181 --topic mymsg

集羣驗證與消息發佈
– 在兩個終端裏面,生產者發佈消息,消費者讀取消息
– 生產者消息
. /bin/kafka-console-producer.sh --broker-list  master:9092,Data1:9092 --topic mymsg
– 消費者消息
./bin/kafka-console-consumer.sh --bootstrap-server Data2:9092,Data3:9092 --topic mymsg
– 表示從開始讀取消息
./bin/kafka-console-consumer.sh --bootstrap-server Data2:9092,Data3:9092 --topic mymsg --from-beginning 

利用 zookeeper 搭建一個 kafka 集羣
建立一個 topic
查看系統 topic 狀況
模擬生產者發佈消息
模擬消費者接收消息

tar -xf kafka_2.10-0.10.2.1.tgz 
mv kafka_2.10-0.10.2.1 /usr/local/kafka
cd /usr/local/kafka/config/
vim  servi.propreties
log.dirs=/tmp/kafka-logs (日誌路徑)
broker.id=4 (每臺kafka的id不能相同)
zookeeper.connect=Data1:2181,Data2:2181,Data3:2181

cp 全部主機
啓動/usr/local/kafka/bin/kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties
– 驗證
– jps 命令應該能看到 kafka 模塊
– netstat 應該能看到 9092 在監聽

       NameNode 高可用
– NameNode 是 HDFS 的核心配置,HDFS 又是Hadoop 的核心組件,NameNode 在 Hadoop 集羣中相當重要,NameNode機器宕機,將致使集羣不可用若是NameNode 數據丟失將致使整個集羣的數據丟失,而 NameNode 的數據的更新又比較頻繁,實現 NameNode 高可用勢在必行。

官方提供了兩種解決方案
– HDFS with NFS
– HDFS with QJM
– 兩種翻案異同

NFS                       QJM
NN                        NN
ZK                        ZK
ZKFailoverController     ZKFailoverController
NFS                      Journal

HA 方案對比:
– 都能實現熱備
– 都是一個active NN 和一個 standby NN
– 都使用Zookeeper 和 ZKFC 來實現自動失效恢復
– 失效切換都使用 fencing 配置的方法來 active NN
– NFS 數據數據共享變動方案把數據存儲在共享存儲裏面,咱們還須要考慮 NFS 的高可用設計。
– QJM 不須要共享存儲,但須要讓每個 DN 都知道兩個 NN 的位置,並把塊信息和心跳包發送給active和standby這兩個 NN。

NameNode 高可用方案 (QJM)
– 爲了解決 NameNode 單點故障問題,Hadoop 給出了 HDFS 的高可用HA方案:HDFS 一般由兩個NameNode組成,一個處於 active 狀態,另外一個處於standby 狀態。Active NameNode對外提供服務,好比處理來自客戶端的 RPC 請求,而 Standby NameNode 則不對外提供服務,僅同步 Active NameNode 的狀態,以便可以在它失敗時進行切換。

NameNode 高可用架構
– 一個典型的HA集羣,NameNode會被配置在兩臺獨立的機器上,在任什麼時候間上,一個NameNode處於活動狀態,而另外一個NameNode處於備份狀態,活動狀態的NameNode會響應集羣中全部的客戶端,備份狀態的NameNode只是做爲一個副本,保證在必要的時候提供一個快速的轉移。

– 爲了讓Standby Node與Active Node保持同步,這兩個Node都與一組稱爲JNS的互相獨立的進程保持通訊(Journal Nodes)。當Active Node上更新了namespace,它將記錄修改日誌發送給JNS的多數派。Standby noes將會從JNS中讀取這些edits,並持續關注它們對日誌的變動。Standby Node將日誌變動應用在本身的namespace中,當failover發生時,Standby將會在提高本身爲Active以前,確保可以從JNS中讀取全部的edits,即在failover發生以前Standy持有的namespace應該與Active保持徹底同步。

– NameNode 更新是很頻繁的,爲了的保持主備數據的一致性,爲了支持快速failover,Standby node持有集羣中blocks的最新位置是很是必要的。爲了達到這一目的,DataNodes上須要同時配置這兩個Namenode的地址,同時和它們都創建心跳連接,並把block位置發送給它們。

– 還有一點很是重要,任什麼時候刻,只能有一個ActiveNameNode,不然將會致使集羣操做的混亂,那麼兩個NameNode將會分別有兩種不一樣的數據狀態,可能
會致使數據丟失,或者狀態異常,這種狀況一般稱爲「split-brain」(腦裂,三節點通信阻斷,即集羣中不一樣的Datanode 看到了不一樣的Active NameNodes)。對於JNS而言,任什麼時候候只容許一個NameNode做爲writer;在failover期間,原來的Standby Node將會接管Active的全部職能,並負責向JNS寫入日誌記錄,這中機制阻止了其餘NameNode基於處於Active狀態的問題。

環境:
192.168.4.10 NameNode1 Zookeeper
192.168.4.16 NameNode2 
192.168.4.11  Data1 DataNode  Zookeeper
192.168.4.12  Data2 DataNode  Zookeeper
192.168.4.13  Data3 DataNode  Zookeeper

core-site.xml
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/var/hadoop</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>Data2:2181,Data3:2181</value>
</property>

hdfs-site.xml
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
– secondarynamenode 在高可用裏面沒有用途,這裏把他關閉
– namenode 在後面定義

hdfs-site.xml 續 ......
– <!-- 指定hdfs的nameservices名稱爲mycluster -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
– 指定集羣的兩個 NaneNode 的名稱分別爲nn1,nn2
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>

hdfs-site.xml 續 ......
– 配置nn1,nn2的rpc通訊端口
<property>
  <name>dfs.namenode.rpc-address.mycluster.nn1</name>
  <value>master:8020</value>
</property>
<property>
  <name>dfs.namenode.rpc-address.mycluster.nn2</name>
  <value>namenode2:8020</value>
</property>

hdfs-site.xml 續 ......
– 配置nn1,nn2的http通訊端口
<property>
  <name>dfs.namenode.http-address.mycluster.nn1</name>
  <value>master:50070</value>
</property>
<property>
  <name>dfs.namenode.http-address.mycluster.nn2</name>
  <value>namenode2:50070</value>
</property>

hdfs-site.xml 續 ......
– 指定namenode元數據存儲在journalnode中的路徑
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://Data3:8485;Data2:8485/mycluster</value>
</property>
– 指定journalnode日誌文件存儲的路徑
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/var/hadoop/journal</value>
</property>

hdfs-site.xml 續 ......
– 指定HDFS客戶端鏈接active namenode的java類
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>

hdfs-site.xml 續 ......
– 配置隔離機制爲 ssh
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
– 指定祕鑰的位置
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>

hdfs-site.xml 續 ......
– 開啓自動故障轉移
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>

vim core-site.xml
1.修改:master:9....
2.添加 zokeeper
vim core-site.xml
<configuration>
 <property>
   <name>fs.defaultFS</name>
   <value>hdfs://mycluster</value>
 </property>
 <property>
   <name>hadoop.tmp.dir</name>
   <value>/var/hadoop</value>
 </property>
 <property>
   <name>hadoop.proxyuser.nfsuser.groups</name>
   <value>*</value>
 </property>
 <property>
   <name>hadoop.proxyuser.nfsuser.hosts</name>
   <value>*</value>
 </property>
 <property>
   <name>ha.zookeeper.quorum</name>
   <value>Data1:2181,Data2:2181,Data3:2181</value>
 </property>
</configuration>

vim hdfs-site.xml
1.刪除祕書 namenode.secondary
2.刪除 namenode.http-address
3.添加nameservices組mycluster
4.添加namenodes.mycluster並定義
5.添加namenodes.rpc-address.mycluster.nn1
6.添加namenodes.rpc-address.mycluster.nn2
7.http.master1
8.http.namedoe2
9.添加namenode.shared.edits.dir
10.journalnode日誌文件存儲的路徑
11.HDFS客戶端鏈接active namenode的java類
12.配置隔離機制爲 ssh
13.指定祕鑰的位置  /root/.ssh/id_rsa
14.開啓自動故障轉移

vim hdfs-site.xml
<configuration>
<property>
  <name>dfs.replication</name>
  <value>2</value>
</property>
<property>
  <name>dfs.hosts.exclude</name>
  <value>/usr/local/hadoop/etc/hadoop/exclude</value>
</property>
<property>
  <name>dfs.nameservices</name>
  <value>mycluster</value>
</property>
<property>
  <name>dfs.ha.namenodes.mycluster</name>
  <value>nn1,nn2</value>
</property>
<property>
  <name>dfs.namenode.rpc-address.mycluster.nn1</name>
  <value>master:8020</value>
</property>
<property>
  <name>dfs.namenode.rpc-address.mycluster.nn2</name>
  <value>namenode2:8020</value>
</property>
<property>
  <name>dfs.namenode.http-address.mycluster.nn1</name>
  <value>master:50070</value>
</property>
<property>
  <name>dfs.namenode.http-address.mycluster.nn2</name>
  <value>namenode2:50070</value>
</property>
<property>
  <name>dfs.namenode.shared.edits.dir</name>
  <value>qjournal://Data2:8485;Data3:8485/mycluster</value>
</property>
<property>
  <name>dfs.journalnode.edits.dir</name>
  <value>/root/hadoop/journal</value>
</property>
<property>
  <name>dfs.client.failover.proxy.provider.mycluster</name>
  <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
  <name>dfs.ha.fencing.methods</name>
  <value>sshfence</value>
</property>
<property>
  <name>dfs.ha.fencing.ssh.private-key-files</name>
  <value>/root/.ssh/id_rsa</value>
</property>
<property>
  <name>dfs.ha.automatic-failover.enabled</name>
  <value>true</value>
</property>
</configuration>

   同步數據與高可用驗證
– 同步配置到全部集羣機器
– 在其中一臺初始化 zookeeper 集羣
./bin/hdfs zkfc -formatZK
– 在定義的節點啓動 journalnode
./sbin/hadoop-daemon.sh start journalnode
– 全部節點都要啓動
– 在其中一臺 namenode 上執行格式化命令
./bin/hdfs namenode -format
– 注意是格式化其中一臺,格式化之後把數據目錄拷貝到另外一臺
– 初始化 JournalNode
./bin/hdfs namenode -initializeSharedEdits
– 中止 JournalNode
./sbin/hadoop-daemon.sh stop journalnode
– 啓動 dfs
./sbin/start-dfs.sh 

同步數據與高可用驗證
– 驗證節點數
./bin/hadoop dfsadmin -report
– 查看集羣狀態
./bin/hdfs haadmin -getServiceState nn1
./bin/hdfs haadmin -getServiceState nn2

同步數據與高可用驗證
– 測試文件讀寫與 namenode 故障轉移
./bin/hadoop fs -ls hdfs://mycluster/
./bin/hadoop fs -mkdir hdfs://mycluster/input
./bin/hadoop fs -put *.txt hdfs://mycluster/input
./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar wordcount hdfs://mycluster/input hdfs://mycluster/output
– 關閉主Namenode
./bin/hdfs haadmin -getServiceState nn1
./bin/hdfs haadmin -getServiceState nn2
./bin/hadoop fs -cat hdfs://mycluster/output/*

  ResourceManager高可用
Yarn 高可用
ResourceManager 高可用
– RM 的高可用原理與 NN 是同樣的,須要依賴 ZK 來實現,這裏就不重複了,只給出配置文件的關鍵部分,感興趣的同窗能夠本身學習和測試
– yarn.resourcemanager.hostname
– 同理由於使用集羣模式,該選項應該關閉

yarn-site.xml 配置
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>

yarn-site.xml 配置
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>

yarn-site.xml 配置
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>Data2:2181,Data3:2181,Data1:2181</value>
<description>For multiple zk services, separate them with comma</description>
</property>
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yarn-ha</value>   (yarn集羣名)
</property>

yarn-site.xml 續 ......
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>Data1</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>Data2</value>
</property>

ResourceManager 高可用
– 啓動集羣
./sbin/start-yarn.sh 
– 查看集羣狀態
./bin/yarn rmadmin -getServiceState rm1
./bin/yarn rmadmin -getServiceState rm2
相關文章
相關標籤/搜索