標籤:nap not 心跳機制 start 訊號 lca mount safe 事務
02_note_Distributed File SystemHDFS原理與操作,HDFS API編程;2.x下HDFS新特性,高可用,聯邦,快照
HDFS基本特性
/home/henry/app/hadoop-2.8.1/tmp/dfs/name/current - on namenode
cat ./VERSION
namespaceID (空間標識號,類似叢集識別號)
/home/henry/app/hadoop-2.8.1/tmp/dfs/data – on datanode
ls -lR
blk_1073741844xx (資料區塊,典型的資料區塊大小是64M)
/home/henry/app/hadoop-2.8.1/etc/hadoop/hdfs-site.xml
<name>dfs.replication</name> (設定block副本數,所有block都有副本)
機架感知功能(本機架其他機架都有副本,避免整個機架故障,也提高網路效率)
core-site.xml中配置
<name>topology.script.file.name</name> (指定機架感知指令檔RackAware.py)
<name>topology.script.number.args</name> (指定機架伺服器數量)
心跳機制
datanode定期發送block report給namenode
如果沒有定期收到訊號,則namenode會標記該datanode宕機,不會給IO需求,如果datanode失效造成副本數量下降,並且低於預先設定的閾值,namenode會在合適的時機迕行重新複製
安全模式
Namenode啟動時先經過"安全模式"
"安全模式"期間收集data block,當檢測到副本數不足的data block,會複製達到最小副本數才結束安全模式
hadoop dfsadmin -safemode enter - 強制進去安全模式
hadoop fs -put 等增刪操作在安全模式下會報錯
hadoop dfsadmin -safemode leave - 關閉安全模式
校正和
blk_1073741844xx.meta (檔案創立時,每個資料區塊都產生CRC校正和儲存在blk-xxx.meta同名檔案中,擷取資料時檢查以確定block是否損壞)
開啟資源回收筒
core-site.xml中配置
<name>fs.trash.interval</name>
<value>10080</value> - 時間閾值(單位分鐘),-rm刪除的檔案會放到.trash下,過閾值時間後被刪
除,0則禁用
恢複檔案,-mv到相應目錄即可
-expunge, 清空資源回收筒
hadoop fs -rm -r -skipTrash - 會直接刪除不經過tash
預設只有hadoop shell才會刪除到trash,其他程式化操作不會move to trash,例如webHDFS,java API等,除非代碼寫入call to the trash functionality
中繼資料保護
映像檔案和交易記錄是namenode核心資料,可以配置為多個副本
增強安全性,但降低namenode處理速度
namenode依然是單點,故障需要手動切換2nd namenode
Snapshot快照功能-2.x支援xxx重要需求xxx
(http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HdfsSnapshots.html)
snapshot不是整體備份,需要對某個目錄建立snapshot則對該目錄hdfs dfsadmin -allowSnapshot ./in (對./in目錄開啟)
hdfs dfsadmin -allowSnapshot <path> - 需要開啟備份的folder,可以開啟多個path
hdfs dfsadmin -disallowSnapshot <path>
hdfs dfs -createSnapshot <path> [<snapshotName>]
<snapshotName>optional參數,不設定則defaul with the format "‘s‘yyyyMMdd-HHmmss.SSS", e.g. "s20130412-151029.033"
hdfs dfs -deleteSnapshot <path> <snapshotName>
hdfs dfs -renameSnapshot <path> <oldName> <newName>
hdfs lsSnapshottableDir - 擷取目前使用者許可權下的所有開啟snapshot的目錄
hdfs dfs -ls ./in/.snapshot - 訪問snapshot需要後邊加/.snapshot才可以
hdfs snapshotDiff <path> <fromSnapshot> <toSnapshot> - 擷取不同snapshot的更改記錄
+ The file/directory has been created.
- The file/directory has been deleted.
M The file/directory has been modified.
R The file/directory has been renamed.
Block Pool (塊池的概念)
HDFS Federation (HDFS聯邦)
並非HA,不是互相冗餘,namenode失效會造成部分資料無法訪問,類似拼圖的概念
比較大的叢集,遇到namenode效能瓶頸才會需要
hdfs-site.xml配置(多個namenode)
格式化多個namenode
hdfs namenode -format[-clusterId <cluster_id>] > 第一個namenode,clusterid可選,會自動產生
hdfs namenode -format -clusterId <cluster_id> > 第二個namenode,必須指定clusterID,才能跟第一個namenode綁定在同一個Federation
2.x 支援多個NameNode,可以分散負載,得到效能保障
命名空間管理 - Client Side Mount Table
添加新datanode節點
install hadoop on new datanode and copy config from namenode
update masters and slaves file on all namenode and datanode
config no pwd access
start datanode and nodemanager
start-balancer.sh 進行負載平衡
Java串連HDFS, Run URLCat.java 樣本程式
echo $HADOOP_CLASSPATH 返回hadoop-env.sh預設的classpath配置,並copy建立HADOOP_CLASSPATH到/etc/profile
自己存放.class的path添加到HADOOP_CLASSPATH中 source /etc/profile
需要配置HADOOP_CLASSPATH,把用來放.class檔案的path放進去(/home/henry/myjava/class/),否則在運行編譯後的程式會報錯 "Could not find or load main class"
HADOOP_CLASSPATH可以在HADOOP_HOME/etc/hadoop/hadoop_env.sh配置,也可以直接在/etc/profile配置
hadoop classpath > 取回當前的HADOOP_CLASSPATH配置
cd ~/myjava
javac -cp ../app/hadoop-2.8.1/share/hadoop/common/hadoop-common-2.8.1.jar URLCat.java -d ./class/
javac -cp $HADOOP_CLASSPATH URLCat.java -d ./class/ (因為已經配置相關的.jar包到HADOOP_CLASSPATH,可以直接調用)
javac編譯的時候一定要加上已經配置的class path,比如-d ./class/, 負責運行時找不到會報錯, 因為已經把.class path配置到HADOOP_CLASSPATH
1) hadoop URLCat hdfs://master.henry:9000/user/henry/in/README.txt (需要把.class path配置到HADOOP_CLASSPATH,編譯後可以在任意path下運行)
jar -cvf URLCat.jar
2) hadoop jar ./URLCat.jar URLCat hdfs://master.henry:9000/user/henry/in/README.txt
不需要把.class path配置到HADOOP_CLASSPATH
但是必須在存放.class的path下運行才可以,否則識別不到.class檔案
Eclipse下寫的.java代碼需要去掉包名再編譯成class檔案(或直接linux下javac編譯)再移動到Linux下打包成jar檔案
修改Java檔案使用UTF-8編碼,否則linux上編譯亂碼報錯
菜單導覽列上Window-->Preferences 開啟"喜好設定"對話方塊,左側導航樹,導航到 General-->Workspace
修改單個項目的Java檔案編碼為UTF-8,package或者檔案右鍵properties>resource>text file encoding
javac -encoding utf-8 (指定編譯使用UTF-8編碼)
Ant使用
download and tar apache_ant
add ant_home and bin to /etc/profile
ant -version ok
Copy MapReduce_Cookbook_Code到Mater
隨便進入源碼目錄,主要有.src目錄(存放.java)和build.xml設定檔
build.xml - 設定檔(比如編譯使用的jar包路徑,編譯來源目錄,編譯後.class放置路徑等等)
執行ant命令會直接產生一個build目錄(存放.class檔案) - build.xml中配置的
Hadoop 2.8.x 分布式儲存 HDFS 基本特性, Java樣本串連HDFS