HDFS基本命令
接觸大數據挺長時間了,項目剛剛上完線,趁着空閑時間整理下大數據hadoop、Hbase等常用命令以及各自的優化方式,當做是一個學習筆記吧。
HDFS命令基本格式:Hadoop fs -cmd < args >
ls 命令
hadoop fs -ls / 列出hdfs文件系統根目錄下的目錄和文件
hadoop fs -ls -R / 遞歸列出hdfs文件系統所有的目錄和文件
put 命令
hadoop fs -put < local file > < hdfs file > 本地文件上傳到HDFS
hadoop fs -put < local file or dir >...< hdfs dir > 多個本地文件或目錄上傳到HDFS
moveFromLocal 命令
hadoop fs -moveFromLocal < local src > ... < hdfs dst > 與put相類似,命令執行后源文件local src 被刪除,也可以從從鍵盤讀取輸入到hdfs file中
copyFromLocal 命令
hadoop fs -copyFromLocal < local src > ... < hdfs dst > 與put相類似,也可以從從鍵盤讀取輸入到hdfs file中
get 命令
hadoop fs -get < hdfs file > < local file or dir> local file,不能和hdfs file名字不能相同,否則會提示文件已存在,沒有重名的文件會復制到本地
hadoop fs -get < hdfs file or dir > ... < local dir > 拷貝多個文件或目錄到本地時,本地要為文件夾路徑
copyToLocal 命令
hadoop fs -copyToLocal < local src > ... < hdfs dst > 與get相類似
rm 命令
hadoop fs -rm < hdfs file > ... hadoop fs -rm -r < hdfs dir>... 每次可以刪除多個文件或目錄
mkdir 命令
hadoop fs -mkdir < hdfs path> 只能一級一級的建目錄,父目錄不存在的話使用這個命令會報錯hadoop fs -mkdir -p < hdfs path> 所創建的目錄如果父目錄不存在就創建該父目錄
cp 命令
hadoop fs -cp < hdfs file > < hdfs file > 目標文件不能存在,否則命令不能執行,相當於給文件重命名並保存,源文件還存在。
hadoop fs -cp < hdfs file or dir >... < hdfs dir > 目標文件夾要存在,否則命令不能執行
mv 命令
hadoop fs -mv < hdfs file > < hdfs file > 目標文件不能存在,否則命令不能執行,相當於給文件重命名並保存,源文件不存在hadoop fs -mv < hdfs file or dir >... < hdfs dir > 源路徑有多個時,目標路徑必須為目錄,且必須存在。
du 命令
hadoop fs -du < hdsf path>
顯示hdfs對應路徑下每個文件夾和文件的大小hadoop fs -du -s < hdsf path> 顯示hdfs對應路徑下所有文件和的大小hadoop fs -du -h < hdsf path>
setrep 命令
hadoop fs -setrep -R 3 < hdfs path > 改變一個文件在hdfs中的副本個數,上述命令中數字3為所設置的副本個數,-R選項可以對一個人目錄下的所有目錄+文件遞歸執行改變副本個數的操作
tail 命令
hadoop fs -tail < hdfs file > 在標准輸出中顯示文件末尾的1KB數據archive 命令
hadoop archive -archiveName name.har -p < hdfs parent dir > < src >* < hdfs dst > 命令中參數。
name:壓縮文件名,自己任意取;< hdfs parent dir > :壓縮文件所在的父目錄;< src >:要壓縮的文件名;< hdfs dst >:壓縮文件存放路徑,*示例:hadoop archive -archiveName hadoop.har -p /user 1.txt 2.txt /des ,示例中將hdfs中/user目錄下的文件1.txt,2.txt壓縮成一個名叫hadoop.har的文件存放在hdfs中/des目錄下,如果1.txt,2.txt不寫就是將/user目錄下所有的目錄和文件壓縮成一個名叫hadoop.har的文件存放在hdfs中/des目錄下顯示har的內容可以用如下命令:hadoop fs -ls /des/hadoop.jar 顯示har壓縮的是那些文件可以用如下命令hadoop fs -ls -R har:///des/hadoop.har
JavaAPI訪問HDFS
FileSystem類主要方法:
get(),create(),append(),listStatus(),copyFromLocal()
HDFS日常管理
安全模式
☆集群啟動后處於安全模式,直到副本數滿足閥值要求才退出
☆命令:Hadoop dfsadmin –safemode enter|leave|get|wait
☆只能瀏覽不能修改
☆通常在系統維護之前使用
HDFS日常管理
☆集群基本信息報告:
Hadoop dfsadmin –report
☆動態刷新
host配置:hadoop dfsadmin –refreshNodes
☆節點間數據均衡:hadoop balancer
☆目錄配額:hadoop dfsadmin -setQuota 文件個數
hadoop dfsadmin – setSpaceQuota 空間大小
HDFS日常管理-文件系統檢查
☆命令:hadoop fsck <path> [-move | -delete | -openforwrite] [-files [-blocks [-locations -racks]]]
<path> 檢查這個目錄中的文件是否完整
-move 破損的文件移至/lost+found目錄
-delete刪除破損的文件
-openforwrite打印正在打開寫操作的文件
-files打印正在check的文件名
-blocks打印block報告(需要和-files參數一起使用)
-locations打印每個block的位置信息(需要和-files參數一起使用)
-racks打印位置信息的網絡拓撲圖(需要和-files參數一起使用)
HDFS調優
☆dfs.block.size
建議512MB,太小的blocksize會增加NameNode負擔
☆dfs.namenode.handler.count
根據CPU數和內存數設置,推薦100,較大的值可提升文件處理吞吐量
☆dfs.datanode.handler.count DataNode
的接收和發送數據的處理線程數,推薦200,受磁盤繁忙情況制約
☆dfs.data.dir DataNode
存儲Block文件的目錄,設置為多個可提升DataNode吞吐量,多目錄以逗號分割
☆dfs.heartbeat.interval和heartbeat.recheck.interval
DN與NN心跳間隔,計算公式:timeout = 2 * heartbeat.recheck.interval + 10 * dfs.heartbeat.interval
☆dfs.datanode.max.xcievers DataNode
可同時處理的最大文件數
☆io.file.buffer.size
讀寫緩沖區大小,通常設置為65536以上,可減少IO次數
☆io.bytes.per.checksum
每校驗碼所校驗的字節數,默認512字節,不要超過io.file.buffer.size
HBase
Rowkey設計原則
•長度原則
–Rowkey最長64kb。以byte[]存儲,建議rowkey越短越好,不要超過16字節
•散列原則
–加鹽
–哈希
–反轉
–時間戳反轉
•唯一原則,rowKey必須保證唯一
參數優化
處理線程優化
增加handler個數
參數hbase.regionserver.handler.count配置的是region server開啟的處理對用戶表的請求的線程個數,默認值是10。設置該值的原則是:如果每個請求的負載達到MB,如大的put,scan caching設置很大的scan,那么保持該值比較小;否則,如果負載小,如get,小的put,increment,delete,把該值設大。
緩沖大小
hfile.block.cache.size
regionserver cache的大小,默認是0.2,是整個堆內存的多少比例作為regionserver的cache,調大該值會提升查詢性能,當然也不能過大,如果我們的hbase基本都是大量的查詢,寫入不是很多的話,調到0.5也就夠了,說到這個值,有一個地方需要說明一下,如果生產環境有mapred任務去scan hbase的時候,一些要在mapred scan類中加一個scan.setCacheBlocks(false),避免由於mapred使用regionserver的cache都被替換,造成hbase的查詢性能明顯下降。
Memstore
hbase.hregion.memstore.flush.size
一個regionserver的單個region memstore的大小,默認是64M,在hbase結構中,一個regionserver管理多個region,一個region對應一個hlog和多個store,一個store對應多個storefile和一個memstore,這里的hbase.hregion.memstore.flush.size意思是一個region下面的所有store里面的memstore的達到多少時,開始將這些memstore flush到hdfs中去,配置這個值,需要參考一下,平均每個regionserver管理的region數量,如果每台regionsever管理的region不多的話,可以適當的調大該值,如512M時再flush。
hbase.regionserver.global.memstore.upperLimit/hbase.regionserver.global.me
mstore.lowerLimit
配置一台regionserver所有memstore占整個堆的最大比例,默認是0.4/0.35,二個值的差異在於是做局部的flush,還是全部flush,如果我們的regionserver日志中,頻發出現因為超過hbase.regionserver.global.memstore.lowerLimit而做flush的信息,我覺得有必要調小hbase.hregion.memstore.flush.size,或者適當調大這二個值,當然hbase.regionserver.global.memstore.upperLimit和hfile.block.cache.size的和不能大於1,到0.8我覺得已經夠大了。如果我們的jvm內存回收是使用cms的話,有一個值CMSInitiatingOccupancyFraction(內存使用到時多少時,一始cms回收內存)的大小和覺得和這個有關系,略小於hbase.regionserver.global.memstore.upperLimit和hfile.block.cache.size的和是一個不錯的選擇。
Compaction
•hbase.hstore.compactionThreshold/hbase.hregion.majorcompaction
hbase.hstore.compactionThreshold執行compaction的store數量,默認值是3,如果需要提高查詢性能,當然是storefile的數量越小,性能越好,但是執行compaction本身有性能資源的開消,如果regionserver頻繁在compacion對性能影響也很大。hbase.hregion.majorcompaction表示majorcompaction的周期,默認是1 天,majorcompaction與普通的compaction的區別是majorcompaction會清除過期的歷史版本數據,同時合並storefile,而普通的compaction只做合並,通常都是majorcompaction,調為0,然后手工定期的去執行一下majorcompaction,適當調小點compacionThreshold。
Region
•hbase.hregion.max.filesize
配置region大小,0.94.12版本默認是10G,region的大小與集群支持的總數據量有關系,如果總數據量小,則單個region太大,不利於並行的數據處理,如果集群需支持的總數據量比較大,region太小,則會導致region的個數過多,導致region的管理等成本過高,如果一個RS配置的磁盤總量為3T*12=36T數據量,數據復制3份,則一台RS服務器可以存儲10T的數據,如果每個region最大為10G,則最多1000個region,如此看,94.12的這個默認配置還是比較合適的,不過如果要自己管理split,則應該調大該值,並且在建表時規划好region數量和rowkey設計,進行region預建,做到一定時間內,每個region的數據大小在一定的數據量之下,當發現有大的region,或者需要對整個表進行region擴充時再進行split操作,一般提供在線服務的hbase集群均會棄用hbase的自動split,轉而自己管理split。