我们正在努力对拥有数据的hdfs进行查询。
我们有一个带有检测结果的kafka来源。这些检测是实时进行的,我们希望能够搜索数据。作为集成工具,我们尝试通过水槽或Spark将数据保存到hdfs,然后使用 hive spark jdbc / odbc服务器在hdfs上查询数据之后。
目前,这种方法和 hive spark jdbc / odbc服务器很好,因为我们并不在乎实时,但现在我们想几乎实时的查询。
为了获得更好的性能,我们尝试使用较少数量的sequence files
或parquet files
,但是仍然需要太多时间。
因此,我们正在研究HBase
,但是我们需要使用在蜂巢中使用的自定义UDF
。由于Impala doesn't support complex types和嵌套类型(我们确实有这些人员),我们意识到我们无法使用Impala。因此,我们选择使用HBase。
由于我们拥有SQL
条语句,它们能够使用配置单元处理数据,所以我希望保留类似SQL的语句,因此我们在Hbase
顶部检查了Apache Phoenix。
但是在尝试使用Hbase
之前,我想知道HBase是否适合运行像UDF
这样的自定义逻辑,并且结果是否约为3秒。
我正在考虑第二种选择。为此具有完全不同的框架/存储。例如Casandra或elasticsearch,但我们希望保留hdfs作为存储,但我们怀疑hdfs不适合使用自定义UDF
进行实时查询。
任何建议或想法都将受到高度赞赏!
编辑有关环境和结果的一些详细信息。
实际上,我们使用Thrift JDBC/ODBC server就像@ cricket_007提到的那样(我通常称其为蜂巢,对不起造成混乱-我已经更新了OP),由于水槽/火花会生成太多小文件,因此查询速度很慢。
序列文件:〜150MB大约需要5分钟的时间来执行
镶木文件:分区存在问题(数据来自水槽/火花),并且SQL SELECT
没有看到最新数据。因此,我们需要运行MSCK REPAIR TABLE
,这需要大约8分钟才能处理7000行。对约7000行的查询大约需要50sec-1分钟。
我们将start-thriftserver.sh
与local[*]
一起运行。
我猜它即使在本地模式下也无法获得结果。
grep -c ^processor /proc/cpuinfo
打印8,并且有9GB的RAM。