HDFS分布式文件系統
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中實現冗余。大文件將被切成小塊存儲。
.
項目要求:
搭建hadoop的HDFS,通過DataNode節點的添加與刪除實現HDFS空間動態增加與減少,以及HDFS文件系統的基本管理。
.
.
環境:
master:Redhat 6.5 x86 :192.168.0.10
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.14
.
準備環境
master、slave1~3上配置域名解析與主機名
[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
.
**(slave1)**
[root@centos1 /]# scp [email protected]:/etc/hosts /etc/
[root@centos1 /]# vim /etc/sysconfig/network
HOSTNAME=slave1
[root@centos1 /]# reboot
.
**(slave2)**
[root@centos1 /]# scp [email protected]:/etc/hosts /etc/
[root@centos1 /]# vim /etc/sysconfig/network
HOSTNAME=slave2
[root@centos1 /]# reboot
.
**(slave3)**
[root@centos1 /]# scp [email protected]:/etc/hosts /etc/
[root@centos1 /]# vim /etc/sysconfig/network
HOSTNAME=slave3
[root@centos1 /]# reboot
.
(master 0.10)
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
.
[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/.
啟動hadoop群集(開機hadoop的冗余功能)
啟停hadoopde的管理命令位於@HADOOP_HOME/sbin下,以start-*或stop-*開頭;單獨啟動HDFS分布式文件系統可使用start-dfs.sh,也可以使用以下命令啟動整個hadoop集群
br/>.
啟動hadoop群集(開機hadoop的冗余功能)
啟停hadoopde的管理命令位於@HADOOP_HOME/sbin下,以start-*或stop-*開頭;單獨啟動HDFS分布式文件系統可使用start-dfs.sh,也可以使用以下命令啟動整個hadoop集群
(輸入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 [email protected]:/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 [email protected]:/etc/hosts /etc/
[root@centos1 /]# scp [email protected]:/etc/hosts /etc/
[root@centos1 /]# scp [email protected]:/etc/hosts /etc/
[root@centos1 /]# scp [email protected]:/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時表明這個節點已經被刪除
HDFS分布式文件系統