Hadoop體系結構
★ Hadoop版本
Apache官方版本
Cloudera
Yahoo內部版本
★ 兩大核心
HDFS 和 MapReduce
HDFS是Hadoop File System Hadoop文件系統 它是一個分佈式的文件系統
MapReduce 並行的計算框架 數據來源於HDFS
★ HDFS的架構
它是一個主從結構的
主結點:NameNode,且只有一個
從結點:DataNode,可以有多個
▲ NameNode功能
接收用戶的操作請求
維護文件系統的目錄結構
維護文件與block之間的關係,HDFS中的文件是分割成block來保存的。
還要維護block與DataNode之間的關係
▲ DataNode功能
存儲文件
存儲的是block塊,保存在DataNode的磁盤上
爲保證數據安全,文件有多個副本,保存在不同的DataNode中
★ MapRreduce的架構
也是一個主從結構
主結點:JobTracker
從結點:TaskTracker
▲ JobTracker功能
接收客戶提交的計算任務
把任務分配給TaskTracker執行
監控TaskTracker的執行情況
▲ TaskTracker功能
執行JobTracker分配給的任務
★ Hadoop的特點
擴容能力高:可以可靠地存儲和處理千兆PB數據
成本低:可以通過普通機器組成的服務器集羣來並行計算,從而達到目的
高效率:通過分發數據,可以在多個節點上並行parallel地處理數據
可靠性:依託的是Hadoop的並行機制,可以多個副本
★ Hadoop集羣的物理分佈
物理分佈圖如下所示,通過交換機連接
一個主節點,多個從節點。
★ 單節點的物理結構
NameNode DataNode JobTracker TaskTracker SecondaryNameNode這些進程是運行在虛擬機JVM上的。
★ Hadoop的部署方式
▲本地模式
略。
▲僞分佈模式
Hadop的進程(NameNodeDataNode,JobTracker,TaskTracker,SecondNameNode)運行在一臺物理機器上。
▲集羣模式
不同的進程運行在不同的物理機器上。
★僞分佈模式部署
▲ 軟件準備
1. 安裝虛擬機,可以用vmware或virtualbox等虛擬機軟件
2.安裝linux操作系統,及對系統的一些設置,如SSH IP 等
3.安裝jdk
4.安裝Hadoop
PS:
※虛擬機的網絡配置,配置Host-only連接方式,找一個網段,組建一個單獨的網絡。安裝的虛擬機中的機器的IP設置成單獨的網段的IP,即可。
※如果網絡配置的是橋接,則虛擬機與物理機的IP地址要在同一個網段,否則不能正常訪問。
▲ 關閉防火牆
關閉:service iptables stop
驗證:service iptables status
關閉防火牆自動運行
關閉:chkconfig iptables off
驗證:chkconfig --list | grep iptables
▲ 設置ip地址
修改配置文件: vi /etc/sysconfig/network-scripts/ifcfg-eth0
配置完執行命令:service network restart
驗證:ifconfig 查看ip配置
▲ 修改主機名hostname
1.hostname hadooptest #只對當前會話生效
2.vi /etc/sysconfig/network #修改主機名 hostname後的名字爲要設置的主機名
▲ ip地址與hostname的綁定
vi /etc/hosts #修改映射文件
▲ SSH免密碼登錄
執行命令:ssh-keygen -t rsa
創建公鑰id_rsa.pub和私鑰id_rsa
添加公鑰到authorized_keys文件中
cp ~/.ssh/id_rsa.pub ~/.ssh/id_rsa/authorized_keys
ps:known_hosts文件中保存的是可以ssh免密碼登錄到的地址
當ssh localhost的時候,會給known_hosts文件中添加一條記錄,該條記錄,記錄的就是可以免密碼登錄的hostname或ip地址。
▲ JDK安裝
上傳jdk-6u24-linux-i586.bin 如果是64位的linux系統,則選擇對應的安裝文件
chmod a+x jdk-6u24-linux-i586.bin #設置該bin文件的執行權限
./ jdk-6u24-linux-i586.bin
設置環境變量JAVA_HOME #在/etc/profile文件中配置環境變量
source /etc/profile
驗證命令:java -version
▲ hadoop安裝
上傳haoop壓縮包hadoop-1.1.2.tar.gz
在/etc/profile文件中配置HADOOP_HOME環境變量
source /etc/profile
配置$HADOOP_HOME/conf/目錄下的四個配置文件,如下所示:
1. hadoop-env.sh
# The java implementation to use. Required.
export JAVA_HOME=/usr/local/jdk1.6
2. core-site.xml
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://hadooptest:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop1/tmp</value>
</property>
</configuration>
3. hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>
4. mapred-site.xml
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>hadooptest:9001</value>
</property>
</configuration>
配置完成後格式化文件系統,執行如下命令
hadoop namenode -format
執行完成後的結果:
[root@hadooptesthadoop1]# cd tmp
[root@hadooptesttmp]# pwd
/usr/local/hadoop1/tmp
[root@hadooptesttmp]# ll
total8
drwxr-xr-x.5 root root 4096 Jul 15 18:32 dfs
drwxr-xr-x.3 root root 4096 Jul 15 18:32 mapred
在上述配置文件core-site.xml文件中的配置文件中hadoop.tmp.dir指定的目錄下多出了兩個文件夾,分別是dfs和mapred,用來保存Hadoop運行時的一些臨時文件。
啓動Hadoop
執行命令:start-all.sh
驗證啓動是否成功:
執行命令:jps
如果出現如下五個進程,則表示hadoop啓動成功。
[root@hadooptest logs]# jps
4798 TaskTracker
5100 Jps
4597 SecondaryNameNode
4362 NameNode
4680 JobTracker
4472 DataNode
如果啓動失敗,可以參考下面的日誌文件中的報錯信息。
▲ 日誌文件
保存路徑:/usr/local/hadoop1/logs
hadoop-root-datanode-hadooptest.log
hadoop-root-jobtracker-hadooptest.log
hadoop-root-namenode-hadooptest.log
hadoop-root-secondarynamenode-hadooptest.log
hadoop-root-tasktracker-hadooptest.log
以上五個日誌文件是運行時的日誌文件,分類保存日誌信息。
▲ Hadoop常用端口
50030 可以查看正在運行的job等 jobtracker.jsp
Hadoop Map/Reduce Administration
50070 查看HDFS文件系統的健康狀況 dfshealth.jsp
以上兩個是常用的端口,其它略。
★ Hadoop的配置文件
Hadoop的核心配置包括如下:core-site.xml hadoop-env.xml hdfs-site.xml mapred-site.xml master slave
▲ core-site.xml
core-site.xml爲Hadoop的核心屬性文件,參數爲Hadoop的核心功能,獨立於HDFS和MapReduce。
參數 |
含義 |
fs.default.name |
設置Hadoop namenode的hostname及port, 預設是Standalone mode |
hadoop.tmp.dir |
默認值/tmp/hadoop-${user.name} 在tmp下根據username生成不同的目錄 |
fs.checkpoint.dir |
默認值${hadoop.tmp.dir}/dfs/namesecondary Sencondary NameNode 鏡像存儲目錄 |
fs.checkpoint.period |
默認值: 3600(秒) 控制 secondary namenode 的 checkpoint 時間間隔。如果距離上次 checkpoint 的時間大於這個參數的設定,就會觸發 checkpoint。secondary namenode 會把 namenode 的 fsimage 和 editlog 做 snapshot。如果存取 Hadoop 的次數頻繁或爲了減少重起 namenode 的 downtime,可以把這個值設小一點。 |
fs.checkpoint.size |
默認值67108864(byte) 如果 Hadoop 非常的忙碌,editlog 可能會在短時間內變的很大,fs.checkpoint.period 的設定不見得可以完全預測這個狀況,所以保險的做法會多設定這個值,以保證當數據大到超過 fs.checkpoint.size 的值也會觸發 checkpoint。 |
io.file.buffer.size |
默認值 4096 這是讀寫 sequence file 的 buffer size, 可減少 I/O 次數。在大型的 Hadoop cluster,建議可設定爲 65536 到 131072。 |
ipc.client.connection.maxidletime |
默認值 10000(毫秒) 設定 Hadoop client 連接時最大的閒置,默認是是 10 秒。如果 Hadoop cluster 的網絡聯繫不穩,可以把這個值設到 60000(60秒) |
ipc.server.tcpnodelay |
默認值 false 在 Hadoop server 是否啓動 Nagle’s 算法。設 true 會 disable 這個演算法,關掉會減少延遲,但是會增加小數據包的傳輸。server site 不太需要這定這個值。 |
hadoop.security.authorization |
默認值 false 是不是要開啓 賬號驗證機制,開啓之後 Hadoop 在執行任何動作之前都會先確認是否有權限。詳細的權限設定會放在 hadoop-policy.xml 裡。例如要讓 fenriswolf 這個 account 及 mapreduce group 可以 submit M/R jobs,要設定security.job.submission.protocol.acl |
hadoop.security.authentication |
默認值 simple simple 表示沒有 authentication,Hadoop 會用 system account 及 group 來控管q權限。 |
fs.trash.interval |
默認值 0(分) 清掉垃圾筒的時間。預設是不清, 所以在刪除文件時要自己執行 |
hadoop.native.lib |
默認 Hadoop 會去找所有可用的 native libraries 並自動 load 進來使用 |
▲ hdfs-site.xml
參數列表
•dfs.block.size
•默認值67108864(字節)
•默認每個 block 是 64MB。如果確定存取的文件塊都很大可以改為 134217728(128MB)。Client 也可自行決定要使用的 block size 而不需要更改整個 cluster 的設定。
•dfs.safemode.threshold.pct
•默認值 0.999f
• Hadoop 啓動時會進入 safemode,也就是安全模式,這時是不能寫入數據的。只有當99.9% 的 blocks 達到最小的 dfs.replication.min 數量(默認是3)纔會離開safe mode。在 dfs.replication.min 設的比較大或 data nodes 數量比較多時會等比較久。
•dfs.namenode.handler.count
•默認值 10
•設定 namenode server threads 的數量,這些 threads 會用 RPC 跟其他的 datanodes溝通。當 datanodes 數量太多時會發現很容易出現 RPC timeout,解決方法是提升網絡速度或提高這個值,但要注意的是 thread 數量多也表示 namenode 消耗的內存也隨着增加
•dfs.datanode.handler.count
•默認值 3
• 指定 data node 上用的 thread 數量。
•dfs.datanode.max.xcievers
•默認值 256
•這個值是指定 datanode 可同時處理的最大文件數量、
•dfs.datanode.du.reserved
•默認值 0
•默認值表示 data nodes 會使用整個磁盤,寫滿之後會導致無法再寫入 M/R jobs。如果還有其他程式共用這些目錄也會受到影響。建議保留至少 1073741824(1G) 的空間。
▲ mapred-site.xml
參數列表
•io.sort.mb
•默認值100
•緩存map中間結果的buffer大小(in MB)
•io.sort.record.percent
•默認值 0.05
•io.sort.mb中用來保存map output記錄邊界的百分比,其他緩存用來保存數據
•io.sort.spill.percent
•默認值0.80
•map開始做spill操作的閾值
•io.sort.factor
•默認值 10
•做merge操作時同時操作的stream數上限。
•min.num.spill.for.combine
•默認值3
•combiner函數運行的最小spill數
•mapred.compress.map.output
•默認值 false
•map中間結果是否採用壓縮
•mapred.map.output.compression.codec
•org.apache.hadoop.io.compress.DefaultCodec
•min.num.spill.for.combine
•默認值3
•combiner函數運行的最小spill數
•mapred.compress.map.output
•默認值 false
•map中間結果是否採用壓縮
•mapred.map.output.compression.codec
•org.apache.hadoop.io.compress.DefaultCodec
•mapred.reduce.parallel.copies
•默認值5
•每個reduce並行下載map結果的最大線程數
•mapred.reduce.copy.backoff
•默認值 300
•reduce下載線程最大等待時間(in sec)
•io.sort.factor
•默認值10
•org.apache.hadoop.io.compress.DefaultCodec
•mapred.job.shuffle.input.buffer.percent
•默認值0.7
•用來緩存shuffle數據的reduce task heap百分比
•mapred.job.shuffle.merge.percent
•默認值 0.66
•緩存的內存中多少百分比後開始做merge操作
•mapred.job.reduce.input.buffer.percent
•默認值0.0
•sort完成後reduce計算階段用來緩存數據的百分比
★ Hadoop HA
Hadoop1.0架構的問題
單點故障
•如果NameNode或者JobTraker關掉,那麼整個集羣癱瘓。
•對於7×24生產環境,是具有極大的風險。
第二部分:常見的HA方案
•第一種是可以設置一個NFS的目錄,存儲fsimage和editlog,存儲的是實時數據,這樣當namenode掛掉後能夠通過fsimage和editlog進行完全恢復。
•第二種是設置Secondary Namenode。
•問題:不能迅速的切換,需要花費一定時間恢復。
FaceBook的方案
•不改變namenode和datanode整體邏輯的基礎上,在其上層開發出AvaterNode,AvatarNode的意思就是支持互相切換。
•提供一個Primary Avatar和一個Standby Avatar,通過virual IP來設置IP地址。
•Primary Avatar對外提供服務,設置了NFS目錄,將FSImage和EditLog遠程存儲。Standby Avatar將NFS目錄中的FSImage和EditLog讀取過來進行同步,並且設置Standby Avatar一直處於safemode狀態,不影響正常操作。這樣Standby Avatar相當於一個熱拷貝,獲得了所有的實時數據。
Hadoop0.23 是如何解決的HA
提供2臺機器做雙機熱備
一臺爲Active 節點,一臺爲StandBy節點
同時只有Active節點對外提供服務
源數據存儲在共享存儲
StandBy會時刻到共享存儲拿Meta信息,以保證切換時不會丟掉數據
DataNode會向2臺機器彙報自己的信息
仍需要配置Sencondary NameNode接解決Edits log變大問題