hbase历险记
目录
hbase历险记
寻找问题
分析原因
解决方案
方案1(资源问题、失败)
方案2(成功)
寻找问题
不知道你是不是有这样的疑惑。我kylin是个单机,我使用的hbase是个集群,但内存全在某一台机器上了。其实,这里kylin是单机还是集群都无所谓的,但hbase作为存储,为什么集群内存占用到了一台。
我就在hbase shell中使用了hbase负载均衡的命令
balance_switch true
过了一会发现并没有用。
我就用knox做了网关,把hbase的页面信息代理了出来,进去浏览了一圈发现了
通过网上的寻找,就是它。
分析原因
通过反复查看寻找到了那个region的蛛丝马迹
这里面就发现了,这个table记录了相当多的phoenix信息,而phoenix,是我以前用于测试同步数据的,现在早已没用了,而图中的那个1,就是目前仅存在的问题,进去看看。
通过进入这个表,成功发现了这就是一个region,无法完成regionServer的分配,一直尝试造成的。
解决方案
通过查阅资料,发现如下两种。
- 手动分配
- 主动删除
这里提前解释一下,为什么我两种方案都尝试了。虽然我在前面已经发现这个region现在就是个垃圾,但我抱着宁烂误缺的态度想试一下。
方案1(资源问题、失败)
进入hbase的客户端,我执行了。
assign '3696b0faae0b67cdfe1627afd107cb2e'
但过了一会,发现了问题,我的服务器资源疯狂飙升,我想赶快停了,这下麻烦了,磁盘越来越多。
后面通过查询,发现了我没对WAL 文件做限制,他最终会导致我磁盘全部占满,而所有服务都无法运行。
所以我想不尝试了,直接迅速快照、关闭hbase集群、删除/hbase/MasterProcWALs无用文件,删除回收站文件、添加配置、重启。
限制WAL文件配置如下,添加到hbase-site.xml中:
<!-- 限制 WAL 文件的最大大小,以防止过大的 MasterProcWALs 文件 -->
<property><name>hbase.regionserver.hlog.maxfilesize</name><value>1073741824</value> <!-- 1 GB,根据需要进行调整 -->
</property>
<property><name>hbase.regionserver.hlog.roll.multiplier</name><value>0.95</value>
</property>
<property><name>hbase.master.logcleaner.ttl</name><value>600</value> <!-- 10分钟,根据需要进行调整 -->
</property>
还好重启后没有异常。
方案2(成功)
上面不行,那我就直接删除元数据了,执行删除命令,
deleteall 'hbase:meta','SYSTEM:LOG,\x08\x00\x00\x00,1615171260407.3696b0faae0b67cdfe1627afd107cb2e.'
发现了 0 row受影响。
我突然反映过来无法识别\x,或者转义成了其他字符。然后我用匹配查询试一下,
发现了我还没办法直接删了。果断使用java程序来删除。
代码如下:
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.Delete;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.util.Bytes;/*** @author * @version 1.0* @date 2024/1/16 14:13* @desc :*/
public class DeleteFromMetaTable {public static void main(String[] args) throws Exception {Configuration config = HBaseConfiguration.create();try (Connection connection = ConnectionFactory.createConnection(config);Table metaTable = connection.getTable(TableName.valueOf("hbase:meta"))) {// Specify the row key you want to deletebyte[] rowKey = Bytes.toBytes("SYSTEM:LOG,\u0008\u0000\u0000\u0000,1615171260407.3696b0faae0b67cdfe1627afd107cb2e.");// Create Delete object with the specified row keyDelete delete = new Delete(rowKey);// Execute the delete operationmetaTable.delete(delete);System.out.println("Delete operation completed.");}}
}
注意我已经将\x替换。
打包,上传,运行,出现了:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/HBaseConfiguration
接着我又修改了hadoop-env.sh文件,添加了
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/app/software/hbase-2.0.0/lib/*
这个需要根据自己的hbase相关jar包决定。分发集群(无需重启)
再运行java程序,成功。
接下来关闭hbase集群,删除hdfs上/hbase/MasterProcWALs的文件。重启集群。
进入到hbase页面查看(需等一会),发现,异常的region已经不在。
接下来是负载均衡问题,一般是自动开启的。页面查看
手动触发:
hbase(main):001:0> balance_switch true
好一次惊心动魄的冒险。