hadoopo原理
hadoop2.0的HA 機制有兩個namenode,一個是active namenode,狀態是active;另一個是standby namenode,狀態是standby。二者的狀態是能夠切換的,但不能同時兩個都是active狀態,最多隻有1個是active狀態。只有active namenode提供對外的服務,standby namenode是不對外服務的。active namenode和standby namenode之間經過NFS或者JN(journalnode,QJM方式)來同步數據。
.
Hadoop的簡介:
Hadoop是apache軟件基金會的開源分佈式計算平臺hadoop集羣包括兩種角色Mater和Slave。一個HDFS集羣由一個運行於Master上的NameNode和若干個運行於Slave節點的DataNode組成。
.
NameNode負責管理文件系統命名空間和客戶端對文件系統的訪問操做;DataNode管理存儲的數據。文件以塊形式在DataNode中存儲,假如一個塊大小設置爲50MB,塊的副本數爲3(經過設置塊的副本數來達到冗餘效果,防止單個DataNode磁盤故障後數據丟失),一個40MB的文件將被存儲在一個塊中,而後將相同的3個塊存儲在3個DataNode中實現冗餘。大文件將被切成小塊存儲。
.java項目要求:
搭建hadoop的HDFS,經過DataNode節點的添加與刪除實現HDFS空間動態增長與減小,以及HDFS文件系統的基本管理。
.
.
環境:
master:Redhat 6.5 x86 :192.168.0.10
slave1:Redhat 6.5 x86 :192.168.0.11
slave2:Redhat 6.5 x86 :192.168.0.12
slave3:Redhat 6.5 x86 :192.168.0.13
slave4:Redhat 6.5 x86 :192.168.0.14node
.
準備環境
master、slave1~3上配置域名解析與主機名linux
[root@centos1 /]# vim /etc/hosts 192.168.0.10 master 192.168.0.11 slave1 192.168.0.12 slave2 192.168.0.13 slave3" . [root@centos1 /]# vim /etc/sysconfig/network HOSTNAME=master [root@centos1 /]# reboot
.web
**(slave1)** [root@centos1 /]# scp root@192.168.0.10:/etc/hosts /etc/ [root@centos1 /]# vim /etc/sysconfig/network HOSTNAME=slave1 [root@centos1 /]# reboot . **(slave2)** [root@centos1 /]# scp root@192.168.0.10:/etc/hosts /etc/ [root@centos1 /]# vim /etc/sysconfig/network HOSTNAME=slave2 [root@centos1 /]# reboot . **(slave3)** [root@centos1 /]# scp root@192.168.0.10:/etc/hosts /etc/ [root@centos1 /]# vim /etc/sysconfig/network HOSTNAME=slave3 [root@centos1 /]# reboot
.apache
(master 0.10)vim
JDK安裝 [root@centos1 /]# mount /dev/cdrom /media [root@centos1 /]# tar zxf jdk-7u65-linux-x64.gz -C /usr/src [root@centos1 /]# cd /usr/src [root@centos1 /]# mv jdk1.7.0_65/ /usr/local/java [root@centos1 /]# vim /etc/profile export JAVA_HOME=/usr/local/java //在末尾添加兩行 export PATH=$PATH:$JAVA_HOME/bin
.centos
[root@centos1 /]# source /etc/profile [root@centos1 /]# java -version
.
添加hadoop用戶瀏覽器
[root@centos1 /]# useradd hadoop [root@centos1 /]# passwd hadoop 同理:在slave1-slave3上重複步驟2)和步驟3),這裏就不在演示
.
配置SSH密鑰對
要求master免密碼登陸各slave,用於開啓相應服務。
Master無密碼鏈接slave,先切換hadoop用戶,用ssh-keygen按照默認配置直接按Enter鍵生成密鑰對,經過ssh-copy-id將公鑰複製至3個slave主機中,複製過程須要輸入slave主機的hadoop用戶密碼,做用是master遠程啓動slave。緩存
[root@centos1 /]# su - hadoop [root@centos1 /]# ssh-keygen . slave1上的hadoop用戶的密碼 [root@centos1 /]# ssh-copy-id -i .ssh/id_rsa.pub hadoop@slave1 [root@centos1 /]# ssh-copy-id -i .ssh/id_rsa.pub hadoop@slave2 [root@centos1 /]# ssh-copy-id -i .ssh/id_rsa.pub hadoop@slave3
.
安裝hadoop,在master和slave上配置環境變量。
.
安裝hadoop安全
[root@centos1 /]# exit [root@centos1 /]# cd /meida [root@centos1 /]# tar zxf hadoop-2.4.0.tar.gz -C /usr/src [root@centos1 /]# cd /usr/src [root@centos1 /]# mv hadoop-2.4.0/ /usr/local/hadoop [root@centos1 /]# ls /usr/local/hadoop
hadoop不需編譯安裝,在上述6個目錄中etc/hadoop是住配置文件目錄sbin/下存放啓動中止腳本
.
[root@centos1 /]# chown -R hadoop:hadoop /usr/local/hadoop . 配置環境變量 [root@centos1 /]# vim /etc/profile export HADOOP_HOME=/usr/local/hadoop export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/bin
.
配置hadoop
[root@centos1 /]# cd /media [root@centos1 /]# /bin/cp -r hadoop /usr/local/hadoop/etc/ [root@centos1 /]# su - hadoop [root@centos1 /]# cd /usr/local/hadoop/etc/hadoop [root@centos1 /]# vim hadoop-env.sh export JAVA_HOME=/usr/local/java //添加java環境變量
.
.
[root@centos1 /]# vim core-site.xml <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://master:9000</value> //master主機名 </property> <property> <name>hadoop.tmp.dir</name> <value>file:/usr/local/hadoop/tmp</value> <description>hadoop 臨時緩存目錄</description> </property> </configuration>
.
.
[root@centos1 /]# mv mapred-site.xml.tempalte mapred.site.xml [root@centos1 /]# vim mapred-site.xml <configuration> <property> <name>mapred.job.tracker</name> //鏈接jobtrack服務區的配置項,默認local,map數爲1,master是本機主機名 <value>master:9001</value> </property> <property> <name>mapred.local.dir</name> <value>/usr/local/hadoop/var</value> //做爲本地計算機使用的文件夾,可配置多塊硬盤用,分隔 </property> </configuration>
.
.
[root@centos1 /]# vim hdfs-site.xml <configuration> <property> <name>dfs.namenode.name.dir</name> <value>file:/usr/local/hadoop/name</value> </property> <property> <name>dfs.datanode.name.dir</name> <value>file:/usr/local/hadoop/name</value> </property> <property> <name>dfs.replication</name> <value>3</value> //副本數每塊複製幾份 </property> <property> <name>dfs.webhdfs.enabled</name> <value>true</value> //啓用web訪問hdfs,訪問格式httpd://master:50070 </property>
.
.
[root@centos1 /]# vim masters master //在文件中指定namenode的主機名 [root@centos1 /]# vim slaves slave1 slave2 slave3
指定datanode的主機名有多少slave就寫多少
.
每一個slave主機重複步驟1)和步驟2)(即它們也須要安裝hadoop並設置環境變量),等前兩步完成了再由master經過SSH安全通道把剛纔配置的6個文件複製給每一個slave。
每一個slave主機上重複1)和2)步驟的省略
.
[root@centos1 /]# scp * slave1:/usr/local/hadoop/etc/hadoop [root@centos1 /]# scp * slave2:/usr/local/hadoop/etc/hadoop [root@centos1 /]# scp * slave3:/usr/local/hadoop/etc/hadoop
.
.
使用HDFS初始化master
格式化HDFS文件系統
[root@centos1 /]# hafs namenode -format
看到截圖說明成功
.
檢查新生成的目錄
[root@centos1 /]# ll /usr/local/hadoop/name/br/>.
啓動hadoop羣集(開機hadoop的冗餘功能)
啓停hadoopde的管理命令位於@HADOOP_HOME/sbin下,以start-*或stop-*開頭;單獨啓動HDFS分佈式文件系統可以使用start-dfs.sh,也可使用如下命令啓動整個hadoop集羣
[root@centos1 /]# start-all.sh
(輸入master的hadoop用戶密碼)
(輸入slave的hadoop的用戶密碼,全部slave密碼要都同樣)
驗證訪問
.
。
。
[root@centos1 /]# service iptables stop
經過瀏覽器查看NameNode,即master,訪問http://192.168.0.10:50070,能夠查看視圖統計信息和HDFS存儲信息等。
驗證以前先關閉master和全部slave的防火牆
.
.
hadoop基本命令
使用「hadoop fs」命令能夠結合普通的文件管理命令實現不少操做,如查看、修改權限、統計、獲取幫助、建立、刪除、上傳下載文件等,更多的用法可以使用「hadoop fs -help」或「hadoop fs -usage」命令查看。
[root@centos1 /]# hadoop fs -ls / [root@centos1 /]# hadoop fs -mkdir /input [root@centos1 /]# hadoop fs -ls / [root@centos1 /]# hadoop fs -put /usr/local/hadoop/etc/hadoop/* /input hadoop fs -ls /input [root@centos1 /]# hdfs dfsadmin -report //查看所喲節點 的狀態
.
.
HDFS高級命令
開機安全模式
[root@centos1 /]# hdfs dfsadmin -safemode enter [root@centos1 /]# hdfs dfsadmin -safemode leave
enter開啓安全模式
leaves關閉安全模式
安全模式下拒接寫入數據到slave,通常用於維護,修改配置文件的狀況下,修改完就關閉安全模式
.
.
複製
將本地文件複製到HDFS上(注意不要在安全模式下)
[root@centos1 /]# hadoop fs -copyFormLocal /etc/passwd /
將/etc/passwd本地源文件複製到HDFS的/下
格式:hadoop fs -copyFromLocal 本地源文件 HDFS的目錄
.
將HDFS上的文件複製到本地
[root@centos1 /]# hadoop fs -ls [root@centos1 /]# hadoop fs -copyFormLocal /passwd /var [root@centos1 /]# chmod 777 /var/ [root@centos1 /]# hadoop fs -copyFormLocal /passwd /var
.
權限和歸屬
修改屬組
[root@centos1 /]# hadoop fs -chgrp root /passwd [root@centos1 /]# hadoop fs -ls /passwd 格式:hadoop fs -chgrp [-R] group 文件或目錄
.
修改權限
[root@centos1 /]# hadoop fs -chmod 755 /passwd [root@centos1 /]# hadoop fs -ls /passwd 格式:hadoop fs -chmod [-R] group 文件或目錄
.
修改全部者
[root@centos1 /]# hadoop fs -chown root:root /passwd [root@centos1 /]# hadoop fs -ls /passwd 格式:hadoop fs -chown [-R] group 屬主:屬組 文件或目錄
.
統計顯示目錄中文件大小
[root@centos1 /]# hadoop fs -du -s -h /passwd 格式:hadoop fs -du 目錄
.
合併文件
[root@centos1 /]# touch secret [root@centos1 /]# hadoop fs -getmerge -nl /passwd /home/hadoop/secret [root@centos1 /]# head -3 secret 格式:hadoop fs -getmerge [-nl] HDFS的源文件 本地主機的目的文件 源文件和目的文件都是同樣的數據了
.
.
(slave4)
爲HDFS集羣添加節點
slave4節點安裝jdk與hadoop,配置環境變量
[root@centos1 /]# mount /dev/cdrom /media [root@centos1 /]# useradd hadoop [root@centos1 /]# passwd hadoop [root@centos1 /]# tar zxf jdk-7u65-linux-x64.gz -C /usr/src [root@centos1 /]# cd /usr/src [root@centos1 /]# mv jdk1.7.0_65/ /usr/local/java [root@centos1 /]# scp root@192.168.0.10:/etc/profile /etc [root@centos1 /]# source /etc/profile [root@centos1 /]# java -version [root@centos1 /]# cd /meida [root@centos1 /]# tar zxf hadoop-2.4.0.tar.gz -C /usr/src [root@centos1 /]# cd /usr/src [root@centos1 /]# mv hadoop-2.4.0/ /usr/local/hadoop [root@centos1 /]# chown -R hadoop:hadoop /usr/local/hadoop
.
.
(master)
配置/etc/hosts解析,NameNode與4臺DataNode都要配置
[root@centos1 /]# vim /etc/hosts 192.168.0.10 master 192.168.0.11 slave1 192.168.0.12 slave2 192.168.0.13 slave3 192.168.0.14 slave4 //把新的節點slave4添加到master的hosts文件中
.
(slave1.2.3.4)
[root@centos1 /]# scp root@192.168.0.11:/etc/hosts /etc/ [root@centos1 /]# scp root@192.168.0.12:/etc/hosts /etc/ [root@centos1 /]# scp root@192.168.0.13:/etc/hosts /etc/ [root@centos1 /]# scp root@192.168.0.14:/etc/hosts /etc/
0.14重啓
.
(slave4)
[root@centos1 /]# vim /etc/sysconfig/network HOSTNAME=slave4 重啓
.
(master)
配置ssh無密碼鏈接
[root@centos1 /]# su -hadoop [root@centos1 /]# ssh-copy-id -i .ssh/id_rsa.pub hadoop@slave4
.
在master上修改hadoop配置後,複製到其餘節點
[root@centos1 /]# vim /usr/local/hadoop/etc/hadoop/slaves slave1 slave2 slave3 slave4 [root@centos1 /]# scp /usr/local/hadoop/etc/hadoop/* slave1:/usr/local/hadoop/etc/hadoop/ [root@centos1 /]# scp /usr/local/hadoop/etc/hadoop/* slave2:/usr/local/hadoop/etc/hadoop/ [root@centos1 /]# scp /usr/local/hadoop/etc/hadoop/* slave3:/usr/local/hadoop/etc/hadoop/ [root@centos1 /]# scp /usr/local/hadoop/etc/hadoop/* slave4:/usr/local/hadoop/etc/hadoop/
.
(slave4)
新節點啓動並平衡節點已經存儲的數據,啓動兩個
[root@centos1 /]# hadoop-daemon.sh start datanode [root@centos1 /]# hadoop-daemon.sh start tasltracker
.
查看進程狀態有兩條說明正確
[root@centos1 /]# jps 3024 Jps 2924 DataNode
.
開啓負載均衡
[root@centos1 /]# start-balancer.sh [root@centos1 /]# service iptables stop
.
(master)
查看集羣信息
[root@centos1 /]# hadoop dfsadmin -report
.
刪除DataNode節點
增長exclude配置,做用爲存放要刪除的DataNode信息
[root@centos1 /]# vim /usr/local/hadoop/etc/hadoop/core-site.xml <property> <name>dfs.hosts.exclude</name> <value>/usr/local/hadoop/etc/hadoop/excludes</value> </property> [root@centos1 /]# cd /usr/local/hadoop/etc/hadoop . [root@centos1 /]# vim excludes slave4
.
刷新配置 [root@centos1 /]# hdfs dfsadmin -refreshNodes
.
(slave4)
檢查slave4的進程 [root@centos1 /]# jps
.
(master)
查看集羣信息
[root@centos1 /]# hadoops fsadmin -report 當發現節點信息爲decommisssioned時代表這個節點已經被刪除