Apache Drill数据库和数据位置

时间:2017-06-10 17:07:21

标签: apache-drill cache-locality

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

示例查询: SELECT SUM(收入)AS收入 FROM(     SELECT SUM(lo_extendedprice * lo_discount)AS收入     来自dfs.tmp.lineorder,dfs.tmp。date     WHERE lo_orderdate = d_datekey     AND d_year = 1993     AND lo_discount BETWEEN 1和3     AND lo_quantity< 25 UNION ALL     SELECT SUM(lo_extendedprice * lo_discount)AS收入     来自mongo.test.ssb_europe ssb     WHERE ssb.orderdate.d_year = 1993     AND lo_discount BETWEEN 1和3     AND lo_quantity< 25 );

配置(drill-override.conf):

在钻头A上(Windows Server 2008): drill.exec:{   cluster-id:“drillbits1”,   zk.connect:“serverA:2181”,     冒充:{     启用:true,     max_chained_user_hops:3   } }

在钻头B上(Cloudera CDH 5.8.0): drill.exec:{   cluster-id:“drillbits1”,   zk.connect:“serverA:2181”,   冒充:{     启用:true,     max_chained_user_hops:3   } }

1 个答案:

答案 0 :(得分:0)

似乎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;