phoenix 是否适合 ETL 和聚合?
我正在尝试对我的数据进行一些 ETL。现在我正在使用 hbase 来存储我的数据(我们网站上的足迹)。我需要对这些数据进行一些聚合,例如每个 url 的页面浏览量......等等。
根据我的研究,我知道hive可以用于hbase数据的ETL,加上hql提供了sql语言,这样我们就不需要自己写map-reduce代码了。但是当我尝试使用 hive(pyhive) 查询 hbase 时,需要很长时间才能完成。此外,如果我有 phoenix 在 hbase 上执行 sql,我的 hbase 上还需要 hive 吗?
现在当我尝试使用一些复杂的 sql 时,phoenix 会超时。而且 hive 非常非常慢。那么对hbase数据做ETL有什么好的方法呢?
最佳答案
如果您有 OLTP 类型的查询,HBase 是一个合适的选择,即您的查询模式仅限于点获取或小范围查询。
Phoenix 只是 HBase 之上的一个 SQL 层,它为用户提供了使用 SQL 结构在 HBase 中查询数据的能力。
当您提交任何 SQL 查询时,Phoenix 将解析它并创建一个执行计划,该计划可以根据您查询的内容将查询分解为全扫描、范围扫描或点获取。
对于处理结果,Phoenix 使用 Predicate Push down,因此 HBase 执行所有处理(扫描并从所有区域服务器获取必要的行),Phoenix 聚合/整理结果行并将它们返回给用户。
现在回答您的问题“phoenix 适合 ETL 和聚合吗?”- 不如果您需要执行大型操作,它不适合使用聚合进行扫描(全范围或大范围扫描),并期望在几秒或亚秒内处理结果。如果您的表占用空间很小(几百 GB),这些查询可能会正常工作,但随着表的大小会随着时间的推移而增加,您最终会遇到严重的性能问题。 这是 OLAP 场景,您应该寻找其他替代方案。
我假设当您说将 Hive 与 HBase 结合使用时,您计划在 HBase 表之上创建一个 Hive 外部表,该表可以使用 HiveHBaseTableInputFormat 直接查询 HFile。 这将使用 MapReduce 来处理查询,您无法通过分区、分桶等真正利用性能优化。
我建议考虑使用 HBase + Phoenix 选项进行点获取和小范围查询,对于大型聚合/ETL 类型查询考虑使用 Spark,它会比 Hive 选项更好更快。
如果您的数据是仅追加的,您可以考虑使用一些替代的 OLAP 支持存储选项,例如 Driud、Clickhouse 或 Tez 上的 Hive、带有 Impala 或 Presto 选项的 Hive 而不是 HBase。
根据评论更新 -
Spark 将比 Hive (MapReduce) 选项更快;仅将 Spark 用于使用大范围或全扫描后跟聚合的查询。
虽然 Phoenix 利用协处理器和谓词下推到 HBase 区域,但可用资源量可能成为限制,Phoenix 将并行化由 GUIDE_POSTS_WIDTH 决定的 block 中的查询,对于大型表,这很容易达到几百到 1000s 并为 RPC 队列创建争用,同样在扫描期间 HFiles 将被读取并加载到 regionserver 堆中,如果扫描无法将结果放入分配的堆中,您可能会遇到 GC 或 OOM 问题。扫描器可能会受到 rpc 等待时间和可用内存的限制,从而导致超时。
您可以在一定程度上调整上述情况,但 HBase/Phoenix 不适用于 OLAP。使用 Spark,您可以直接读取 HFiles 并在之后应用过滤器,这将消除超时问题。如果一次又一次地查询相同的数据子集,您可以尝试将外部 rdd/dataframe 缓存到 Ignite。
我想补充一点,在寻找替代方案之前,您应该分析如何将数据存储在 HBase 中,它是否符合您的查询模式?如果您的查询计划正在创建全扫描,请重新审视您的 rowkey 设计,尝试重新设计 rowkey 或查询以避免全扫描?检查您的数据是否在所有区域分布良好?您的高写入速率会影响您的读取性能吗?
如果您有需要分析的点击流类型的数据,请查看 Clickhouse,Yandex 为类似的用例开发并开源了它,但它也适用于其他 OLAP 用例。
希望对您有所帮助。
关于hadoop - Hbase 上的 phoenix 和 hive ETL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52528907/
我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问
我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新rubygems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems
我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que
1.1.1 YARN的介绍 为克服Hadoop1.0中HDFS和MapReduce存在的各种问题⽽提出的,针对Hadoop1.0中的MapReduce在扩展性和多框架⽀持⽅⾯的不⾜,提出了全新的资源管理框架YARN. ApacheYARN(YetanotherResourceNegotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于⼀个分布式的操作系统平台,⽽MapReduce等计算程序则相当于运⾏于操作系统之上的应⽤程序。 YARN被引⼊Hadoop2,最初是为了改善MapReduce的实现,但是因为具有⾜够的通⽤性,同样可以⽀持其他的分布式计算模
Region是HBase数据管理的基本单位,region有一点像关系型数据的分区。region中存储这用户的真实数据,而为了管理这些数据,HBase使用了RegionSever来管理region。Region的结构hbaseregion的大小设置默认情况下,每个Table起初只有一个Region,随着数据的不断写入,Region会自动进行拆分。刚拆分时,两个子Region都位于当前的RegionServer,但处于负载均衡的考虑,HMaster有可能会将某个Region转移给其他的RegionServer。RegionSplit时机:当1个region中的某个Store下所有StoreFile
我有一个.pfx格式的证书,我需要使用ruby提取公共(public)、私有(private)和CA证书。使用shell我可以这样做:#ExtractPublicKey(askforpassword)opensslpkcs12-infile.pfx-outfile_public.pem-clcerts-nokeys#ExtractCertificateAuthorityKey(askforpassword)opensslpkcs12-infile.pfx-outfile_ca.pem-cacerts-nokeys#ExtractPrivateKey(askforpassword)o
我了解instance_eval和class_eval之间的基本区别。我在玩弄时发现的是一些涉及attr_accessor的奇怪东西。这是一个例子:A=Class.newA.class_eval{attr_accessor:x}a=A.newa.x="x"a.x=>"x"#...expectedA.instance_eval{attr_accessor:y}A.y="y"=>NoMethodError:undefinedmethod`y='forA:Classa.y="y"=>"y"#WHATTT?这是怎么回事:instance_eval没有访问我们的A类(对象)然后它实际上将它添加到
我有一个集合选择:此方法的单选按钮是什么?谢谢 最佳答案 Rails3中没有这样的助手。在Rails4中,它是collection_radio_buttons. 关于ruby-on-rails-rails上的ruby:radiobuttonsforcollectionselect,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/18525986/
我正在尝试将cucumber项目的用户名和密码置于版本控制之外。有没有办法在命令行上手动将用户名和密码等变量传递给Cucumber脚本?我的备份计划是将它们放在一个YML文件中,然后将该文件添加到gitignore,这样它们就不会被置于版本控制中。 最佳答案 所以,我看到了您对铁皮人的评论,答案是肯定的。cucumberPASSWORD=my_passwordPASSWORD被设置为环境变量,您可以通过将其引用为ENV['PASSWORD']来使用它的值。例如,browser.text_field(:id=>'pwd').setEN
我刚刚迈出了编程的第一步。我刚刚完成了CodeAcademy的另一门类(class)。这次我被要求创建一个小电影目录。这是我的问题:如何在文件中保存/加载带有电影标题和评级的哈希值而不是自己的代码?下面是代码现在的样子(几句葡萄牙语,但您可以忽略它:movies={Memento:3,Primer:4,Ishtar:1}puts"Oquevocêgostariadefazer?"puts"--Digite'add'paraadicionarumfilme."puts"--Digite'update'paraatualizarumfilme."puts"--Digite'display'