我想知道 HBase 是否支持 RowKey 扫描的通配符。类似于:
select * from TABLE where KEY like '%SEARCH_KEY%';
Run Code Online (Sandbox Code Playgroud)
据我所知,如果我们对行键的前缀有一定的了解,我们可以使用部分键扫描(并且 HBase 在该扫描方面非常有效)。但是,如果我们没有信息前缀(意味着搜索键可能位于 RowKey 中的任何位置),那么 Hbase 必须运行全表扫描,对吗?
另外,如何在 HBase 中形成这样的查询(代码或通过 shell)?
Scan s = new Scan();
s.addFamily(Bytes.toBytes("cf1"));
s.setCaching(cacheRows);
s.setCacheBlocks(false);
s.setStartRow("30.0.2.2\01441756800\0");
s.setStopRow("30.0.2.3\01441756800\0");
ResultScanner scanner = table.getScanner(s);
long rows = 0;
try {
for (Result rr = scanner.next(); rr != null; rr = scanner.next()) {
rows++;
}
} finally {
scanner.close();
}
System.out.println("Total no of rows = " + rows);
Run Code Online (Sandbox Code Playgroud)
当我使用 cacheRows = 100 或 10000 运行上面的代码时,它会打印 Total no of rows = 480000
当我使用 cacheRows = 100000 运行上面的代码时,它会打印 Total no of rows = 10090
cacheRows = 10083 打印 480000
cacheRows = 10084 打印 …
我想从 hbase 表中选择一些行,如何设置多重过滤器?看来这AND不起作用。我尝试过两种方法。
scan 'hbase_table', { FILTER => "(RowFilter(=, 'regexstring:39$') AND SingleColumnValueFilter ('binary:family','binary:qualifier', '=', 'value')" }
Run Code Online (Sandbox Code Playgroud)
或者
scan 'hbase_table', {LIMIT => 10, FILTER => "(RowFilter.new(CompareFilter::CompareOp.valueOf('EQUAL'), RegexStringComparator.new("39$")) AND SingleColumnValueFilter.new(Bytes.toBytes('family'), Bytes.toBytes('qualifier'), CompareFilter::CompareOp.valueOf('EQUAL'), Bytes.toBytes('value')))", COLUMNS => 'family:qualifier'}
Run Code Online (Sandbox Code Playgroud)
非常感谢
在 hbase 中,我有列数:名称、城市……
并非所有列都有值(例如,某些行只能有“名称”)
我想提取行中的所有列+列的时间戳(按特定顺序),如果值为空,我想返回空字符串。
我面临的问题是,我必须Result通过“family”和“qualifier”访问列(我无法通过索引访问,result.listCells().get(i)因为会跳过空值)
scan.addColumn(Bytes.toBytes("personal data"), Bytes.toBytes("name"));
scan.addColumn(Bytes.toBytes("personal data"), Bytes.toBytes("city"));
ResultScanner scanner = table.getScanner(scan);
for (Result result = scanner.next(); result != null; result = scanner.next()){
byte [] valCity = result.getValue("personal data", "city"); //can't get timestamp using this
//check if valCity null write ("") else write the value
//next column...
}
Run Code Online (Sandbox Code Playgroud) 我在 IntelliJ IDE 中运行 HbaseTestingUtility 时遇到问题,我可以看到以下错误可能是由于文件名太长造成的:
16/03/14 22:45:13 WARN datanode.DataNode: IOException in BlockReceiver.run():
java.io.IOException: Failed to move meta file for ReplicaBeingWritten, blk_1073741825_1001, RBW
getNumBytes() = 7
getBytesOnDisk() = 7
getVisibleLength()= 7
getVolume() = C:\Users\user1\Documents\work\Repos\hadoop-analys\reporting\mrkts-surveillance\target\test-data\9654a646-e923-488a-9e20-46396fd15292\dfscluster_6b264e6b-0218-4f30-ad5b-72e838940b1e\dfs\data\data1\current
getBlockFile() = C:\Users\user1\Documents\work\Repos\hadoop-analys\reporting\mrkts-surveillance\target\test-data\9654a646-e923-488a-9e20-46396fd15292\dfscluster_6b264e6b-0218-4f30-ad5b-72e838940b1e\dfs\data\data1\current\BP-429386217-192.168.1.110-1457991908038\current\rbw\blk_1073741825
bytesAcked=7
bytesOnDisk=7 from C:\Users\user1\Documents\work\Repos\hadoop-analys\reporting\mrkts-surveillance\target\test-data\9654a646-e923-488a-9e20-46396fd15292\dfscluster_6b264e6b-0218-4f30-ad5b-72e838940b1e\dfs\data\data1\current\BP-429386217-192.168.1.110-1457991908038\current\rbw\blk_1073741825_1001.meta to C:\Users\user1\Documents\work\Repos\hadoop-analys\reporting\mrkts-surveillance\target\test-data\9654a646-e923-488a-9e20-46396fd15292\dfscluster_6b264e6b-0218-4f30-ad5b-72e838940b1e\dfs\data\data1\current\BP-429386217-192.168.1.110-1457991908038\current\finalized\subdir0\subdir0\blk_1073741825_1001.meta
at org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.FsDatasetImpl.moveBlockFiles(FsDatasetImpl.java:615)
at org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.BlockPoolSlice.addBlock(BlockPoolSlice.java:250)
at org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.FsVolumeImpl.addBlock(FsVolumeImpl.java:229)
at org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.FsDatasetImpl.finalizeReplica(FsDatasetImpl.java:1119)
at org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.FsDatasetImpl.finalizeBlock(FsDatasetImpl.java:1100)
at org.apache.hadoop.hdfs.server.datanode.BlockReceiver$PacketResponder.finalizeBlock(BlockReceiver.java:1293)
at org.apache.hadoop.hdfs.server.datanode.BlockReceiver$PacketResponder.run(BlockReceiver.java:1233)
at java.lang.Thread.run(Thread.java:745)
Caused by: 3: The system cannot find the path specified.
Run Code Online (Sandbox Code Playgroud)
知道吗,我如何指定 Hbasetestingutility 的基目录而不使用这个庞大的起始目录?
谢谢,
我正在使用hbase的本机API编写Hbase Java客户端.
我可以使用我创建的Hbase客户端连接到hbase并运行各种查询.我使用"hbase classpath"命令运行我的hbase客户端.这解决了所有依赖项.
现在我们希望这个hbase客户端成为项目的一部分,并将其作为其组件之一.因此,在集成之后,我们需要将其作为项目的War文件的一部分运行(我们需要将其作为rest API的一部分运行).我添加了hbase-site.xml.hdfs-site.xml和core-site.xml作为资源,并设置为Resource to configuration object.
Configuration conf = HBaseConfiguration.create()
URL hbaseUrl=HbaseManagerServiceImpl.class.getClassLoader().getResource("hbase-site.xml");
conf.addResource(hbaseUrl.toString());
URL hdfsUrl=HbaseManagerServiceImpl.class.getClassLoader().getResource("hdfs-site.xml");
conf.addResource(hdfsUrl.toString());
URL coreUrl=HbaseManagerServiceImpl.class.getClassLoader().getResource("core-site.xml");
conf.addResource(coreUrl.toString());
Run Code Online (Sandbox Code Playgroud)
当我试图只添加core-site.xml时,我收到错误说"包含失败"哪个文件存在于该主机上,因此在资源较旧时添加了该文件,这解决了我的问题.
HTable table = new HTable(conf , "tableName");
Run Code Online (Sandbox Code Playgroud)
我可以成功扫描并获取行操作并获取结果.
Scan scanTable = new Scan();
Get row = new Get(key);
Run Code Online (Sandbox Code Playgroud)
但是当我尝试做"Result rowData = table.get(row); "
我的代码卡住了,没有显示任何错误.
我可以使用""hbase classpath"命令运行相同的代码.我是否需要设置$ HADOOP_CLASSPATH和$ HBASE_CLASSPATH变量,我通过jetty webserver运行我的代码.
以下是错误跟踪:
java.io.InterruptedIOException: Giving up trying to location region in meta: thread is interrupted.
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.locateRegionInMeta(HConnectionManager.java:1391)
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.locateRegion(HConnectionManager.java:1169)
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.locateRegion(HConnectionManager.java:1123)
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getRegionLocation(HConnectionManager.java:964)
at org.apache.hadoop.hbase.client.RegionServerCallable.prepare(RegionServerCallable.java:72)
at org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithRetries(RpcRetryingCaller.java:113)
at org.apache.hadoop.hbase.client.HTable.get(HTable.java:780)
at …Run Code Online (Sandbox Code Playgroud) 我是CDH的新手(我使用的当前版本是5.7.1)
我已经添加了HBase thrift角色并在Hue中设置,但我仍然遇到以下问题.

HBase Browser Failed to authenticate to HBase Thrift Server, check authentication configurations.
Run Code Online (Sandbox Code Playgroud)
有人可以帮我吗?
对于通过 Spark Streaming 处理的数据的长期存储(多次写入,少量读取),哪个更好的选择:Parquet、HBase 还是 Cassandra?或者是其他东西?有哪些权衡?
我想将 hbase 类路径添加到我的 spark 中,但是在运行hbase classpath命令时出现错误。
我在 env 中使用 java 1.8 在本地设置了 hadoop 3.2.0。
$ hbase 类路径
/usr/lib/hadoop/libexec/hadoop-functions.sh:第 2364 行:HADOOP_ORG.APACHE.HADOOP.HBASE.UTIL.GETJAVAPROPERTY_USER:无效的变量名称 /usr/lib/hadoop/libexec/hadoop-functions.sh:第 2459 行:HADOOP_ORG.APACHE.HADOOP.HBASE.UTIL.GETJAVAPROPERTY_OPTS:无效的变量名错误:无法找到或加载主类org.apache.hadoop.hbase.util.GetJavaProperty
我想优化我对 HBase 的使用以加快写入速度。我有一个任务从 Kafka 主题中读取,然后基于该主题写入 HBase。由于 Kafka 将记录所有要写入的内容,因此很容易从中恢复。我正在阅读“HBase High Perormance Cookbook”,并有以下说明:
请注意,这带来了关于何时使用 WAL 以及何时不使用的有趣想法。默认情况下,WAL 写入处于开启状态,并且数据始终写入 WAL。但是,如果您确定可以重写数据或少量丢失不会影响处理的整体结果,则可以禁用对 WAL 的写入。WAL 提供了简单而明确的恢复。这是默认情况下始终启用它的根本原因。在无法预料数据丢失的情况下,您应该将其保留为默认设置;否则,将其更改为使用 memstore。或者,您可以计划 DR(灾难恢复)
如何将此恢复配置为自动?我看到两个选项:
我该怎么做?