我正在尝试将超过100亿条记录转储到hbase中,平均每天将增长1000万条记录,然后尝试对这些记录进行全表扫描。我知道在hdfs上进行全扫描比hbase要快。
hbase被用来在hdfs上排序不同的数据。应用程序正在使用spark构建。
数据被批量加载到hbase上。由于各种2g限制,区域大小从最初的3g测试减少到了1.2g(仍需要更详细的调查)。
“扫描缓存”为1000,“缓存块”处于关闭状态
hbase的总大小在6tb范围内,可跨5个区域服务器(节点)生成数千个区域(建议低(100)。
spark作业基本上在每一行上运行,然后根据范围内的列计算一些内容。
在hbase上使用spark,内部使用tableinputformat,作业运行了7.5小时。
为了绕过区域服务器,创建了一个快照并改用tablesnapshotinputformat。这项工作在大约5.5小时内完成。
问题
当从hbase读入spark时,这些区域似乎决定了spark分区,从而决定了2g限制。因此,缓存的问题是否意味着区域大小需要很小?
tablesnapshotinputformat绕过了区域服务器并直接从快照中读取数据,它还创建了一个按区域拆分的表,因此仍然会陷入上述区域大小问题。可以直接从hfiles读取键值,在这种情况下,分割大小由hdfs块大小决定。是否有一个scanner或其他util的实现,可以直接从hfile读取行(具体来说是从快照引用的hfile)?
有没有其他的指标来说明可能有助于提高性能的配置?例如hdfs块大小等?主要的用例是大部分的全表扫描。
1条答案
按热度按时间62lalag41#
事实证明,这其实相当快。性能分析表明,问题在于一个ip地址的对象表示形式之一,即inetaddress需要花费大量时间来解析一个ip地址。我们决定使用原始字节来提取我们需要的任何东西。这本身就使得这项工作在大约2.5小时内完成。将该问题建模为map-reduce问题,并在mr2上运行相同的上述更改,结果表明它可以在大约1小时20分钟内完成。迭代特性和较小的内存占用帮助mr2实现了更多的并行性,因此速度更快。