【问题标题】:Who executes HBase filters?谁执行 HBase 过滤器?
【发布时间】:2018-09-19 21:38:24
【问题描述】:

哪台机器执行org.apache.hadoop.hbase.filter.Filter

根据documentation,当使用 Get 或 Scan 操作从 HBase 读取数据时,您可以使用自定义过滤器将结果子集返回给客户端。虽然这不会减少服务器端 IO,但它确实会减少网络带宽并减少客户端需要处理的数据量。

据我所知,spark executor 机器正在 hbase 客户端的后台线程中进行远程调用以查询 HBase 数据。并且这些调用很少针对本地机器的 hbase 区域服务器。

所以我在考虑我的自定义过滤器是在 Spark 执行器机器上执行、具有巨大的网络开销、与文档所保证的内容相矛盾,还是以某种方式通过网络传输并在 HBase 机器上执行?
我喜欢过滤器是不可序列化的。那么下一个问题是这里是否可以优化任何东西?

【问题讨论】:

  • org.apache.hadoop.hbase.client.ConnectionFactory.createConnection(org.apache.hadoop.hbase.HBaseConfiguration.create())(简化版)
  • 我以为 HBaseConfiguration.create() 使用集群配置和集群设置
  • 好的,那么你使用this之类的东西吗?
  • 因此,如果您询问filter 应用于结果rdd(示例中为hBaseRDD),所有逻辑都由Spark 执行(首先获取数据)。但是基于DataFrame 的连接器可能会下推过滤器。

标签: java apache-spark hbase


【解决方案1】:

过滤器在区域服务器进程中执行。如果您将 jar 文件及其代码放入 HBase 配置中通过参数hbase.dynamic.jars.dir 指定的目录中,HBase 可以动态加载它。 Filter接口没有实现Serializable接口,但是有方法

static Filter    parseFrom(byte[] pbBytes)

从序列化表单创建过滤器。在应该用于自定义过滤器创建的类 FilterBase 中存在方法

abstract byte[] toByteArray()

用于将过滤器序列化为字节数组。

【讨论】:

    猜你喜欢
    • 2012-03-07
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多