我想知道Google的BigTable中的行键值是否有最大长度.
我知道文档建议将散列作为创建相同长度的密钥的潜在解决方案,但在我的场景中,如果我在密钥中包含文件路径,我可以更好地分组相关数据.
我在多个文件(存储在存储桶中)中有一个大的csv数据集(> 5TB),我需要将其导入到Google Bigtable中.文件格式如下:
rowkey,s1,s2,s3,s4
text,int,int,int,int
...
有一个带有hbase的importtsv函数是完美的但是在Windows中使用Google hbase shell时似乎没有这个功能.可以使用这个工具吗?如果没有,实现这一目标的最快方法是什么?我对hbase和Google Cloud几乎没有经验,所以一个简单的例子会很棒.我已经看到一些使用DataFlow的类似示例,但除非必要,否则不愿意学习如何执行此操作.
谢谢
我在10个实例的bigtable中有一个小表(大小为100Mb)。当我尝试每1分钟扫描/获取一行时,通话延迟超过300毫秒。如果我打的是更频繁的呼叫,例如每秒一次,则延迟为50-60ms。我不确定如何改善低频通话的性能。这是预期的行为吗?还是我做错了什么。
这是我的测试代码。我为两个与大表的hbase客户端连接创建了一个执行程序。但是低频连接响应的速度要比进行更频繁呼叫的连接慢。
有什么建议么?
package com.bids;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.CellUtil;
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.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.filter.FilterList;
import org.apache.hadoop.hbase.util.Bytes;
import org.fusesource.jansi.AnsiConsole;
public class BTConnectTest {
public static void main(String[] args) throws IOException, InterruptedException {
Configuration hBaseConfig = HBaseConfiguration.create();
hBaseConfig.set("google.bigtable.project.id", "xxxxxxx");
hBaseConfig.set("google.bigtable.cluster.name", "hbase-test1");
hBaseConfig.set("google.bigtable.zone.name", "us-central1-b");
hBaseConfig.set("hbase.client.connection.impl", "com.google.cloud.bigtable.hbase1_1.BigtableConnection");
ExecutorService executor = Executors.newSingleThreadExecutor();
final Connection bigTableConnection1 = ConnectionFactory.createConnection(hBaseConfig, executor); …
Run Code Online (Sandbox Code Playgroud) 我正在使用HBase API访问Google Cloud Bigtable,但每当我尝试删除列时:
Delete delete = new Delete(r.getRow());
delete.addColumn(CF, Bytes.toBytes(d.seqid()));
delete.addColumn(CF, COL_LEASE);
tasksTable.delete(delete);
Run Code Online (Sandbox Code Playgroud)
我得到了UnsupportedOperationException
:
java.lang.UnsupportedOperationException: Cannot delete single latest cell.
at com.google.cloud.bigtable.hbase.adapters.DeleteAdapter.throwIfUnsupportedPointDelete(DeleteAdapter.java:85)
at com.google.cloud.bigtable.hbase.adapters.DeleteAdapter.adapt(DeleteAdapter.java:141)
at com.google.cloud.bigtable.hbase.adapters.HBaseRequestAdapter.adapt(HBaseRequestAdapter.java:71)
at com.google.cloud.bigtable.hbase.BigtableTable.delete(BigtableTable.java:307)
at queue.BigTableRowBackedQueue.poll(BigTableRowBackedQueue.java:54)
Run Code Online (Sandbox Code Playgroud)
我可以从HBase Java客户端中删除整行,并且可以使用HBase shell删除单个列.
如何在不删除Java客户端中的行的情况下删除列?
根据Beam网站,
通常,对管道代码执行本地单元测试比调试管道的远程执行更快更简单.
我想为我的Beam/Dataflow应用程序使用测试驱动开发,因为这个原因写入Bigtable.
然而,遵循Beam测试文档我陷入了僵局--PAssert没用,因为输出PCollection包含org.apache.hadoop.hbase.client.Put对象,它们不会覆盖equals方法.
我无法获得 PCollection 的内容来对它们进行验证,因为
不可能直接获取PCollection的内容 - Apache Beam或Dataflow管道更像是应该进行什么处理的查询计划,其中PCollection是计划中的逻辑中间节点,而不是包含数据.
那么除了手动运行之外,我该如何测试这个管道呢?我正在使用Maven和JUnit(在Java中,因为所有Dataflow Bigtable Connector似乎都支持).
BigTable是否支持类似于INCR
Redis的原子增量操作?
有此功能的Golang库BT - https://godoc.org/cloud.google.com/go/bigtable#ReadModifyWrite.Increment。但是,我可以看到一个应用程序的两个实例尝试同时增加的情况,但是由于竞争条件,它只能增加一次。
我正在研究BigTable如何压缩我的数据.
我已经将1,5GB装入1张桌子; 大约500k行包含1列,平均每个单元格大约3kb.在进一步的测试中,将向包含具有相似大小的类似数据的这些行添加更多列.
每个单元格中的数据目前是一个JSON序列化的字典数组[平均10元],如:
[{
"field1": "100.10",
"field2": "EUR",
"field3": "10000",
"field4": "0",
"field5": "1",
"field6": "1",
"field7": "0",
"field8": "100",
"field9": "110.20",
"field10": "100-char field",
"dateField1": "1970-01-01",
"dateField2": "1970-01-01",
"dateTimeField": "1970-01-01T10:10:10Z"
},{
"field1": "200.20",
"field2": "EUR",
"field3": "10001",
"field4": "0",
"field5": "1",
"field6": "0",
"field7": "0",
"field8": "100",
"field9": "220.30",
"field10": "100-char field",
"dateField1": "1970-01-01",
"dateField2": "1970-01-01",
"dateTimeField": "1970-01-01T20:20:20Z"
}, ...]
Run Code Online (Sandbox Code Playgroud)
BigTable控制台向我显示集群保持1,2GB.因此它将我插入的1,5GB压缩到原始大小的大约80%.然而,当它们存储在单元中时对一个典型的字符串进行Gzipping但是给出了约20%的压缩比.
因此,Big Iable的压缩性能对我来说似乎很低,因为我插入的数据包含大量重复值(例如字典键).我理解BigTable的压缩速度,但我希望它能在我的数据上表现更好.
对于上述数据,压缩率是否为80%,或者预期值较低?除了重新构建我正在上传的数据之外,是否有任何改进压缩的技术?
谢谢!
尝试通过Java lib与Google Cloud Bigtable交互,并在成功创建连接对象后,发送"list"命令,我收到以下command.run()
方法错误:
command.run(connection, argsList.subList(1, argsList.size()));
Run Code Online (Sandbox Code Playgroud)
特别:
Jul 06, 2015 1:12:15 PM io.grpc.transport.netty.ProtocolNegotiators$AbstractBufferingHandler fail
SEVERE: Transport failed during protocol negotiation
io.netty.channel.ChannelPipelineException: io.grpc.transport.netty.ProtocolNegotiators$1$1.handlerAdded() has thrown an exception; removed.
at io.netty.channel.DefaultChannelPipeline.callHandlerAdded0(DefaultChannelPipeline.java:600)
at io.netty.channel.DefaultChannelPipeline.callHandlerAdded(DefaultChannelPipeline.java:582)
at io.netty.channel.DefaultChannelPipeline.addFirst0(DefaultChannelPipeline.java:124)
at io.netty.channel.DefaultChannelPipeline.addFirst(DefaultChannelPipeline.java:108)
at io.netty.channel.DefaultChannelPipeline.addFirst(DefaultChannelPipeline.java:291)
at io.netty.channel.DefaultChannelPipeline.addFirst(DefaultChannelPipeline.java:246)
at io.grpc.transport.netty.ProtocolNegotiators$AbstractBufferingHandler.channelRegistered(ProtocolNegotiators.java:233)
at io.netty.channel.ChannelHandlerInvokerUtil.invokeChannelRegisteredNow(ChannelHandlerInvokerUtil.java:32)
at io.netty.channel.DefaultChannelHandlerInvoker.invokeChannelRegistered(DefaultChannelHandlerInvoker.java:50)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRegistered(AbstractChannelHandlerContext.java:114)
at io.netty.channel.DefaultChannelPipeline.fireChannelRegistered(DefaultChannelPipeline.java:833)
at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:487)
at io.netty.channel.AbstractChannel$AbstractUnsafe.access$100(AbstractChannel.java:401)
at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:461)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:322)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:356)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:703)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.IllegalStateException: NPN/ALPN extensions not installed
Run Code Online (Sandbox Code Playgroud)
跟随; https://cloud.google.com/bigtable/docs/samples-simple-cli
任何帮助将非常感谢!
我目前正在尝试深入研究Cassandra的数据模型及其与Bigtable的关系,但结果却出现了关于Column Family概念的强烈头痛.
主要是我的问题已被问及已经回答.但是,我对答案不满意:)
首先,我阅读了Bigtable论文,尤其是关于其数据模型,即数据的存储方式.据我所知,Bigtable中的每个表基本上依赖于维度行,列和时间的多维稀疏映射.地图按行排序.列可以使用名称约定系列进行分组:限定符到列族.因此,单行可以包含多个列族(请参阅本文中的示例图).
虽然有人说Cassandra依赖于Bigtable数据模型,但我多次读到,在Cassandra中,列族包含多行,并且在某种程度上与关系数据存储中的表相当.这与Bigtable的方法相反,其中一行可以包含多个列族?什么是第一,列系列或行:)?这些概念是否具有可比性?
假设有一行包含一个列族和一列。该列族有一个 gc 策略,并且该列中的所有值都刚刚过期。
那么,该行会发生什么呢?该行会被垃圾收集器删除吗?或者,它仍然存在并且可以访问吗?
我检查了文档,但只发现了一些模糊的评论,来自https://cloud.google.com/bigtable/docs/overview#empty-cells
Cloud Bigtable 表中的空单元格不占用任何空间。每行本质上是键/值条目的集合,其中键是列族、列限定符和时间戳的组合。如果某行不包含特定键的值,则该键/值条目根本不存在。
就我而言,根据上述文本,该集合将为空。然后,我的问题是空集合是否仍然存在。
理想情况下,我希望自动删除空行,以防止表中有太多空行。如果空行没有自动删除,除了编写一个程序来扫描和删除这些行之外,是否有任何方法可以自动删除空行?