【问题标题】:Apache Drill database and data localityApache Drill 数据库和数据本地化
【发布时间】:2017-11-12 13:01:16
【问题描述】:

我有两台服务器。第一台服务器 (A) 包含 zookeeper、一个 mongodb 数据库和一个钻头。第二台服务器 (B) 包含一个带有多个 hive 表、一个 postgresql 数据库和另一个钻头的 hadoop 发行版。两个钻头可以在钻头主页上看到彼此,因为它们都连接到服务器 A 上的 Zookeeper。当运行如下查询时(视图 dfs.lineorder 包含服务器 B 上的 hive 和 postgresql 数据),钻头B 成为工头并执行所有操作。它不会将处理 mongodb 表的部分委托给服务器 A 上的钻头,因此运行查询所需的 90% 时间(大约 30 分钟)用于将 mongodb 集合从服务器 A 发送到服务器 B。一种强制drillbit B将查询的mongodb部分委托给drillbit B的方法,或者这可能是一个错误配置问题? 此外,是否可以将钻头配置为访问不同的数据库(例如,当每个钻头都可以访问不同的子网时,以便并非所有钻头都可以访问相同的数据库)?

示例查询:

SELECT SUM(revenue) AS revenue
FROM (
    SELECT SUM(lo_extendedprice*lo_discount) AS revenue
    FROM dfs.tmp.lineorder, dfs.tmp.`date`
    WHERE lo_orderdate = d_datekey
    AND d_year = 1993
    AND lo_discount BETWEEN 1 AND 3
    AND lo_quantity < 25
UNION ALL
    SELECT SUM(lo_extendedprice * lo_discount) AS revenue
    FROM mongo.test.ssb_europe ssb
    WHERE ssb.orderdate.d_year = 1993
    AND lo_discount BETWEEN 1 AND 3
    AND lo_quantity < 25
);

配置(drill-override.conf):

在钻头 A (Windows Server 2008) 上: 钻头执行:{ 集群 ID:“drillbits1”, zk.connect: "serverA:2181", 冒充:{ 启用:真, max_chained_user_hops:3 } }

在钻头 B (Cloudera CDH 5.8.0) 上: 钻头执行:{ 集群 ID:“drillbits1”, zk.connect: "serverA:2181", 冒充:{ 启用:真, max_chained_user_hops:3 } }

【问题讨论】:

    标签: apache-drill cache-locality


    【解决方案1】:

    似乎 MongoDB 存储插件可能是问题所在。如果查询清楚地分为两个完整的子查询(带有分组),则优化器成功拆分工作。 以下查询正确拆分了两个钻头之间的工作。

    SELECT SUM(lo_revenue), d_year, p_brand1
    FROM (
        SELECT SUM(lo_revenue) AS lo_revenue, d_year, p_brand1
        FROM dfs.tmp.lineorder, dfs.tmp.`date`, dfs.tmp.part, dfs.tmp.supplier
        WHERE lo_orderdate = d_datekey
        AND lo_partkey = p_partkey
        AND lo_suppkey = s_suppkey
        AND p_category = 'MFGR#12'
        AND s_region = 'AMERICA'
        GROUP BY d_year, p_brand1
    UNION ALL
        SELECT SUM(TO_NUMBER(lo_revenue, '########.##')) AS lo_revenue, ssb.orderdate.d_year AS d_year, ssb.part.p_brand1 AS p_brand1
        FROM mongo.test.ssb_europe ssb
        WHERE IsNumeric(lo_revenue)
        AND ssb.part.p_category = 'MFGR#12'
        AND ssb.supplier.s_region = 'AMERICA'
        GROUP BY ssb.orderdate.d_year, ssb.part.p_brand1
    ) l
    GROUP BY d_year, p_brand1
    ORDER BY d_year, p_brand1;
    

    【讨论】:

      猜你喜欢
      • 2010-11-22
      • 2019-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多