什么是Hadoop?
Hadoop是一個開源的Apache項目,通常用來進行大數據處理。
Hadoop集群的架構:
master節點維護分布式文件系統的所有信息,並負責調度資源分配,在Hadoop集群中node-master
就是master的角色,其包括兩個服務:
- NameNode: 負責管理分布式文件系統,維護了數據塊在集群中的存儲信息;
- ResourceManager: 管理YARN任務,同時負責在worker節點的調度和執行。
worker節點負責存放數據,並提供執行任務的能力。在worker節點上包含兩個進程:
- DataNode: 管理在該節點上存放的物理數據,稱為
NameNode
; - NodeManager: 管理在該節點上運行的任務。
機器設置
以下配置都是針對Ubuntu系統的。我准備了3台機器:
- node-master: 192.168.0.113
- node1: 192.168.0.114
- node2: 192.168.0.115
用戶hadoop創建
- 創建用戶
hadoop
,並設置密碼:
sudo adduser hadoop
- 把
hadoop
用戶添加到sudo
用戶組獲取管理員權限:
sudo adduser hadoop sudo
安裝JDK
我安裝的是JDK8,安裝方式略。
host文件配置
為了節點之間可以方便的通過名字來通信,我們在hosts文件中加入如下內容:
192.168.0.113 node-master
192.168.0.114 node1
192.168.0.115 node2
192.168.0.116 node3
配置ssh免密登錄
配置了ssh證書后,master階段通過ssh免密登錄其他節點。
- 使用
hadoop
用戶登錄到mastr機器,並創建SSH證書:
ssh-keygen -b 4096 -C 'hadoop-yarn'
- 查看生成的公鑰,並復制下公鑰的內容:
cat /home/hadoop/.ssh/id_rsa.pub
- 在每個機器的
/home/hadoop/.ssh
文件夾下創建名為master.pub
的文件,並將上面復制的公鑰信息粘貼到里面; - 將證書信息拷貝到已授權秘鑰文件中:
cat ~/.ssh/master.pub >> ~/.ssh/authorized_keys
Hadoop安裝
登錄到node-master
,下載hadoop,並解壓:
http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-3.1.3/hadoop-3.1.3.tar.gz
tar -xzf hadoop-3.1.3.tar.gz
ln -s hadoop-3.1.3 hadoop
環境變量設置
- 添加Hadoop可執行目錄到PATH。修改
/home/hadoop/.profile
,添加如下內容:
PATH=/home/hadoop/hadoop/bin:/home/hadoop/hadoop/sbin:$PATH
- 添加hadoop到shell的PATH路徑。修改
.bashrc
,添加下面的內容:
export HADOOP_HOME=/home/hadoop/hadoop
export PATH=${PATH}:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin
MASTER節點設置
設置JAVA_HOME
這里我安裝的是ORACLE版本的JDK,目錄/usr/local/jdk
,修改~/hadoop/etc/hadoop-env.sh
,設置JAVA_HOME:
export JAVA_HOME=/usr/local/jdk
設置NameNode的位置
修改~/hadoop/etc/hadoop/core-site.xml
文件,設置NameNode的路徑為node-master的9000端口:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://node-master:9000</value>
</property>
</configuration>
設置HDFS路徑
修改hdfs-site.xml
,內容如下:
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoop/data/nameNode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoop/data/dataNode</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
最后一個屬性dfs.replication
表示該集群上的數據被冗余多少倍。注意replication的值不要超過worker節點的實際數量。
設置YARN作為任務調度器
修改mapred-site.xml
,設置YARN作為默認的MapReduce操作的框架:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
</property>
</configuration>
配置YARN
修改yarn-site.xml
。yarn.resourcemanager.hostname
的值設置為node-master的ip地址:
<configuration>
<property>
<name>yarn.acl.enable</name>
<value>0</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>203.0.113.0</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
設置Worker
創建一個名為workers
的啟動腳本,用來啟動需要的進程。修改~/hadoop/etc/hadoop/workers
,把所有的worker節點都加進去。
修改內存分配
默認的內存分配對於內存小於8GB的機器並不合適,所有對低內存的機器需要做一些特殊配置。
一個YARN任務的執行會用用到兩種類型的資源:
- 應用MASTER(AM)負責監控應用並協調集群中的exector;
- AM創建的Executor才會真正的執行任務。對MapReduce任務,exectors上會並行的執行map或者reduce的操作。
兩者都是運行在worker節點上。每個worker節點運行一個NodeManager的進程,該進程負責在該節點上創建容器。整個集群被ResourceManager管理,ResourceManger在所有的worker節點上根據容量需求以及當前的負載,進行容器的分配與創建。
為了集群能夠正常工作,下面4個配置必須合理的配置:
- 單個節點上YARN容器最多可以分配多少內存。這個配置的值需要比其他的都大,否則容器分配會被拒,application會失敗。但是,這個值不應該是該節點的實際內存大小。該配置是
yarn.nodemanager.resource.memory-mb
,配置在yarn-site.xml
中; - 每個容器可以分配的最大最小內存。如果一個容器申請的內存超過設置的最大值,否則分配會失敗,並會被分配成最小內存的整數倍。配置
yarn.scheduler.maximum-allocation-mb
和yarn.scheduler.minimum-allocation-mb
,都在yarn-site.xml
文件中配置; - ApplicationMaster分配的內存大小。
yarn.app.mapreduce.am.resource.mb
,配置在mapred-site.xml
中; - 每個map或者reduce操作可以分配的內存大小。這個值需要小於最大內存大小。
mapreduce.map.memory.mb
和mapreduce.reduce.memory.mb
,都配置在mapred-site.xml
。
以上四個類型的配置之間的關系如下圖:
以2G內存的節點為例,可行的配置如下:
屬性 | 值 |
---|---|
yarn.nodemanager.resource.memory-mb | 1536 |
yarn.scheduler.maximum-allocation-mb | 1536 |
yarn.scheduler.minimum-allocation-mb | 128 |
yarn.app.mapreduce.am.resource.mb | 512 |
mapreduce.map.memory.mb | 256 |
mapreduce.reduce.memory.mb | 256 |
- 修改
home/hadoop/hadoop/etc/hadoop/yarn-site.xml
,添加如下配置:
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>1536</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>1536</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>128</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
最后一個配置禁用虛擬內存檢查。
- 修改
/home/hadoop/hadoop/etc/hadoop/mapred-site.xml
, 添加如下內容:
<property>
<name>yarn.app.mapreduce.am.resource.mb</name>
<value>512</value>
</property>
<property>
<name>mapreduce.map.memory.mb</name>
<value>256</value>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>256</value>
</property>
格式化HDFS
和正常的單機文件系統一樣,HDFS在使用之前也需要格式化。在node-master上,運行如下命令:
hdfs namenode -format
到這里,hadoop的安裝完成了,可以運行了。
運行和監控
接下來看下如何在NameNode和DataNodes上啟動HDFS,以及如何進行監控。
HDFS的啟停
- 在node-master上運行下面的命令啟動HDFS:
start-dfs.sh
這個命令會在node-master上啟動NameNode
和SecondaryNameNode
進程,同時在數據節點上創建DataNode
進程。數據節點根據workers
文件中的配置。
- 檢查node-master和其他節點上的進程情況,可以通過
jps
命令來查看。在node-master上運行jps,可以看到NameNode和SecondaryNameNode,在worker節點上運行jps課題看到DataNode進程。 - 在node-master上通過下面的命令開停止hdfs:
stop-dfs.sh
監控HDFS集群
- 通過
hdfs dfsadmin
命令可以獲得一些有用的信息: - 另外HDFS提供了一個Web UI來查看hdfs集群的狀態,訪問地址: http://node-master-IP:9870