我正在研究一个数据驱动的分析软件项目,该项目可生成有关财务数据(交易)的报告和建议。该数据包含17亿条记录,每天新增20万条记录。每条记录都描述了一个具有相当小数据的事务(from_account,to_account,amount,time_stamp等)。
一旦编写,数据就不需要改变了(因此基本上它是一个WORM范例),但查询可能变得非常复杂。一些查询是AML(反洗钱)逻辑,它寻找诸如“U-Turn”交易之类的账户之间的关系:
A->B->C->D->A
我需要运行多个查询来检测此类模式,只要每个帐户都有“正常”的交易量,查询时间就会非常快。 如果帐户C(在上面的示例中)突然有数百万的交易,并且查询运行60秒或更长时间而不是0.5秒,则会出现问题。
我倾向于使用neo4j来搜索帐户之间的关系 - 但我不确定搜索是否足够快。其他解决方案可以在内存数据库中,例如MemSQL,Redis或Aerospike - 我也在研究HBase / Hadoop或CouchDB,MongoDB。
哪个堆栈可以提供目前最快的查询结果?
答案 0 :(得分:1)
每个类的数据库都有它的优势,对于AML用例你描述的图形数据库如neo4j将是正确的选择。?
像couchbase或Mongo这样的文档存储没什么意义,只有你感兴趣的路径长度可以预先计算出一个键值存储,比如Aerospike和Redis才有意义。 。当您尝试查找从给定节点开始并以其结尾的所有路径时,无论边缘数量多少,都不太可能。
答案 1 :(得分:0)
我建议你选择一台基于内存的数据库,使用适当的机器8或16演出的ram。为了实现分析写入尝试使用作业队列ex:rabbitMQ至少为17亿记录。 redis或memcache可以毫无问题地处理你的每日写入(200k),甚至可以调整,特别是如果你真的不需要事务(请阅读redis的批处理方法)。
这是一篇关于Instagram如何使用redis为每个用户映射超过3亿张图片的有趣帖子。
http://instagram-engineering.tumblr.com/post/10853187575/sharding-ids-at-instagram
但要注意,这种内存数据库是一个键值存储,这意味着没有复杂的数据,也没有复杂的查询。
另一种方法是尝试使用elasticsearch,它有一些好处可以使任务更容易。 Verizon使用它来存储超过500亿条记录。这并不意味着每个人都可以做到这一点,但至少它表明它可以完成
请参阅弹性搜索的链接:
https://sematext.com/blog/2013/07/08/elasticsearch-refresh-interval-vs-indexing-performance/
我听说HBase / Hadoop和CouchDB在大型集合上运行良好,但由于我没有真正使用它,因此无法提供更多信息。
希望这有帮助!