• [问题求助] 本地连接HBASE,报错:NoNode for /hbase/hbaseid
    哪位大神帮忙看看本地连大数据平台的HBASE,配置文件都是从平台下载下来的,没有改动,然后本地安装了Hadoop和zookeeper
  • [问题求助] 本地连接HBASE,报错:NoNode for /hbase/hbaseid
    本地连接HBASE,报错:NoNode for /hbase/hbaseid
  • [基础组件] HDFS节点滚动重启时,HBase集群的RegionServer WAL写,偶现超时卡住
    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)
  • [技术干货] 空安全编程的典范:Java 8中的安全应用指南-转载
    一、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 
  • [技术干货] HBase命令行操作-转载
     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 
  • [基础组件] 调用API接口获取Hbase Master metrics Dump信息
    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);
  • [运维管理] Hbase2.0.2版本 region分裂后,有个子region无法提供数据查询
    一个region分列后, 有个子region无法提供数据查询。 查询这个region的数据出现java.lang.ArrayIndexOutOfBoundsException。发现这个提供不了服务的region还存在对父的依赖。求大佬帮忙看下啥情况。。。。
  • [问题求助] java代码获取HBASE原生webUI的jmx数据
    想通过Java代码获取MRS中HBASE的json格式的jmx数据,调用的是https://xxx/20026/HBase/HMaster/126/jmx接口,请求这个接口的时候,会跳转到登录接口,然后会跳转多次,获取的cookie也访问不通这个接口
  • [运维管理] FusionInsight HD 6513升级 FusionInsight HD 6517版本,是否支持部分组件(如kafka 、zookeeper)在线升级,其他组件离线升级?
    FusionInsight HD 6513升级 FusionInsight HD 6517版本,是否支持部分组件在线升级,其他组件离线升级?
  • [运维管理] 线下HD 6517版本集群,业务客户端到集群之前的端口22禁用对使用上有没有影响?
    线下HD 6517版本集群,业务客户端到集群之前的端口22禁用对使用上有没有影响?
  • [环境搭建] 线下HD 6517版本 ,扩容hbase是否可以只扩容一台?
    线下HD 6517版本 ,扩容hbase是否可以只扩容一台?
  • [运维管理] habse 每次写入提交的条数多少条合适?为什么?
    habse 每次写入提交的条数多少条合适?为什么?
  • [环境搭建] hbase客户端报错
    下载客户端,执行hbase shell后报 insuffcient permissions
  • [最佳实践] HBase经典案例集锦一:读写慢(2-7):应用使用Filter触发全表扫描导致查询慢
    【问题现象】客户测业务发现使用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维护经典案例集锦
    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业务查询报错并发查询达到了上限★★★★注:论坛帖子部分案例图片上传异常,案例分帖子和博客两种方式发布。
总条数:145 到第
上滑加载中