mirror of
https://github.com/apache/impala.git
synced 2025-12-19 09:58:28 -05:00
Change-Id: Ia665e3f230f218d8bbf998dfd1ae21338c21b36e Reviewed-on: http://gerrit.cloudera.org:8080/12908 Tested-by: Impala Public Jenkins <impala-public-jenkins@cloudera.com> Reviewed-by: Alex Rodoni <arodoni@cloudera.com>
633 lines
19 KiB
XML
633 lines
19 KiB
XML
<?xml version="1.0" encoding="UTF-8"?>
|
||
<!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN" "concept.dtd">
|
||
<!--
|
||
Licensed to the Apache Software Foundation (ASF) under one
|
||
or more contributor license agreements. See the NOTICE file
|
||
distributed with this work for additional information
|
||
regarding copyright ownership. The ASF licenses this file
|
||
to you under the Apache License, Version 2.0 (the
|
||
"License"); you may not use this file except in compliance
|
||
with the License. You may obtain a copy of the License at
|
||
|
||
http://www.apache.org/licenses/LICENSE-2.0
|
||
|
||
Unless required by applicable law or agreed to in writing,
|
||
software distributed under the License is distributed on an
|
||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||
KIND, either express or implied. See the License for the
|
||
specific language governing permissions and limitations
|
||
under the License.
|
||
-->
|
||
<concept id="scalability">
|
||
|
||
<title>How to Configure Impala with Dedicated Coordinators</title>
|
||
|
||
<titlealts audience="PDF">
|
||
|
||
<navtitle>Dedicated Coordinators Optimization</navtitle>
|
||
|
||
</titlealts>
|
||
|
||
<prolog>
|
||
<metadata>
|
||
<data name="Category" value="Performance"/>
|
||
<data name="Category" value="Impala"/>
|
||
<data name="Category" value="Planning"/>
|
||
<data name="Category" value="Querying"/>
|
||
<data name="Category" value="Memory"/>
|
||
<data name="Category" value="Scalability"/>
|
||
</metadata>
|
||
</prolog>
|
||
|
||
<conbody>
|
||
|
||
<p>
|
||
Each host that runs the Impala Daemon acts as both a coordinator and as an executor, by
|
||
default, managing metadata caching, query compilation, and query execution. In this
|
||
configuration, Impala clients can connect to any Impala daemon and send query requests.
|
||
</p>
|
||
|
||
<p>
|
||
During highly concurrent workloads for large-scale queries, the dual roles can cause
|
||
scalability issues because:
|
||
</p>
|
||
|
||
<ul>
|
||
<li>
|
||
<p>
|
||
The extra work required for a host to act as the coordinator could interfere with its
|
||
capacity to perform other work for the later phases of the query. For example,
|
||
coordinators can experience significant network and CPU overhead with queries
|
||
containing a large number of query fragments. Each coordinator caches metadata for all
|
||
table partitions and data files, which requires coordinators to be configured with a
|
||
large JVM heap. Executor-only Impala daemons should be configured with the default JVM
|
||
heaps, which leaves more memory available to process joins, aggregations, and other
|
||
operations performed by query executors.
|
||
</p>
|
||
</li>
|
||
|
||
<li>
|
||
<p>
|
||
Having a large number of hosts act as coordinators can cause unnecessary network
|
||
overhead, or even timeout errors, as each of those hosts communicates with the
|
||
Statestored daemon for metadata updates.
|
||
</p>
|
||
</li>
|
||
|
||
<li>
|
||
<p >
|
||
The "soft limits" imposed by the admission control feature are more likely to be
|
||
exceeded when there are a large number of heavily loaded hosts acting as coordinators.
|
||
Check
|
||
<xref
|
||
href="https://issues.apache.org/jira/browse/IMPALA-3649"
|
||
format="html" scope="external">
|
||
<u>IMPALA-3649</u>
|
||
</xref> and
|
||
<xref
|
||
href="https://issues.apache.org/jira/browse/IMPALA-6437"
|
||
format="html" scope="external">
|
||
<u>IMPALA-6437</u>
|
||
</xref> to see the status of the enhancements to mitigate this issue.
|
||
</p>
|
||
</li>
|
||
</ul>
|
||
|
||
<p >
|
||
The following factors can further exacerbate the above issues:
|
||
</p>
|
||
|
||
<ul>
|
||
<li >
|
||
<p >
|
||
High number of concurrent query fragments due to query concurrency and/or query
|
||
complexity
|
||
</p>
|
||
</li>
|
||
|
||
<li >
|
||
<p >
|
||
Large metadata topic size related to the number of partitions/files/blocks
|
||
</p>
|
||
</li>
|
||
|
||
<li >
|
||
<p >
|
||
High number of coordinator nodes
|
||
</p>
|
||
</li>
|
||
|
||
<li >
|
||
<p >
|
||
High number of coordinators used in the same resource pool
|
||
</p>
|
||
</li>
|
||
</ul>
|
||
|
||
<p>
|
||
If such scalability bottlenecks occur, in Impala 2.9 and higher, you can assign one
|
||
dedicated role to each Impala daemon host, either as a coordinator or as an executor, to
|
||
address the issues.
|
||
</p>
|
||
|
||
<ul>
|
||
<li>
|
||
<p>
|
||
All explicit or load-balanced client connections must go to the coordinator hosts.
|
||
These hosts perform the network communication to keep metadata up-to-date and route
|
||
query results to the appropriate clients. The dedicated coordinator hosts do not
|
||
participate in I/O-intensive operations such as scans, and CPU-intensive operations
|
||
such as aggregations.
|
||
</p>
|
||
</li>
|
||
|
||
<li>
|
||
<p>
|
||
The executor hosts perform the intensive I/O, CPU, and memory operations that make up
|
||
the bulk of the work for each query. The executors do communicate with the Statestored
|
||
daemon for membership status, but the dedicated executor hosts do not process the
|
||
final result sets for queries.
|
||
</p>
|
||
</li>
|
||
</ul>
|
||
|
||
<p >
|
||
Using dedicated coordinators offers the following benefits:
|
||
</p>
|
||
|
||
<ul>
|
||
<li >
|
||
<p>
|
||
Reduces memory usage by limiting the number of Impala nodes that need to cache
|
||
metadata.
|
||
</p>
|
||
</li>
|
||
|
||
<li >
|
||
<p>
|
||
Provides better concurrency by avoiding coordinator bottleneck.
|
||
</p>
|
||
</li>
|
||
|
||
<li>
|
||
<p>
|
||
Eliminates query over-admission.
|
||
</p>
|
||
</li>
|
||
|
||
<li >
|
||
<p>
|
||
Reduces resource, especially network, utilization on the Statestored daemon by
|
||
limiting metadata broadcast to a subset of nodes.
|
||
</p>
|
||
</li>
|
||
|
||
<li >
|
||
<p>
|
||
Improves reliability and performance for highly concurrent workloads by reducing
|
||
workload stress on coordinators. Dedicated coordinators require 50% or fewer
|
||
connections and threads.
|
||
</p>
|
||
</li>
|
||
|
||
<li >
|
||
<p>
|
||
Reduces the number of explicit metadata refreshes required.
|
||
</p>
|
||
</li>
|
||
|
||
<li >
|
||
<p>
|
||
Improves diagnosability if a bottleneck or other performance issue arises on a
|
||
specific host, you can narrow down the cause more easily because each host is
|
||
dedicated to specific operations within the overall Impala workload.
|
||
</p>
|
||
</li>
|
||
</ul>
|
||
|
||
<p>
|
||
In this configuration with dedicated coordinators / executors, you cannot connect to the
|
||
dedicated executor hosts through clients such as impala-shell or business intelligence
|
||
tools as only the coordinator nodes support client connections.
|
||
</p>
|
||
|
||
</conbody>
|
||
|
||
<concept id="concept_vhv_4b1_n2b">
|
||
|
||
<title>Determining the Optimal Number of Dedicated Coordinators</title>
|
||
|
||
<conbody>
|
||
|
||
<p >
|
||
You should have the smallest number of coordinators that will still satisfy your
|
||
workload requirements in a cluster. A rough estimation is 1 coordinator for every 50
|
||
executors.
|
||
</p>
|
||
|
||
<p>
|
||
To maintain a healthy state and optimal performance, it is recommended that you keep the
|
||
peak utilization of all resources used by Impala, including CPU, the number of threads,
|
||
the number of connections, and RPCs, under 80%.
|
||
</p>
|
||
|
||
<p >
|
||
Consider the following factors to determine the right number of coordinators in your
|
||
cluster:
|
||
</p>
|
||
|
||
<ul>
|
||
<li >
|
||
<p >
|
||
What is the number of concurrent queries?
|
||
</p>
|
||
</li>
|
||
|
||
<li >
|
||
<p >
|
||
What percentage of the workload is DDL?
|
||
</p>
|
||
</li>
|
||
|
||
<li >
|
||
<p>
|
||
What is the average query resource usage at the various stages (merge, runtime
|
||
filter, result set size, etc.)?
|
||
</p>
|
||
</li>
|
||
|
||
<li >
|
||
<p>
|
||
How many Impala Daemons (impalad) is in the cluster?
|
||
</p>
|
||
</li>
|
||
|
||
<li >
|
||
<p>
|
||
Is there a high availability requirement?
|
||
</p>
|
||
</li>
|
||
|
||
<li >
|
||
<p>
|
||
Compute/storage capacity reduction factor
|
||
</p>
|
||
</li>
|
||
</ul>
|
||
|
||
<p>
|
||
Start with the below set of steps to determine the initial number of coordinators:
|
||
</p>
|
||
|
||
<ol>
|
||
<li>
|
||
If your cluster has less than 10 nodes, we recommend that you configure one dedicated
|
||
coordinator. Deploy the dedicated coordinator on a DataNode to avoid losing storage
|
||
capacity. In most of cases, one dedicated coordinator is enough to support all
|
||
workloads on a cluster.
|
||
</li>
|
||
|
||
<li>
|
||
Add more coordinators if the dedicated coordinator CPU or network peak utilization is
|
||
80% or higher. You might need 1 coordinator for every 50 executors.
|
||
</li>
|
||
|
||
<li>
|
||
If the Impala service is shared by multiple workgroups with a dynamic resource pool
|
||
assigned, use one coordinator per pool to avoid admission control over admission.
|
||
</li>
|
||
|
||
<li>
|
||
If high availability is required, double the number of coordinators. One set as an
|
||
active set and the other as a backup set.
|
||
</li>
|
||
</ol>
|
||
|
||
</conbody>
|
||
|
||
<concept id="concept_y4k_rc1_n2b">
|
||
|
||
<title>Advanced Tuning</title>
|
||
|
||
<conbody>
|
||
|
||
<p >
|
||
Use the following guidelines to further tune the throughput and stability.
|
||
<ol>
|
||
<li >
|
||
The concurrency of DML statements does not typically depend on the number of
|
||
coordinators or size of the cluster. Queries that return large result sets
|
||
(10,000+ rows) consume more CPU and memory resources on the coordinator. Add one
|
||
or two coordinators if the workload has many such queries.
|
||
</li>
|
||
|
||
<li>
|
||
DDL queries, excluding <codeph>COMPUTE STATS</codeph> and <codeph>CREATE TABLE AS
|
||
SELECT</codeph>, are executed only on coordinators. If your workload contains many
|
||
DDL queries running concurrently, you could add one coordinator.
|
||
</li>
|
||
|
||
<li>
|
||
The CPU contention on coordinators can slow down query executions when concurrency
|
||
is high, especially for very short queries (<10s). Add more coordinators to
|
||
avoid CPU contention.
|
||
</li>
|
||
|
||
<li>
|
||
On a large cluster with 50+ nodes, the number of network connections from a
|
||
coordinator to executors can grow quickly as query complexity increases. The
|
||
growth is much greater on coordinators than executors. Add a few more coordinators
|
||
if workloads are complex, i.e. (an average number of fragments * number of
|
||
Impalad) > 500, but with the low memory/CPU usage to share the load. Watch
|
||
IMPALA-4603 and IMPALA-7213 to track the progress on fixing this issue.
|
||
</li>
|
||
|
||
<li >
|
||
When using multiple coordinators for DML statements, divide queries to different
|
||
groups (number of groups = number of coordinators). Configure a separate dynamic
|
||
resource pool for each group and direct each group of query requests to a specific
|
||
coordinator. This is to avoid query over admission.
|
||
</li>
|
||
|
||
<li>
|
||
The front-end connection requirement is not a factor in determining the number of
|
||
dedicated coordinators. Consider setting up a connection pool at the client side
|
||
instead of adding coordinators. For a short-term solution, you could increase the
|
||
value of <codeph>fe_service_threads</codeph> on coordinators to allow more client
|
||
connections.
|
||
</li>
|
||
|
||
<li>
|
||
In general, you should have a very small number of coordinators so storage
|
||
capacity reduction is not a concern. On a very small cluster (less than 10 nodes),
|
||
deploy a dedicated coordinator on a DataNode to avoid storage capacity reduction.
|
||
</li>
|
||
</ol>
|
||
</p>
|
||
|
||
</conbody>
|
||
|
||
</concept>
|
||
|
||
<concept id="concept_w51_cd1_n2b">
|
||
|
||
<title>Estimating Coordinator Resource Usage</title>
|
||
|
||
<conbody>
|
||
|
||
<p>
|
||
<table id="table_kh3_d31_n2b" colsep="1" rowsep="1" frame="all">
|
||
<tgroup cols="3">
|
||
<colspec colnum="1" colname="col1" colsep="1" rowsep="1"/>
|
||
<colspec colnum="2" colname="col2" colsep="1" rowsep="1"/>
|
||
<colspec colnum="3" colname="col3" colsep="1" rowsep="1"/>
|
||
<tbody>
|
||
<row>
|
||
<entry >
|
||
<b>Resource</b>
|
||
</entry>
|
||
<entry >
|
||
<b>Safe range</b>
|
||
</entry>
|
||
<entry >
|
||
<b>Notes / CM tsquery to monitor</b>
|
||
</entry>
|
||
</row>
|
||
<row>
|
||
<entry >
|
||
Memory
|
||
</entry>
|
||
<entry>
|
||
<p >
|
||
(Max JVM heap setting +
|
||
</p>
|
||
|
||
|
||
|
||
<p >
|
||
query concurrency *
|
||
</p>
|
||
|
||
|
||
|
||
<p >
|
||
query mem_limit)
|
||
</p>
|
||
|
||
|
||
|
||
<p >
|
||
<=
|
||
</p>
|
||
|
||
|
||
|
||
<p >
|
||
80% of Impala process memory allocation
|
||
</p>
|
||
</entry>
|
||
<entry>
|
||
<p >
|
||
<i>Memory usage</i>:
|
||
</p>
|
||
|
||
|
||
|
||
<p >
|
||
SELECT mem_rss WHERE entityName = "Coordinator Instance ID" AND category =
|
||
ROLE
|
||
</p>
|
||
|
||
|
||
|
||
<p >
|
||
<i>JVM heap usage (metadata cache)</i>:
|
||
</p>
|
||
|
||
|
||
|
||
<p >
|
||
SELECT impala_jvm_heap_current_usage_bytes WHERE entityName = "Coordinator
|
||
Instance ID" AND category = ROLE (only in release 5.15 and above)
|
||
</p>
|
||
</entry>
|
||
</row>
|
||
<row>
|
||
<entry >
|
||
TCP Connection
|
||
</entry>
|
||
<entry >
|
||
Incoming + outgoing < 16K
|
||
</entry>
|
||
<entry>
|
||
<p >
|
||
<i>Incoming connection usage</i>:
|
||
</p>
|
||
|
||
|
||
|
||
<p >
|
||
SELECT thrift_server_backend_connections_in_use WHERE entityName =
|
||
"Coordinator Instance ID" AND category = ROLE
|
||
</p>
|
||
|
||
|
||
|
||
<p >
|
||
<i>Outgoing connection usage</i>:
|
||
</p>
|
||
|
||
|
||
|
||
<p >
|
||
SELECT backends_client_cache_clients_in_use WHERE entityName =
|
||
"Coordinator Instance ID" AND category = ROLE
|
||
</p>
|
||
</entry>
|
||
</row>
|
||
<row>
|
||
<entry >
|
||
Threads
|
||
</entry>
|
||
<entry >
|
||
< 32K
|
||
</entry>
|
||
<entry >
|
||
SELECT thread_manager_running_threads WHERE entityName = "Coordinator
|
||
Instance ID" AND category = ROLE
|
||
</entry>
|
||
</row>
|
||
<row>
|
||
<entry >
|
||
CPU
|
||
</entry>
|
||
<entry>
|
||
<p >
|
||
Concurrency =
|
||
</p>
|
||
|
||
|
||
|
||
<p >
|
||
non-DDL query concurrency <=
|
||
</p>
|
||
|
||
|
||
|
||
<p>
|
||
number of virtual cores allocated to Impala per node
|
||
</p>
|
||
</entry>
|
||
<entry>
|
||
<p >
|
||
CPU usage estimation should be based on how many cores are allocated to
|
||
Impala per node, not a sum of all cores of the cluster.
|
||
</p>
|
||
|
||
|
||
|
||
<p>
|
||
It is recommended that concurrency should not be more than the number of
|
||
virtual cores allocated to Impala per node.
|
||
</p>
|
||
|
||
|
||
|
||
<p ></p>
|
||
|
||
|
||
|
||
<p >
|
||
<i>Query concurrency:</i>
|
||
</p>
|
||
|
||
|
||
|
||
<p>
|
||
SELECT total_impala_num_queries_registered_across_impalads WHERE
|
||
entityName = "IMPALA-1" AND category = SERVICE
|
||
</p>
|
||
|
||
|
||
|
||
<p ></p>
|
||
</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
</p>
|
||
|
||
<p>
|
||
If usage of any of the above resources exceeds the safe range, add one more
|
||
coordinator.
|
||
</p>
|
||
|
||
</conbody>
|
||
|
||
</concept>
|
||
|
||
</concept>
|
||
|
||
<concept id="concept_omm_gf1_n2b">
|
||
|
||
<title>Deploying Dedicated Coordinators and Executors</title>
|
||
|
||
<conbody>
|
||
|
||
<p >
|
||
This section describes the process to configure a dedicated coordinator and a dedicated
|
||
executor roles for Impala.
|
||
</p>
|
||
|
||
<ul>
|
||
<li >
|
||
<p>
|
||
<b>Dedicated coordinator</b>: They should be on edge node with no other services
|
||
running on it. They don’t need large local disks but still need some that can be
|
||
used for Spilling. They require at least same or even larger memory allocation.
|
||
</p>
|
||
</li>
|
||
|
||
<li >
|
||
<p>
|
||
<b>(Dedicated) Executors: </b>They should be colocated with DataNodes as usual. The
|
||
number of hosts with this setting typically increases as the cluster grows larger
|
||
and handles more table partitions, data files, and concurrent queries.
|
||
</p>
|
||
</li>
|
||
</ul>
|
||
|
||
<p>
|
||
To configuring dedicated coordinators/executors, you specify one of the following
|
||
startup flags for the <cmdname>impalad</cmdname> daemon on each host:
|
||
<ul>
|
||
<li>
|
||
<p>
|
||
<codeph>‑‑is_executor=false</codeph> for each host that does not act
|
||
as an executor for Impala queries. These hosts act exclusively as query
|
||
coordinators. This setting typically applies to a relatively small number of
|
||
hosts, because the most common topology is to have nearly all DataNodes doing work
|
||
for query execution.
|
||
</p>
|
||
</li>
|
||
|
||
<li>
|
||
<p>
|
||
<codeph>‑‑is_coordinator=false</codeph> for each host that does not
|
||
act as a coordinator for Impala queries. These hosts act exclusively as executors.
|
||
The number of hosts with this setting typically increases as the cluster grows
|
||
larger and handles more table partitions, data files, and concurrent queries. As
|
||
the overhead for query coordination increases, it becomes more important to
|
||
centralize that work on dedicated hosts.
|
||
</p>
|
||
</li>
|
||
</ul>
|
||
</p>
|
||
|
||
</conbody>
|
||
|
||
</concept>
|
||
|
||
</concept>
|