-
哪位大神帮忙看看本地连大数据平台的HBASE,配置文件都是从平台下载下来的,没有改动,然后本地安装了Hadoop和zookeeper
-
本地连接HBASE,报错:NoNode for /hbase/hbaseid
-
HDFS的DataNode在低频率重启过程中,HBase集群的RegionServer WAL写流程,会偶现以下WAL超时卡住错误,如何解决呢:2024-08-26 15:35:13,294 ERROR [RS_CLOSE_REGION-regionserver/cqbs028:60020-1] executor.EventHandler: Caught throwable while processing event M_RS_CLOSE_REGIONjava.lang.RuntimeException: org.apache.hadoop.hbase.exceptions.TimeoutIOException: Failed to get sync result after 300000 ms for txid=818811, WAL system stuck?at org.apache.hadoop.hbase.regionserver.handler.CloseRegionHandler.process(CloseRegionHandler.java:116)at org.apache.hadoop.hbase.executor.EventHandler.run(EventHandler.java:104)Caused by: org.apache.hadoop.hbase.exceptions.TimeoutIOException: Failed to get sync result after 300000 ms for txid=818811, WAL system stuck?at org.apache.hadoop.hbase.regionserver.wal.SyncFuture.get(SyncFuture.java:148)at org.apache.hadoop.hbase.regionserver.wal.AbstractFSWAL.blockOnSync(AbstractFSWAL.java:711)at org.apache.hadoop.hbase.regionserver.wal.AsyncFSWAL.sync(AsyncFSWAL.java:631)at org.apache.hadoop.hbase.regionserver.wal.WALUtil.doFullAppendTransaction(WALUtil.java:158)at org.apache.hadoop.hbase.regionserver.wal.WALUtil.writeMarker(WALUtil.java:136)at org.apache.hadoop.hbase.regionserver.wal.WALUtil.writeRegionEventMarker(WALUtil.java:101)at org.apache.hadoop.hbase.regionserver.HRegion.writeRegionCloseMarker(HRegion.java:1145)at org.apache.hadoop.hbase.regionserver.HRegion.doClose(HRegion.java:1684)at org.apache.hadoop.hbase.regionserver.HRegion.close(HRegion.java:1501)at org.apache.hadoop.hbase.regionserver.handler.CloseRegionHandler.process(CloseRegionHandler.java:104)在停止RegionServer的过程中,也有可能会因为WAL卡住,停止RegionServer慢:java.lang.RuntimeException: org.apache.hadoop.hbase.exceptions.TimeoutIOException: Failed to get sync result after 300000 ms for txid=818767, WAL system stuck?at org.apache.hadoop.hbase.regionserver.handler.CloseRegionHandler.process(CloseRegionHandler.java:116)at org.apache.hadoop.hbase.executor.EventHandler.run(EventHandler.java:104)at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)at java.base/java.lang.Thread.run(Thread.java:829)Caused by: org.apache.hadoop.hbase.exceptions.TimeoutIOException: Failed to get sync result after 300000 ms for txid=818767, WAL system stuck?at org.apache.hadoop.hbase.regionserver.wal.SyncFuture.get(SyncFuture.java:148)at org.apache.hadoop.hbase.regionserver.wal.AbstractFSWAL.blockOnSync(AbstractFSWAL.java:711)at org.apache.hadoop.hbase.regionserver.wal.AsyncFSWAL.sync(AsyncFSWAL.java:631)at org.apache.hadoop.hbase.regionserver.wal.WALUtil.doFullAppendTransaction(WALUtil.java:158)at org.apache.hadoop.hbase.regionserver.wal.WALUtil.writeMarker(WALUtil.java:136)at org.apache.hadoop.hbase.regionserver.wal.WALUtil.writeRegionEventMarker(WALUtil.java:101)at org.apache.hadoop.hbase.regionserver.HRegion.writeRegionCloseMarker(HRegion.java:1145)at org.apache.hadoop.hbase.regionserver.HRegion.doClose(HRegion.java:1684)at org.apache.hadoop.hbase.regionserver.HRegion.close(HRegion.java:1501)at org.apache.hadoop.hbase.regionserver.handler.CloseRegionHandler.process(CloseRegionHandler.java:104)
-
一、Base64 编码解码 1.1 基本的编码和解码 Base64 编码: 使用 Base64.getEncoder().encodeToString(originalInput.getBytes()) 对原始字符串进行编码。 Base64.getEncoder() 返回一个 Base64.Encoder 实例,调用 encodeToString() 方法将原始字符串的字节数组编码为Base64字符串。 Base64 解码: 使用 Base64.getDecoder().decode(encodedString) 对Base64编码后的字符串进行解码。 Base64.getDecoder() 返回一个 Base64.Decoder 实例,调用 decode() 方法将Base64编码后的字符串解码为原始的字节数组。 使用 new String(decodedBytes) 将解码后的字节数组转换为字符串。 注意事项: 在实际应用中,确保使用相同的编码和解码方法,以避免数据损坏或不正确的解码结果。 Java 8 中的 java.util.Base64 类提供了方便且高效的Base64编码和解码功能,适用于处理字符串数据的安全传输和存储。 public static void main(String[] args) { // 原始字符串 String originalInput = "Hello World!"; // 编码为Base64 String encodedString = Base64.getEncoder().encodeToString(originalInput.getBytes()); System.out.println("Encoded string: " + encodedString); // 解码Base64 byte[] decodedBytes = Base64.getDecoder().decode(encodedString); String decodedString = new String(decodedBytes); System.out.println("Decoded string: " + decodedString); } // 输出 Encoded string: SGVsbG8gV29ybGQh Decoded string: Hello World! 1.2 URL 和文件名安全的编码解码器 URL 和文件名安全的 Base64 编码: 使用 Base64.getUrlEncoder().encodeToString(originalInput.getBytes("utf-8")) 对原始字符串进行URL和文件名安全的Base64编码。 Base64.getUrlEncoder() 返回一个 Base64.Encoder 实例,调用 encodeToString() 方法将原始字符串的字节数组编码为URL和文件名安全的Base64字符串。 URL 和文件名安全的 Base64 解码: 使用 Base64.getUrlDecoder().decode(encodedString) 对URL和文件名安全的Base64编码后的字符串进行解码。 Base64.getUrlDecoder() 返回一个 Base64.Decoder 实例,调用 decode() 方法将Base64编码后的字符串解码为原始的字节数组。 使用 new String(decodedBytes, "utf-8") 将解码后的字节数组转换为字符串。 注意事项: URL 和文件名安全的Base64编码会使用 - 替换 +,并且使用 _ 替换 /,以确保编码结果可以安全地在URL和文件名中使用。 如果使用的是不同的字符集编码(例如 utf-8),请确保在编码和解码过程中使用相同的字符集,以避免数据损坏或不正确的解码结果。 public static void main(String[] args) throws UnsupportedEncodingException { // 原始字符串 String originalInput = "Hello World!"; // URL 和文件名安全的 Base64 编码 String encodedString = Base64.getUrlEncoder().encodeToString(originalInput.getBytes("utf-8")); System.out.println("Encoded string (URL safe): " + encodedString); // 解码 URL 和文件名安全的 Base64 byte[] decodedBytes = Base64.getUrlDecoder().decode(encodedString); String decodedString = new String(decodedBytes, "utf-8"); System.out.println("Decoded string: " + decodedString); } // 输出 Encoded string (URL safe): SGVsbG8gV29ybGQh Decoded string: Hello World! 1.3 MIME Base64编码和解码 MIME Base64编码与普通的Base64编码在行尾添加换行符,以便在电子邮件等MIME(Multipurpose Internet Mail Extensions)环境中进行传输。 MIME Base64 编码: 使用 Base64.getMimeEncoder().encodeToString(originalInput.getBytes("utf-8")) 对原始字符串进行MIME Base64编码。 Base64.getMimeEncoder() 返回一个 Base64.Encoder 实例,调用 encodeToString() 方法将原始字符串的字节数组编码为MIME Base64字符串。 MIME Base64 解码: 使用 Base64.getMimeDecoder().decode(encodedString) 对MIME Base64编码后的字符串进行解码。 Base64.getMimeDecoder() 返回一个 Base64.Decoder 实例,调用 decode() 方法将MIME Base64编码后的字符串解码为原始的字节数组。 使用 new String(decodedBytes, "utf-8") 将解码后的字节数组转换为字符串。 注意事项: MIME Base64编码会在每行末尾添加换行符 \r\n,以便适应电子邮件等格式要求。 如果使用的是不同的字符集编码(例如 utf-8),请确保在编码和解码过程中使用相同的字符集,以避免数据损坏或不正确的解码结果。 public static void main(String[] args) throws UnsupportedEncodingException { // 原始字符串 String originalInput = "Hello World!"; // MIME Base64 编码 String encodedString = Base64.getMimeEncoder().encodeToString(originalInput.getBytes("utf-8")); System.out.println("Encoded string (MIME):" + encodedString); // 解码 MIME Base64 byte[] decodedBytes = Base64.getMimeDecoder().decode(encodedString); String decodedString = new String(decodedBytes, "utf-8"); System.out.println("Decoded string: " + decodedString); } // 输出 Encoded string (MIME):SGVsbG8gV29ybGQh Decoded string: Hello World! 二、Optional类 java.util.Optional 类是用来处理可能为null的值的容器。提供了一种优雅的方式来避免 NullPointerException,并且可以更清晰地表达某个值可能不存在的情况。 创建 Optional 对象 Optional.of(value):如果 value 不为 null,则创建一个包含指定值的 Optional 对象;如果 value 为 null,则会抛出 NullPointerException。 Optional.ofNullable(value):无论 value 是否为 null,都会创建一个对应的 Optional 对象。如果 value 是 null,则创建一个空的 Optional 对象。 检查是否有值 isPresent() :检查 Optional 对象中是否包含值。 获取值 get():如果 Optional 对象中有值,则返回该值;否则抛出 NoSuchElementException。 处理空值 orElse(defaultValue):如果 Optional 对象中有值,则返回该值;否则返回 defaultValue。 orElseGet(Supplier):如果 Optional 对象中有值,则返回该值;否则调用 Supplier 提供的方法来获取默认值。 条件操作 ifPresent() :在 Optional 对象非空时执行特定操作。 过滤值 filter() 方法过滤 Optional 对象中的值。 映射值 map() 或 flatMap() :对 Optional 对象中的值进行映射操作。 public static void main(String[] args) { // 创建一个包含非空值的 Optional 对象 Optional<String> optional1 = Optional.of("Hello"); System.out.println("Optional 1 value: " + optional1.get()); // 创建一个可能为 null 的 Optional 对象 String nullableValue = null; Optional<String> optional2 = Optional.ofNullable(nullableValue); System.out.println("Optional 2 is present? " + optional2.isPresent()); // 获取 Optional 对象中的值 String value = optional1.get(); System.out.println("Value: " + value); // 检查 Optional 对象中是否有值 if (optional1.isPresent()) { System.out.println("Optional contains value."); } else { System.out.println("Optional is empty."); } // 使用 orElse 提供默认值 String result1 = optional2.orElse("Default Value"); System.out.println("Result 1: " + result1); // 使用 orElseGet 提供默认值 String result2 = optional2.orElseGet(() -> { // 处理逻辑,返回默认值 return "Default Value from Supplier"; }); System.out.println("Result 2: " + result2); // 如果 Optional 对象中有值,则执行操作 optional1.ifPresent(val -> System.out.println("Value is present: " + val)); // 过滤值 Optional<String> filteredOptional = optional1.filter(val -> val.startsWith("H")); System.out.println("Filtered Optional value: " + filteredOptional.orElse("Not found")); // 映射值 Optional<String> transformedOptional = optional1.map(val -> val.toUpperCase()); System.out.println("Transformed Optional value: " + transformedOptional.orElse("No value")); // 抛出异常 try { value = optional2.orElseThrow(() -> new IllegalArgumentException("Value is required.")); System.out.println("Value: " + value); } catch (IllegalArgumentException e) { System.out.println("Exception: " + e.getMessage()); } } // 输出 Optional 1 value: Hello Optional 2 is present? false Value: Hello Optional contains value. Result 1: Default Value Result 2: Default Value from Supplier Value is present: Hello Filtered Optional value: Hello Transformed Optional value: HELLO Exception: Value is required. 三、Nashorn JavaScript Java 8 引入了 Nashorn 作为新的 JavaScript 引擎,用于替代旧版的 Rhino 引擎,可以在 Java 应用程序中执行 JavaScript 代码。Nashorn 通过优化和与 Java 的本地集成提供了更好的性能。 执行内联脚本: public static void main(String[] args) throws Exception { // 创建 Nashorn 脚本引擎 ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn"); // 执行 JavaScript 代码 engine.eval("print('Hello Nashorn!')"); } 传递变量: public static void main(String[] args) throws Exception { ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn"); // 将 Java 变量传递给 JavaScript engine.put("name", "Alice"); engine.eval("print('Hello, ' + name + '!')"); } 高级特性: Java 互操作性: JavaScript 代码可以直接与 Java 类和对象交互。 函数式编程: Nashorn 支持 lambda 表达式和流式 API,使其更符合现代 JavaScript 标准。 性能: 由于其现代化设计和优化技术,Nashorn 通常比 Rhino 更快。 // Java 类 public class Person { public String getName() { return "Alice"; } } // JavaScript 代码 engine.eval("var person = new Person(); print(person.getName());"); 命令行工具: Nashorn 还配备了一个命令行工具 (jjs),用于直接从终端执行 JavaScript 文件,这对于测试和调试非常有用。 $ jjs script.js 1 与 Java 应用程序集成: 可以将 Nashorn 集成到 Java 应用程序中,用于脚本支持、规则引擎和动态行为等多种用途。 提供了在 Java 的稳健性和 JavaScript 的脚本能力之间进行灵活结合的能力。 懒惰也是天生的,勤奋需自己努力,一放松就懒了 ———————————————— 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog.csdn.net/qq_51601665/article/details/140437976
-
2. HBase数据库——命令行操作 为什么不直接取名叫HBase命令行操作而是还要加上数据库三个字?因为直接叫HBase总是会忽略它是数据库这个事情,导致有些时候不能很快的反应过来并且理解一些东西,故而特地加了数据库三个字 HBase数据库的命令行操作也就是通过HBase的命令行终端并通过命令的形式来操作HBase数据库,即HBase数据库的表、数据等的增删改查等操作 该文档还会在后续的学习与使用中继续补充和完善,主要内容围绕HBase数据库的命令行命令进行 2.1. 启动HBase及其命令行 想要通过HBase命令行进行HBase数据库的表、数据等的增删改查等操作需要先打开HBase的命令行 注意:下面出现的${HBASE_HOME}、${HBASE_HOME}代指的是Hadoop和HBase的主目录路径 启动HBase及其命令行一般流程: HBase安装完成并且能够正常启动与使用 开启HBase集群${HBASE_HOME}/bin/start-hbase.sh 注意:HBase非单机模式启动前你需要先启动Hadoop集群${HADOOP_HOME}/sbin/start-dfs.sh 打开HBase的命令行${HBASE_HOME}/bin/hbase shell eg:我的${HADOOP_HOME}=/usr/local/hadoop2,${HBASE_HOME}=/usr/local/hbase,并且HBase集群配置是非单机模式的。所以我的前置操作如下: # 1.启动Hadoop集群 /usr/local/hadoop2/sbin/start-dfs.sh # 2.启动HBase集群 /usr/local/hbase/bin/start-hbase.sh # 3.启动HBase命令行 /usr/local/hbase/bin/hbase shell 一些可能会用到的HBase操作知识: HBase的web页面地址:http://<HBase主节点的IP或映射名>:端口号,HBAse的wbe默认端口号是16010或60010。eg:HBase主节点IP:168.254.200.101,端口号默认,则HBase的Wbe页面访问地址为:http://168.254.200.101:16010/ 退出HBase命令行:在HBase命令行输入exit或按下Ctrl+D 关闭HBase集群:${HBASE_HOME}/bin/stop-hbase.sh 我的关闭HBase集群命令就是:/usr/local/hbase/bin/stop-hbase.sh 关闭Hadoop集群: 2.2. HBase数据库的常用操作命令 注意:下面将以Student表的操作为例,并且有些命令只提供示例不提供说明(有时候一例胜千言,学习是需要一定的关联、联想、抽象能力的) 一些杂七杂八的思考: HBase是NoSQL键值数据库,通过一组值(行键、列族名、列标识、时间戳、状态标识(删除标记还是…标记))作为键来标识一个数据值。后面的HBase数据库操作命令也是基于这种关系 HBase键的内容需要包含行键、列族名、列标识是因为HBase表数据的基本结构 HBase键的内容需要包含时间戳、状态标记是跟HBase数据的更新方式有关,HBase的数据更新方式是冗余的方式,时间戳体现版本,标记体现操作 HBase的对象层次结构: 系统:版本、状态,拥有的表与表的状态? 命令空间?表隶属于命令空间 表:表名、拥有的列族 列族:列族名、列族属性 数据:所属列族+列标识、数据值、数据时间戳、数据状态 注意:下面的命令出现顺序就以这个简陋的、不科学的HBase的对象层次结构来组织 2.2.1. 获取帮助命令 命令格式:help ['具体命令'] 使用示例: # 获取HBase命令帮助(会输出所有HBase命令及详情?) help #获取status这条具体命令的详细信息 help 'status' 2.2.2. HBase系统层次操作命令 命令 格式格式 使用示例 示例任务 查看服务器状态 status status 查看服务器状态 查看版本信息 version version 查看版本信息 查询有哪些表 list list 查询有哪些表 检查表是否存在 exists ‘表名’ exists ‘Student’ 检查Student表是否存在 表的启用/禁用命令 enable和disable可以启用或禁用表,is_enabled和is_disabled可以检查表是否被禁用或启用 eg:使用示例(以Student表为例): # 禁用表 disable 'Student' # 检查表是否被禁用 is_disabled 'Student' # 启用表 enable 'Student' # 检查表是否被启用 is_enabled 'Student' 2.2.3. HBase的表层次操作命令 3.1、创建表 命令格式: create ‘表名称’, ‘列族名称1’,‘列族名称2’, ... ,‘列名称N’ #或: create '表名', {NAME=>'列族名',VERSIONS=>'值',...}, {NAME=>'列族名',VERSIONS=>'值',...},... eg:创建一张名为Student的表,包含基本信息(baseInfo)、学校信息(schoolInfo)两个列族 create 'Student','baseInfo','schoolInfo' 3.2、查看表的基本信息 命令格式: desc ‘表名’ #或者? describe ‘表名’ eg:查看我们创建的那一张Student表的基本信息 describe 'Student' 1 3.3、删除表 命令格式: drop '表名' #注意:删除表前需要先禁用表-->>disable '表名' eg:删除Student表 # 禁用Student表 disable 'Student' # 删除Student表 drop 'Student' 3.4、表的修改 列族的增加、删除、修改操作是不是有点像代码的顺序执行操作?如果是不存在的就添加,如果存在则后运行的列族信息覆盖前运行的列族信息,。。。 3.4.1、添加列族 命令格式: alter ‘表名’, ‘列族名’ eg:为Student表添加列族teacherInfo alter 'Student', 'teacherInfo' 3.4.2、更改列族的信息 eg:更改Student表的列族baseInfo的存储版本的限制为3(默认情况下,列族只存储一个版本的数据,如果需要存储多个版本的数据,则需要修改列族的属性。修改后可通过desc命令查看) alter 'Student',{NAME=>'baseInfo',VERSIONS=>3} 3.4.3、删除列族 命令格式: alter ‘表名’, {NAME => ‘列族名’, METHOD => ‘delete’} eg:删除Student表的teacherInfo列族 alter 'Student', {NAME => 'teacherInfo', METHOD => 'delete'} 思考:列族的删除就是把他的METHOD 属性更改改为delete,也就是标记为删除状态?如果是这种的话,HBase真是把标记这种手段玩到了极致,因为HBase对数据的删除、修改也是通过标记来区分。。。window等操作系统的文件删除操作也是标记,也就是那个回收站功能。。。延迟操作? 2.2.4. HBase的数据层次操作命令 4.1、插入数据 命令格式: put ‘表名’, ‘行键’,‘列族:列’,‘值’ 1 注意:如果新增数据的行键值、列族名、列名与原有数据完全相同,则相当于更新操作 eg:下面为Student插入一些数据的示例 put 'Student', 'rowkey1','baseInfo:name','tom' put 'Student', 'rowkey1','baseInfo:birthday','1990-01-09' put 'Student', 'rowkey1','baseInfo:age','29' put 'Student', 'rowkey1','schoolInfo:name','Havard' put 'Student', 'rowkey1','schoolInfo:localtion','Boston' put 'Student', 'rowkey2','baseInfo:name','jack' put 'Student', 'rowkey2','baseInfo:birthday','1998-08-22' put 'Student', 'rowkey2','baseInfo:age','21' put 'Student', 'rowkey2','schoolInfo:name','yale' put 'Student', 'rowkey2','schoolInfo:localtion','New Haven' put 'Student', 'rowkey3','baseInfo:name','maike' put 'Student', 'rowkey3','baseInfo:birthday','1995-01-22' put 'Student', 'rowkey3','baseInfo:age','24' put 'Student', 'rowkey3','schoolInfo:name','yale' put 'Student', 'rowkey3','schoolInfo:localtion','New Haven' put 'Student', 'wrowkey4','baseInfo:name','maike-jack' 4.2、删除数据 eg:一些删除示例 # 删除指定行(删除Student表的rowkey3这一行数据) delete 'Student','rowkey3' # 删除指定行中指定列的数据(删除Student表的rowkey3这一行的baseInfo:name这一列的数据) delete 'Student','rowkey3','baseInfo:name' 4.3、修改(更新)数据 插入数据,如果新增数据的行键值、列族名、列名与原有数据完全相同,则相当于更新操作 4.4、查询数据 查询数据的命令较为复杂,对查询数据命令特别的说明,请看后面的文档 2.2.5. HBase的数据层次操作命令——查询数据 hbase中访问数据有两种基本的方式: 按指定rowkey获取数据:get方法; 按指定条件获取数据:scan方法。 scan查询可以设置begin和end参数来访问一个范围内所有的数据。get查询本质上就是begin和end相等的一种特殊的scan查询 5.1、Get查询 eg:Get查询的一些使用示例 # 获取指定行中所有列的数据信息 get 'Student','rowkey3' # 获取指定行中指定列族下所有列的数据信息 get 'Student','rowkey3','baseInfo' # 获取指定行中指定列的数据信息 get 'Student','rowkey3','baseInfo:name' 5.2、scan查询 命令格式:scan ‘表名’,{条件列表} scan命令的条件修饰符包括: COLUMN,用于指定列族或列。条件格式:COLUMN=>“列或列族列表” STARTROW(指定查询的ROWKEY起始行,会先根据这个key定位到region,再向后扫描)。条件格式:STARTROW=>“起始行键” STOPROW(指定查询的ROWKEY结束行)。条件格式:STOPROW=>“起始行键” TIMERANGE(限定查询的数据的时间戳范围)。条件格式:TIMERANGE=>[开始时间戳,截止时间戳] VERSIONS(版本数,即最多显示几个版本)。条件格式:VERSIONS=>版本数 FILTER(按条件过滤行)。条件格式:FILTER=>“过滤器列表” Limit(限制查询结果行数)。条件格式:Limit=>限制返回结果的行数 没有设置条件,即:scan '表名',则查询整表数据。scan的条件有点像是指定显示的内容 单个条件参数的scan命令,命令的”{}“可以省略:scan '表名',条件 5.2.1、查询整表数据 # 查询Student表整表数据 scan 'Student' 5.2.2、COLUMN条件参数,条件查询/指定查询 # 查询指定列簇的数据 scan 'Student', {COLUMN=>'baseInfo'} # 注意:因为是单个条件参数,所以花括号可以省略(下同),即命令可以写作: scan 'Student', COLUMN=>'baseInfo' # 查询指定列的数据 scan 'Student', {COLUMNS=> 'baseInfo:birthday'} # 查询指定多个列或列族 sana 'Student',{COLUMNS=> "baseInfo:birthday,schoolInfo"} # 查询从rowkey2这个rowkey开始,查找下两个行的最新3个版本的name列的数据: scan 'Student', {COLUMNS=> 'baseInfo:name',STARTROW => 'rowkey2',STOPROW => 'wrowkey4', LIMIT=>2, VERSIONS=>3} 5.2.3、FILTER条件参数,条件过滤/过滤查询 Filter可以设定一系列条件(过滤器)来进行过滤。 eg:一些示例 # 行键等于24 scan 'Student', FILTER=>"RowFilter(=,'binary:24')" # 行键包含24 scan 'Student', FILTER=>"RowFilter(=,'substring:24')" # 行键的前缀等于wr scan 'Student', FILTER=>"PrefixFilter('wr')" # 列族等于24 scan 'Student', FILTER=>"FamilyFilter(=,'binary:24')" # 列族包含24 scan 'Student', FILTER=>"FamilyFilter(=,'substring:24')" # 列标识符等于“b”的,注意是列标识符不是列族!!! scan 'Student', FILTER => "QualifierFilter(=,'binary:b')" # 列标识符含有“b”的,注意是列标识符不是列族!!! scan 'Student', FILTER => "QualifierFilter(=,'substring:b')" # 列标识符前缀为birth的,注意是列标识符不是列族!!! scan 'Student', FILTER=>"ColumnPrefixFilter('birth')" # 时间戳?范围还是...?这个过滤器暂时不了解 TimestampsFilter(参数1,参数2) # 列值等于24的所有数据 scan 'Student', FILTER=>"ValueFilter(=,'binary:24')" # 列值包含yale的所有数据 scan 'Student', FILTER=>"ValueFilter(=,'substring:yale')" # 针对单个列的值进行过滤,这个过滤器暂时不了解 SingleColumnValueFilter # 限制返回的行数,这个过滤器暂时不了解 PageFilter 思考:FILTER的这些过滤器,如ValueFilter(=,‘binary:24’),ValueFilter(=,‘substring:yale’),ColumnPrefixFilter(‘birth’),是不是长得像函数调用? ##FILTER中支持多个过滤条件通过括号、AND和OR进行组合: eg: # 列名中的前缀为birth且列值中包含1998的数据 scan 'Student', FILTER=>"ColumnPrefixFilter('birth') AND ValueFilter ValueFilter(=,'substring:1998')" #上面这条命令是不是错了?应该改成下面这样才对? scan 'Student', FILTER=>"ColumnPrefixFilter('birth') AND ValueFilter(=,'substring:1998')" 1 2 3 4 5.2.4、多条件参数的scan查询 # 完整点的多条件参数的scan查询示例 scan 'Student', {COLUMNS=> 'baseInfo:name',STARTROW => 'rowkey2',STOPROW => 'wrowkey4', LIMIT=>2, VERSIONS= ———————————————— 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog.csdn.net/2301_77843163/article/details/137204220
-
1 接口调用获取Hbase Master metrics Dump信息获取Hbase Master metrics dump信息的调用接口为https://OMS浮动IP/Hbase/Hmaster/实例编号/jmx调用hbase接口之前需要进行认证,按下面步骤进行认证后再调用hbase接口1.1 调用登录接口1获取lt变量GET https://OMS浮动IP:20009/cas/loginQuery params: 参数类型说明servicestring实际调用的接口例:https://OMS浮动IP:20009/cas/login?service=https://OMS浮动IP:20026/HBase/HMaster/40/jmx返回结果:返回的是一个html文件,需要获取input标签name="lt"的value值<div class="row btn-row"> <input name="lt" value="58d6188......WhhSUo0Q0dLNHloMzU4UQ==" /> <input name="_eventId" value="submit" /> <input name="geolocation" /> ......</div>1.2 调用登录接口进行认证POST https://OMS浮动IP:20009/cas/loginquery params:参数类型说明servicestring实际调用的接口usernamestring用户名passwordstring密码ltstring从1.1中获取的lt的value_eventIdstring值:submit例:https://OMS浮动IP:20009/cas/login?service=https://OMS浮动IP:20026/HBase/HMaster/40/jmx&username=xxx&password=xxx&_eventId=submit<=958fb91b......返回结果:无1.3 调用/HBase/HMaster/实例编号/jmxGET /HBase/HMaster/实例编号/jmxQuery params: 无例:https://OMS浮动IP:20026/HBase/HMaster/40/jmx返回结果:{ "beans": [ { "name": "Hadoop:service=HBase,name=Master,sub=Coprocessor.Master.CP_org.apache.hadoop.hbase.hindex.global.master.GlobalIndexMasterCoprocessor", "modelerType": "Master,sub=Coprocessor.Master.CP_org.apache.hadoop.hbase.hindex.global.master.GlobalIndexMasterCoprocessor", "tag.Context": "master", "tag.Hostname": "" }, { "name": "Hadoop:service=HBase,name=Master,sub=Coprocessor.Master.CP_org.apache.hadoop.hbase.security.access.ReadOnlyClusterEnabler", "modelerType": "Master,sub=Coprocessor.Master.CP_org.apache.hadoop.hbase.security.access.ReadOnlyClusterEnabler", "tag.Context": "master", "tag.Hostname": "" },......2 代码调用/HBase/HMaster/实例编号/jmx接口代码调用可以参考manager-example样例代码在代码中获取httpclient后,按顺序调用1.1、1.2和1.3中的接口(HttpManager是manager-example样例代码中的类)HttpManager httpManager = new HttpManager();String operationName = "";String operationUrl = ""; operationName = "CasLogGetLt";operationUrl = "https://OMS浮动IP:20009/cas/login?service=https://OMS浮动IP:20026/HBase/HMaster/40/jmx";String content = httpManager.sendHttpGetRequest(httpClient, operationUrl, operationName);String lt = HtmlUtil.getLt(content); operationName = "CasLogAuth";operationUrl = "https://OMS浮动IP:20009/cas/login?service=https://OMS浮动IP:20026/HBase/HMaster/40/jmx&username=xxx&password=xxx&_eventId=submit=" + lt ;httpManager.sendHttpPostRequestWithString(httpClient, operationUrl, null, operationName); operationName = "HBaseMasterJmx";operationUrl = "https://OMS浮动IP:20026/HBase/HMaster/40/jmx";String responseLineContent = httpManager.sendHttpGetRequest(httpClient, operationUrl, operationName);System.out.println(responseLineContent);
-
一个region分列后, 有个子region无法提供数据查询。 查询这个region的数据出现java.lang.ArrayIndexOutOfBoundsException。发现这个提供不了服务的region还存在对父的依赖。求大佬帮忙看下啥情况。。。。
-
想通过Java代码获取MRS中HBASE的json格式的jmx数据,调用的是https://xxx/20026/HBase/HMaster/126/jmx接口,请求这个接口的时候,会跳转到登录接口,然后会跳转多次,获取的cookie也访问不通这个接口
-
FusionInsight HD 6513升级 FusionInsight HD 6517版本,是否支持部分组件在线升级,其他组件离线升级?
-
线下HD 6517版本集群,业务客户端到集群之前的端口22禁用对使用上有没有影响?
-
线下HD 6517版本 ,扩容hbase是否可以只扩容一台?
-
habse 每次写入提交的条数多少条合适?为什么?
-
下载客户端,执行hbase shell后报 insuffcient permissions
-
【问题现象】客户测业务发现使用PrefixFilter前缀过滤查询条件时,查询时间达到50多秒。【问题分析】首先了解到客户的rowkey设计为活动编号后两位|活动编号|用户openid|回馈编号,其中用户openid有两种数据,1、客户编号(18位表名为数字),2、openid28位字符。客户侧测试发现以13分区开头的 28位openid为rowkey前缀查询时会花费50多s,但是以18位客户换号查询却很快。经过分析,客户在hbase shell里面查询时,查询慢的前缀每次会连接多个regionserver,通过打开客户端debug日志,发现在连接19region分区时从09:42:20,一直到09:43:15才结束,这个过程耗费了55s左右。通过查看13和19分区的region大小,发现19分区数据有1.9G左右,数据量比较大。scan扫描规则说明:1) 查询一个region不为空,会扫描到下一个region。2) 扫描到下一个region时,碰到比28位短的,会触发开源单,会继续扫描。3) region为空会继续继续扫描。4) 直到扫描到一个28位的后缀,并且没有匹配到数据的时候扫描会结束。流程具体说明:scan流程中结束scan的标志位为moreResults = false,那么就要求 isFilterDone与result.empty都为true的时候,moreResults才会被置为false,其中isFilterDone表示查询的region是否完成了Filter操作,result.empty表示该region查询结果是否为空。例如:在查询13Region的时候,由于匹配到数据了,那么result.isEmpty=false,isFilterDone=true,则moreResults = true表示还有更多数据,所以会继续扫描到下一个14Region。扫描14Region时,由于数据都是15位,所以触发了开源单 https://issues.apache.org/jira/browse/HBASE-14397单中的现象,由于length【解决方案】使用setRowPrefixFilter与setStartRow来代替PrefixFilter,RowPrefixFilter会自动精确计算endrow,会让查询在starrow与endrow的范围内进行查询。效率会有较大提升。 复制【机制说明】prefixFilter原理:当prefixFilter比rowkey短的情况下,以PrefixFilter(“333”)为例,需要返回的是rowkey以“333”为前缀的数据。实际的扫描流程如图所示:碰到rowkey=111的行时,发现111比前缀333小,因此直接跳过111这一行去扫下一行,返回状态码NEXT_ROW;下一个Cell的rowkey=222,仍然比前缀333小,因此继续扫下一行,返回状态NEXT_ROW;下一个Cell的rowkey=333,前缀和333匹配,返回column=f:ddd这个cell个用户,返回状态码为INCLUDE;下一个Cell的rowkey仍为333,前缀和333匹配,返回column=f:eee这个cell给用户,返回状态码为INCLUDE;下一个Cell的rowkey为444,前缀比333大,不再继续扫描数据。RowPrefixFilter原理:RowprefixFilter在使用时,设置了startrow,那么在源码中会自动计算一个精确的字典序的endrow,结果就是prefixFilter在查询时只扫描了startrow和endrow这一区间内的数据,会大大降低查询时间。
-
HBase全部案例集合见维护宝典:https://support.huawei.com/hedex/hdx.do?docid=EDOC1100222546&lang=zh&idPath=22658044|22662728|22666212|22396131(FusionInsight HD&MRS租户面集群故障案例(6.5.X-8.X)->维护故障类->hbase->常见故障)HBase日志说明:cid:link_16HBase经典案例、总结、重大问题见下表:经典案例分类序号案例(点击标题查看详情)出现频次读写异常1-1dn进程处于tl或者D状态导致regionserver查询超时报错★★★★★1-2应用进程多用户认证或者频繁认证导致业务读写异常★★★★☆1-3Regionserver端Region too Busy导致读写异常★★★1-4业务侧直接内存过小导致读写报错★★★1-5 sssd服务异常导致HBase查询业务失败★★★★1-6本地副本损坏导致读写报错(HBase开源bug)★★★1-7应用端full gc导致查询报错★★1-8 hbase put与scan 超时报错operationTimeout1-9 读写数据业务侧报IOExceptions to xxx regionserver读写慢2-1应用端或者服务端存在DNS导致读写慢★★★★2-2HBase connection非单例模式导致读数据慢★★★2-3服务端网络或者慢盘引起wal写入慢,导致HBase写入慢 ★★★★★2-4应用端网络异常导致应用写数据耗时较长★★★2-5Regionserver gc参数未按照最优生效导致性能较差★★★2-6连接池设置较小导致应用读写慢★★★2-7 应用使用Filter触发全表扫描导致查询慢★★★2-8业务频繁调用count,导致HBase 读写慢★★★2-9 spark任务写入hbase慢hbase服务不可用3-1zookeeper频繁Full GC导致hbase服务不可用★★★★3-2meta表或者namespace表所在节点regionserver重启导致hbase服务不可用★★★★3-3ldap负载过高导致hbase检查报服务不可用★★3-4健康检查脚本执行错误(Nodeagent gc、OS内存不足、无法分配线程等)报服务不可用★★★运行中异常自动重启4-1磁盘慢或者磁盘坏道导致regionserver写wal超过300s,触发重启★★★★★4-2regionserver与hmaster节点时间差超过30s,导致regionserver异常重启★★★4-3hbase表配置ZSTD压缩算法触发jdk bug,regionserver异常重启★★★4-4ARM jdk bug导致regionserver异常重启★★4-5节点上配置了DNS导致regionserver异常重启★★★4-6内存配置不合理导致regionserver jvm pause 超过90s导致rs异常重启★★★4-7健康检查脚本执行错误(Nodeagent gc、OS内存不足、无法分配线程等)认为regionserver不正常导致regionserver异常重启★★★4-8 传输大文件导致HMaster健康检查超时重启4-9 NullPointerException导致RegionServer重启4-10 协处理器jar包未放置正确位置,导致RegionServer重启4-11 ZooKeeper实例Full GC导致RegionServer异常重启人为重启出现异常5-1Region上线慢导致HBase启动超时★★★5-2/hbase/MasterProcWALs目录下文件过多导致HBase启动失败★★5-3RS启动失败,报Distribute keytab failed5-4jdk bug 30~32G 导致regionserver或者Hmaster启动异常★★★5-5WAL日志分裂异常导致HBase启动超时★★★5-6 启动集群后region上线很慢hbase mr6-1region 状态异常导致bulkload导数据报Wrong number of partitions in keyset★★★6-2bulkload AM FULL GC导致MapReduce执行慢★★HBase gc7-1 业务读写热点造成regionserver 频发gc★★★★★7-2频繁调用Getclusterstatus接口导致Hmaster FULL GC★★★7-3Phoenix内存泄露导致regionserver频繁FULL GC★★★7-4 业务侧数据读取设置不合理导致RegionSever Full GCPhoenix问题8-1Phoenix业务查询超时★★★★8-2Phoenix业务查询报错并发查询达到了上限★★★★注:论坛帖子部分案例图片上传异常,案例分帖子和博客两种方式发布。
上滑加载中
推荐直播
-
华为AI技术发展与挑战:集成需求分析的实战指南
2024/11/26 周二 18:20-20:20
Alex 华为云学堂技术讲师
本期直播将综合讨论华为AI技术的发展现状,技术挑战,并深入探讨华为AI应用开发过程中的需求分析过程,从理论到实践帮助开发者快速掌握华为AI应用集成需求的框架和方法。
去报名 -
华为云DataArts+DWS助力企业数据治理一站式解决方案及应用实践
2024/11/27 周三 16:30-18:00
Walter.chi 华为云数据治理DTSE技术布道师
想知道数据治理项目中,数据主题域如何合理划分?数据标准及主数据标准如何制定?数仓分层模型如何合理规划?华为云DataArts+DWS助力企业数据治理项目一站式解决方案和应用实践告诉您答案!本期将从数据趋势、数据治理方案、数据治理规划及落地,案例分享四个方面来助力企业数据治理项目合理咨询规划及顺利实施。
去报名
热门标签