现在我得到了这个可能需要人们输入的问题。
我有一个传统的rdbms(例如sql server)存储每天更新的数据。我想利用Hadoop生态系统,因此第一步可能是将数据从我们的rdbms导出到Hadoop数据存储。我也想对数据存储进行增量更新,可能是每晚。我不确定使用哪一个。
当我们考虑增量更新时,Hive似乎不是正确的选择(如果这个假设不对,请纠正我),那么HBase或任何其他适当的选项呢?
答案 0 :(得分:1)
1)数据提取:您可以考虑https://cwiki.apache.org/confluence/display/Hive/HBaseIntegration
2)增量更新:
您可以使用hbase进行增量更新,使用hive外部表(hbase存储处理程序)。
请参阅my answer
还可以查看此Using routers documentation
Impala等选项是特定于平台的(cloudera),它可以重用hive元存储。但查询处理速度比Hive快。
impala中有一些关键特性使其速度更快。
它不使用非常昂贵的map / reduce来分叉 单独的jvms。它运行单独的Impala守护程序,用于拆分查询 并行运行它们并在最后合并结果集。
它在内存中完成大部分操作。
它使用hdfs存储,对于大文件来说速度很快。它 从查询到结果到数据尽可能地缓存。
它支持像plat这样的新文件格式,它是柱状文件 格式。因此,如果您使用此格式,查询的位置会更快 您只访问了几列 大部分时间都是。
答案 1 :(得分:1)
Hadoop生态系统包含一个名为Sqoop的工具,旨在完全解决您描述的问题:将数据从RDBMS提取到Hadoop中。它支持几种执行增量更新的方法。它需要JBDC或JNDI连接到您的数据库,并且对于某些数据库能够使用高性能选项。它是Hadoop中更好的工具之一。
当我说"进入Hadoop"这可能意味着几件事,但通常是a)作为存储在Hadoop分布式文件系统(HDFS)上的一组文件,或b)存储在hBase中的数据。从技术上讲,hBase只是在HDFS上存储文件的另一种方式。
Hive是HDFS之上的一个层,允许您将导出到HDFS文件的RDBMS表视为仍在SQL Server数据库上。好吧,有点儿。 Hive可以使用类似SQL的语言查询多种文件格式。
HDFS有一个您需要了解的特殊挑战:没有办法更新行,就像在常规数据库中一样。 HDFS文件是"一次写入多次读取"设计。通常,您可以将数据集沿着某个自然分区划分为多个文件,这样,如果您确实需要更新记录,则只需要重写与该分区关联的文件 - year + month是一种常见的分区方案。
因此,如果你是一个记录永远不会改变的数据库,那么你只需要附加到你的HDFS文件即可。这适用于事务,日志或其他类似的数据,因为它通常永远不会被更改。但是更新的记录(例如客户名称或电子邮件)会产生更加困难的问题。
hBase通过透明地管理现有记录的更新,使HDFS限制消失了。但是hBase是一个键值存储数据库;密钥可以是您的RDBMS的主键,值必须是记录的其余部分。这并不可怕,但它可能很麻烦。
我相信Hive上的最新版本(或者可能是Impala,与Hive功能相似)允许更新,同时仍然以更灵活的格式存储数据。
所以Sqoop是你想要的工具,但仔细考虑一下你在Hadoop中对数据做些什么 - 这是一个非常非常不同的东西,而不仅仅是一个数据库可以变得非常大。