mirror of
https://github.com/apache/impala.git
synced 2026-01-22 18:02:34 -05:00
Change-Id: I938930c66144ba6bce766981d363abe4b28ba524 Reviewed-on: http://gerrit.cloudera.org:8080/14860 Tested-by: Impala Public Jenkins <impala-public-jenkins@cloudera.com> Reviewed-by: Alex Rodoni <arodoni@cloudera.com>
285 lines
12 KiB
XML
285 lines
12 KiB
XML
<?xml version="1.0" encoding="UTF-8"?>
|
|
<!--
|
|
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.
|
|
-->
|
|
<!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN" "concept.dtd">
|
|
<concept id="explain_plan">
|
|
|
|
<title>Understanding Impala Query Performance - EXPLAIN Plans and Query Profiles</title>
|
|
|
|
<titlealts audience="PDF">
|
|
|
|
<navtitle>EXPLAIN Plans and Query Profiles</navtitle>
|
|
|
|
</titlealts>
|
|
|
|
<prolog>
|
|
<metadata>
|
|
<data name="Category" value="Performance"/>
|
|
<data name="Category" value="Impala"/>
|
|
<data name="Category" value="Querying"/>
|
|
<data name="Category" value="Troubleshooting"/>
|
|
<data name="Category" value="Reports"/>
|
|
<data name="Category" value="Concepts"/>
|
|
<data name="Category" value="Administrators"/>
|
|
<data name="Category" value="Developers"/>
|
|
<data name="Category" value="Data Analysts"/>
|
|
</metadata>
|
|
</prolog>
|
|
|
|
<conbody>
|
|
|
|
<p>
|
|
To understand the high-level performance considerations for Impala queries, read the
|
|
output of the <codeph>EXPLAIN</codeph> statement for the query. You can get the
|
|
<codeph>EXPLAIN</codeph> plan without actually running the query itself.
|
|
</p>
|
|
|
|
<p rev="1.4.0">
|
|
For an overview of the physical performance characteristics for a query, issue the
|
|
<codeph>SUMMARY</codeph> statement in <cmdname>impala-shell</cmdname> immediately after
|
|
executing a query. This condensed information shows which phases of execution took the
|
|
most time, and how the estimates for memory usage and number of rows at each phase compare
|
|
to the actual values.
|
|
</p>
|
|
|
|
<p>
|
|
To understand the detailed performance characteristics for a query, issue the
|
|
<codeph>PROFILE</codeph> statement in <cmdname>impala-shell</cmdname> immediately after
|
|
executing a query. This low-level information includes physical details about memory, CPU,
|
|
I/O, and network usage, and thus is only available after the query is actually run.
|
|
</p>
|
|
|
|
<p outputclass="toc inpage"/>
|
|
|
|
<p>
|
|
Also, see <xref href="impala_hbase.xml#hbase_performance"/> and
|
|
<xref href="impala_s3.xml#s3_performance"/> for examples of interpreting
|
|
<codeph>EXPLAIN</codeph> plans for queries against HBase tables <ph rev="2.2.0">and data
|
|
stored in the Amazon Simple Storage System (S3)</ph>.
|
|
</p>
|
|
|
|
</conbody>
|
|
|
|
<concept id="perf_explain">
|
|
|
|
<title>Using the EXPLAIN Plan for Performance Tuning</title>
|
|
|
|
<conbody>
|
|
|
|
<p>
|
|
The <codeph><xref href="impala_explain.xml#explain">EXPLAIN</xref></codeph> statement
|
|
gives you an outline of the logical steps that a query will perform, such as how the
|
|
work will be distributed among the nodes and how intermediate results will be combined
|
|
to produce the final result set. You can see these details before actually running the
|
|
query. You can use this information to check that the query will not operate in some
|
|
very unexpected or inefficient way.
|
|
</p>
|
|
|
|
<!-- Turn into a conref in ciiu_langref too. Relocate to common.xml. -->
|
|
|
|
<codeblock conref="impala_explain.xml#explain/explain_plan_simple"/>
|
|
|
|
<p conref="../shared/impala_common.xml#common/explain_interpret"/>
|
|
|
|
<p>
|
|
The <codeph>EXPLAIN</codeph> plan is also printed at the beginning of the query profile
|
|
report described in <xref href="#perf_profile"/>, for convenience in examining both the
|
|
logical and physical aspects of the query side-by-side.
|
|
</p>
|
|
|
|
<p rev="1.2">
|
|
The amount of detail displayed in the <codeph>EXPLAIN</codeph> output is controlled by
|
|
the <xref href="impala_explain_level.xml#explain_level">EXPLAIN_LEVEL</xref> query
|
|
option. You typically increase this setting from <codeph>standard</codeph> to
|
|
<codeph>extended</codeph> (or from <codeph>1</codeph> to <codeph>2</codeph>) when
|
|
doublechecking the presence of table and column statistics during performance tuning, or
|
|
when estimating query resource usage in conjunction with the resource management
|
|
features.
|
|
</p>
|
|
|
|
<!-- To do:
|
|
This is a good place to have a few examples.
|
|
-->
|
|
|
|
</conbody>
|
|
|
|
</concept>
|
|
|
|
<concept id="perf_summary">
|
|
|
|
<title>Using the SUMMARY Report for Performance Tuning</title>
|
|
|
|
<conbody>
|
|
|
|
<p>
|
|
The
|
|
<codeph><xref href="impala_shell_commands.xml#shell_commands"
|
|
>SUMMARY</xref></codeph>
|
|
command within the <cmdname>impala-shell</cmdname> interpreter gives you an
|
|
easy-to-digest overview of the timings for the different phases of execution for a
|
|
query. Like the <codeph>EXPLAIN</codeph> plan, it is easy to see potential performance
|
|
bottlenecks. Like the <codeph>PROFILE</codeph> output, it is available after the query
|
|
is run and so displays actual timing numbers.
|
|
</p>
|
|
|
|
<p>
|
|
The <codeph>SUMMARY</codeph> report is also printed at the beginning of the query
|
|
profile report described in <xref href="#perf_profile"/>, for convenience in examining
|
|
high-level and low-level aspects of the query side-by-side.
|
|
</p>
|
|
|
|
<p>
|
|
When the <codeph>MT_DOP</codeph> query option is set to a value larger than
|
|
<codeph>0</codeph>, the <codeph>#Inst</codeph> column in the output shows the number of
|
|
fragment instances. Impala decomposes each query into smaller units of work that are
|
|
distributed across the cluster, and these units are referred as fragments.
|
|
</p>
|
|
|
|
<p>
|
|
When the <codeph>MT_DOP</codeph> query option is set to 0, the <codeph>#Inst</codeph>
|
|
column in the output shows the same value as the <codeph>#Hosts</codeph> column, since
|
|
there is exactly one fragment for each host.
|
|
</p>
|
|
|
|
<p>
|
|
For example, here is a query involving an aggregate function, on a single-node cluster.
|
|
The different stages of the query and their timings are shown (rolled up for all nodes),
|
|
along with estimated and actual values used in planning the query. In this case, the
|
|
<codeph>AVG()</codeph> function is computed for a subset of data on each node (stage 01)
|
|
and then the aggregated results from all nodes are combined at the end (stage 03). You
|
|
can see which stages took the most time, and whether any estimates were substantially
|
|
different than the actual data distribution.
|
|
</p>
|
|
|
|
<codeblock>> SELECT AVG(ss_sales_price) FROM store_sales WHERE ss_coupon_amt = 0;
|
|
> SUMMARY;
|
|
+--------------+--------+--------+----------+----------+-------+------------+----------+---------------+-----------------+
|
|
| Operator | #Hosts | #Inst | Avg Time | Max Time | #Rows | Est. #Rows | Peak Mem | Est. Peak Mem | Detail |
|
|
+--------------+--------+--------+----------+----------+-------+------------+----------+---------------+-----------------+
|
|
| 03:AGGREGATE | 1 | 1 | 1.03ms | 1.03ms | 1 | 1 | 48.00 KB | -1 B | MERGE FINALIZE |
|
|
| 02:EXCHANGE | 1 | 1 | 0ns | 0ns | 1 | 1 | 0 B | -1 B | UNPARTITIONED |
|
|
| 01:AGGREGATE | 1 | 1 |30.79ms | 30.79ms | 1 | 1 | 80.00 KB | 10.00 MB | |
|
|
| 00:SCAN HDFS | 1 | 1 | 5.45s | 5.45s | 2.21M | -1 | 64.05 MB | 432.00 MB | tpc.store_sales |
|
|
+--------------+--------+--------+----------+----------+-------+------------+----------+---------------+-----------------+
|
|
</codeblock>
|
|
|
|
<p>
|
|
Notice how the longest initial phase of the query is measured in seconds (s), while
|
|
later phases working on smaller intermediate results are measured in milliseconds (ms)
|
|
or even nanoseconds (ns).
|
|
</p>
|
|
|
|
</conbody>
|
|
|
|
</concept>
|
|
|
|
<concept id="perf_profile">
|
|
|
|
<title>Using the Query Profile for Performance Tuning</title>
|
|
|
|
<conbody>
|
|
|
|
<p>
|
|
The <codeph>PROFILE</codeph> command, available in the <cmdname>impala-shell</cmdname>
|
|
interpreter, produces a detailed low-level report showing how the most recent query was
|
|
executed. Unlike the <codeph>EXPLAIN</codeph> plan described in
|
|
<xref
|
|
href="#perf_explain"/>, this information is only available after the
|
|
query has finished. It shows physical details such as the number of bytes read, maximum
|
|
memory usage, and so on for each node. You can use this information to determine if the
|
|
query is I/O-bound or CPU-bound, whether some network condition is imposing a
|
|
bottleneck, whether a slowdown is affecting some nodes but not others, and to check that
|
|
recommended configuration settings such as short-circuit local reads are in effect.
|
|
</p>
|
|
|
|
<p rev="">
|
|
By default, time values in the profile output reflect the wall-clock time taken by an
|
|
operation. For values denoting system time or user time, the measurement unit is
|
|
reflected in the metric name, such as <codeph>ScannerThreadsSysTime</codeph> or
|
|
<codeph>ScannerThreadsUserTime</codeph>. For example, a multi-threaded I/O operation
|
|
might show a small figure for wall-clock time, while the corresponding system time is
|
|
larger, representing the sum of the CPU time taken by each thread. Or a wall-clock time
|
|
figure might be larger because it counts time spent waiting, while the corresponding
|
|
system and user time figures only measure the time while the operation is actively using
|
|
CPU cycles.
|
|
</p>
|
|
|
|
<p>
|
|
The <xref href="impala_explain_plan.xml#perf_explain"><codeph>EXPLAIN</codeph>
|
|
plan</xref> is also printed at the beginning of the query profile report, for
|
|
convenience in examining both the logical and physical aspects of the query
|
|
side-by-side. The
|
|
<xref href="impala_explain_level.xml#explain_level">EXPLAIN_LEVEL</xref> query option
|
|
also controls the verbosity of the <codeph>EXPLAIN</codeph> output printed by the
|
|
<codeph>PROFILE</codeph> command.
|
|
</p>
|
|
|
|
<p>
|
|
In <keyword keyref="impala32_full"/>, a new <codeph>Per Node Profiles</codeph> section
|
|
was added to the profile output. The new section includes the following metrics that can
|
|
be controlled by the
|
|
<codeph><xref
|
|
href="impala_resource_trace_ratio.xml#resource_trace_ratio"
|
|
>RESOURCE_TRACE_RATIO</xref></codeph>
|
|
query option.
|
|
</p>
|
|
|
|
<ul>
|
|
<li>
|
|
<codeph>CpuIoWaitPercentage</codeph>
|
|
</li>
|
|
|
|
<li>
|
|
<codeph>CpuSysPercentage</codeph>
|
|
</li>
|
|
|
|
<li>
|
|
<codeph>CpuUserPercentage</codeph>
|
|
</li>
|
|
|
|
<li>
|
|
<codeph>HostDiskReadThroughput</codeph>: All data read by the host as part of the
|
|
execution of this query (spilling), by the HDFS data node, and by other processes
|
|
running on the same system.
|
|
</li>
|
|
|
|
<li>
|
|
<codeph>HostDiskWriteThroughput</codeph>: All data written by the host as part of the
|
|
execution of this query (spilling), by the HDFS data node, and by other processes
|
|
running on the same system.
|
|
</li>
|
|
|
|
<li>
|
|
<codeph>HostNetworkRx</codeph>: All data received by the host as part of the execution
|
|
of this query, other queries, and other processes running on the same system.
|
|
</li>
|
|
|
|
<li>
|
|
<codeph>HostNetworkTx</codeph>: All data transmitted by the host as part of the
|
|
execution of this query, other queries, and other processes running on the same
|
|
system.
|
|
</li>
|
|
</ul>
|
|
|
|
</conbody>
|
|
|
|
</concept>
|
|
|
|
</concept>
|