0

私は2つのサーバーを持っています。最初のサーバー (A) には、zookeeper、mongodb データベース、およびドリルビットが含まれています。2 番目のサーバー (B) には、複数のハイブ テーブル、postgresql データベース、およびその他のドリルビットを備えた Hadoop ディストリビューションが含まれています。どちらのドリルビットも、サーバー A の飼育係に接続されているため、ドリル ホームページ上でお互いを見ることができます。以下のようなクエリが実行されると (ビュー dfs.lineorder はサーバー B のハイブと postgresql データで構成されます)、ドリルビットB が職長となり、すべてを実行します。mongodb テーブルを処理する部分をサーバー A のドリルビットに委任しないため、クエリの実行に必要な時間 (約 30 分) の 90% が、サーバー A からサーバー B への mongodb コレクションの送信に費やされます。ドリルビット B にクエリの mongodb 部分をドリルビット 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): drill.exec: { cluster-id: "drillbits1", zk.connect: "serverA:2181", impersonation: { enabled: true, max_chained_user_hops: 3 } }

ドリルビット B (Cloudera CDH 5.8.0): drill.exec: { cluster-id: "drillbits1", zk.connect: "serverA:2181", impersonation: { enabled: true, max_chained_user_hops: 3 } }

4

1 に答える 1

0

MongoDB ストレージ プラグインが問題の可能性があるようです。クエリが 2 つの完全なサブクエリに (グループ化されて) 明確に分離されている場合、オプティマイザーは作業を正常に分割します。次のクエリは、2 つのドリルビット間で作業を正しく分割します。

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;
于 2017-06-22T08:35:20.890 に答える