【问题标题】:Hbase performanceHbase 性能
【发布时间】:2011-08-30 13:11:40
【问题描述】:

我正在使用 Spring + Datanucleus JDO + Hbase。 Hbase 处于具有两个节点的完全分布式模式。我在这里面临严重的性能问题。

我的 webapp 可以被认为是一个 pinger,它只是不断地 ping URL 并存储它们的响应。 Hnce 我的应用程序运行多个线程以将 INSERT 插入到数据库中。我观察到,一旦并发写入的数量超过 20 左右,插入就会开始花费大量时间(有些甚至需要 1000 秒)。当发生这种情况时,READS 也开始失败,我的 webapp 无法从数据库中提取任何数据(我的 webapp 挂起)。我不是一个 NoSQL 数据库专家,因此不知道从哪里开始寻找性能。

我的主要配置是: Zookeeper 法定人数:1 Hbase 区域服务器:2 数据节点:2 hbase.zookeeper.property.maxClientCnxns:400 复制因子:3

我需要增加 Hbase 的堆大小吗?高 WRITE 吞吐量是否会对 READ 产生影响?

我的配置有问题吗?似乎写入文件会比将数据写入 Hbase 更快。这是我在 Hbase 的最后一次拍摄。请帮忙

【问题讨论】:

    标签: nosql hadoop hbase datanucleus


    【解决方案1】:

    我看到的最大问题是您在 2 个节点上运行 HBase,复制因子为 3(实际上实际上只有 2 个,因为只有 2 个节点要复制到)。这意味着必须将所有写入复制到两个节点。 HBase 确实需要至少 5 个左右的节点才能运行。

    听起来你正在填充你的第一个区域并且它正在分裂,在分裂期间一旦 MemStore 填满你将开始阻塞。您应该考虑创建预先拆分为多个区域的表,以便为您提供均匀的写入分布。

    我建议查看HBase book's chapter on performance,特别是pre-splitting tables 上的部分。

    您还应该使用compression,确保您可以使用本机压缩(gzip、lzo 或 snappy) - 不要使用纯 Java 压缩,否则您会非常慢,链接讨论了一点。

    【讨论】:

    • @cftrnas 似乎我必须做很多事情才能使其值得生产。一个问题。除了 hbase 之外,我还需要对 hadoop 进行任何优化吗?我做了最小的事情,比如增加 ulimit 等等。我目前不能在两个以上的节点上运行 hbase,将复制因子降低到 1 会有帮助吗?
    • 如果这只是一个开发/测试安装,那么是的 - 肯定会使用 1 的复制因子。在生产中,您将需要(需要)更多节点和 3 的复制。我也不能强调如何重要的是在创建它们时pre-split your tables。还要考虑压缩和增加区域大小。
    • 感谢您的链接。实际上,我做了其中提到的大部分事情,现在能够获得良好的 READ 性能。我的应用程序挂起(读取时)的主要问题是我的区域服务器的 hbase.regionserver.handler.count 的默认值(10)。当发生接近 30 次写入时,我无法阅读。我没有对表进行预拆分,因为我的最大表大小为 19 Mb,而 Hbase 默认情况下会在达到 256 Mb 时对其进行拆分。你是否仍然建议预先拆分,因为我的 WRITE through put 非常低。
    • 我观察到,在我最大的(~19 Mb)表上,WRITE 需要 7 秒到 63 秒之间的任何时间。我观察到的另一件事是,写入所需的时间从 7 秒线性增加到 63 秒,然后又下降到 7 秒,然后以相同的方式振荡。这个可以吗 ?我目前只有一个区域服务器和一个区域用于我最大的表(其他表微不足道
    • 您的密钥是否按顺序插入?如果不是,那么是的 - 创建两个拆分将允许您的两个节点都工作。如果它们是顺序的(并且考虑到您的数据听起来可能是),那么您应该考虑更改行键。另请查看OpenTSDB - 听起来它可能对您正在做的事情非常有用。
    【解决方案2】:

    如果您要使用多个线程写入 HBase,则需要确保尽可能频繁地重用 HBaseConfiguration。否则,每个线程都会建立一个新的连接,ZK 最终会停止提供连接,直到旧的连接关闭。

    一个快速的解决方案是让单例处理将配置传递给您的 HTable 对象。这应该保证使用相同的配置,并将您的并发连接最小化。

    【讨论】:

    • 我使用 datanucleus 作为 ORM 并且正在使用 PersistenceManagerFactory。这是我工作的抽象级别,我没有访问 HTable 和相关的 hbase 对象。我猜 PMF 会重用这些连接。但是我找不到一种方法可以使用带有 hbase 的 datanuceus 指定连接池(与 RDBMS 不同)。在我工作的抽象级别上连接池是否可行?
    • 我对 Datanucleus 真的不熟悉。所以我不能评论连接是如何处理的。但是,您可以转到 HBase master 的 Web 控制台(类似于 ipofhbasemaster:60010)并查看 ZK 转储。这将列出所有到 ZK 的活动连接。如果超过 400(您的限制),它将拒绝新连接。
    猜你喜欢
    • 2014-04-27
    • 2014-08-12
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    • 2014-04-04
    相关资源
    最近更新 更多