codecamp

故障排除和调试HBase:NameNode

NameNode

有关NameNode的更多信息,请参阅HDFS

表和区域的HDFS利用率

要确定HBase在HDFS上使用的空间大小,请使用NameNode中的hadoop shell命令。例如:

hadoop fs -dus /hbase/

返回所有HBase对象的总磁盘利用率。

hadoop fs -dus /hbase/myTable

返回HBase表'myTable'的总磁盘利用率。

hadoop fs -du /hbase/myTable

...返回HBase表'myTable'下的区域列表及其磁盘利用率。

有关HDFS shell命令的更多信息,请参阅HDFS FileSystem Shell文档

浏览HBase对象的HDFS

有时需要探索HDFS上存在的HBase对象。这些对象可能包括WAL(预写日志),表,区域,StoreFiles等。最简单的方法是使用运行在端口50070上的NameNode Web应用程序。NameNode Web应用程序将提供指向集群中所有DataNode的链接,以便可以无缝浏览它们。

集群中HBase表的HDFS目录结构是:

/hbase
    /data
        /<Namespace>                    (Namespaces in the cluster)
            /<Table>                    (Tables in the cluster)
                /<Region>               (Regions for the table)
                    /<ColumnFamily>     (ColumnFamilies for the Region for the table)
                        /<StoreFile>    (StoreFiles for the ColumnFamily for the Regions for the table)

HBase WAL的HDFS目录结构是:

/hbase
    /WALs
        /<RegionServer>    (RegionServers)
            /<WAL>         (WAL files for the RegionServer)

大小为零的WALs,其中包含数据

问题:获取RegionServer的WALs目录中的所有文件的列表时,一个文件的大小为0,但它包含数据。

答:这是HDFS的特殊情况。当前正在写入的文件的大小似乎为0,但一旦关闭,它将显示其真实大小。

用例

用于查询HBase对象的HDFS的两个常见用例是研究表的未压缩程度。如果每个ColumnFamily都有大量StoreFiles,则表明需要进行主要压缩。此外,在进行主要压缩后,如果生成的StoreFile为“small”,则表明需要减少表的ColumnFamilies。

意外的文件系统增长

如果您看到HBase意外地增加了文件系统的使用,两个可能的原因是快照和WAL。

快照

创建快照时,HBase会保留在快照时重新创建表状态所需的一切。这包括已删除的单元格或过期版本。因此,您应该精心规划快照的使用模式,并且应该修剪不再需要的快照。快照存储在/hbase/.hbase-snapshot中,用于还原快照所需的存档位于/hbase/archive/<_tablename_>/<_region_>/<_column_family_>/。

*不要*通过HDFS手动管理快照或存档。HBase提供API和
用于管理它们的HBase Shell命令。有关更多信息,请参阅<< ops.snapshots >>。
WAL

预写日志(WAL)存储在HBase根目录的子目录中,通常是/hbase/,具体取决于它们的状态。已经处理好的WALs存储在/hbase/oldWALs/并且损坏的WAL存储在/hbase/.corrupt/中,以供检查。如果其中一个子目录的大小正在增长,请检查HBase服务器日志以找出未正确处理WAL的原因。

如果您使用复制并且/hbase/oldWALs/使用的空间超出预期,请记住,只要存在对等项,复制被禁用时就会保存WAL。

不要通过HDFS手动管理WAL。

故障排除和调试HBase:MapReduce
故障排除和调试HBase:网络
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

HBase快速入门

HBase批量加载

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }