blob: a8868bfc62bdff4bf2da289c287b4e71cfc542af [file] [log] [blame]
<?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="s3" rev="2.2.0">
<title>Using Impala with Amazon S3 Object Store</title>
<titlealts audience="PDF"><navtitle>S3 Tables</navtitle></titlealts>
<prolog>
<metadata>
<data name="Category" value="Impala"/>
<data name="Category" value="Amazon"/>
<data name="Category" value="S3"/>
<data name="Category" value="Data Analysts"/>
<data name="Category" value="Developers"/>
<data name="Category" value="Querying"/>
<data name="Category" value="Preview Features"/>
</metadata>
</prolog>
<conbody>
<p rev="2.2.0"> You can use Impala to query data residing on the Amazon S3
object store. This capability allows convenient access to a storage system
that is remotely managed, accessible from anywhere, and integrated with
various cloud-based services. Impala can query files in any supported file
format from S3. The S3 storage location can be for an entire table, or
individual partitions in a partitioned table. </p>
<p outputclass="toc inpage"/>
</conbody>
<concept id="s3_best_practices" rev="2.6.0 IMPALA-1878">
<title>Best Practices for Using Impala with S3</title>
<prolog>
<metadata>
<data name="Category" value="Guidelines"/>
<data name="Category" value="Best Practices"/>
</metadata>
</prolog>
<conbody>
<p> The following guidelines summarize the best practices described in the
rest of this topic: </p>
<ul>
<li>
<p> Any reference to an S3 location must be fully qualified when S3 is
not designated as the default storage, for example,
<codeph>s3a:://[s3-bucket-name]</codeph>.</p>
</li>
<li>
<p> Set <codeph>fs.s3a.connection.maximum</codeph> to 1500 for
<cmdname>impalad</cmdname>. </p>
</li>
<li>
<p> Set <codeph>fs.s3a.block.size</codeph> to 134217728 (128 MB in
bytes) if most Parquet files queried by Impala were written by Hive
or ParquetMR jobs. </p>
<p>Set the block size to 268435456 (256 MB in bytes) if most Parquet
files queried by Impala were written by Impala. </p>
<p>Starting in Impala 3.4.0, instead of
<codeph>fs.s3a.block.size</codeph>, the
<codeph>PARQUET_OBJECT_STORE_SPLIT_SIZE</codeph> query option
controls the Parquet-specific split size. The default value is 256
MB.</p>
</li>
<li>
<p>
<codeph>DROP TABLE .. PURGE</codeph> is much faster than the default
<codeph>DROP TABLE</codeph>. The same applies to <codeph>ALTER
TABLE ... DROP PARTITION PURGE</codeph> versus the default
<codeph>DROP PARTITION</codeph> operation. Due to the eventually
consistent nature of S3, the files for that table or partition could
remain for some unbounded time when using <codeph>PURGE</codeph>.
The default <codeph>DROP TABLE/PARTITION</codeph> is slow because
Impala copies the files to the HDFS trash folder, and Impala waits
until all the data is moved. <codeph>DROP TABLE/PARTITION ..
PURGE</codeph> is a fast delete operation, and the Impala
statement finishes quickly even though the change might not have
propagated fully throughout S3. </p>
</li>
<li>
<p>
<codeph>INSERT</codeph> statements are faster than <codeph>INSERT
OVERWRITE</codeph> for S3. The query option
<codeph>S3_SKIP_INSERT_STAGING</codeph>, which is set to
<codeph>true</codeph> by default, skips the staging step for
regular <codeph>INSERT</codeph> (but not <codeph>INSERT
OVERWRITE</codeph>). This makes the operation much faster, but
consistency is not guaranteed: if a node fails during execution, the
table could end up with inconsistent data. Set this option to
<codeph>false</codeph> if stronger consistency is required,
however, this setting will make the <codeph>INSERT</codeph>
operations slower. </p>
<ul>
<li>
<p> For Impala-ACID tables, both <codeph>INSERT</codeph> and
<codeph>INSERT OVERWRITE</codeph> tables for S3 are fast,
regardless of the setting of
<codeph>S3_SKIP_INSERT_STAGING</codeph>. Plus, consistency is
guaranteed with ACID tables.</p>
</li>
</ul>
</li>
<li>Enable <xref href="impala_data_cache.xml#data_cache">data cache for
remote reads</xref>.</li>
<li>Enable <xref
href="https://hadoop.apache.org/docs/current/hadoop-aws/tools/hadoop-aws/s3guard.html"
format="html" scope="external">S3Guard</xref> in your cluster for
data consistency.</li>
<li>
<p> Too many files in a table can make metadata load and update slow
in S3. If too many requests are made to S3, S3 has a back-off
mechanism and responds slower than usual.</p>
<ul>
<li>If you have many small files due to over-granular partitioning,
configure partitions with many megabytes of data so that even a
query against a single partition can be parallelized effectively. </li>
<li>If you have many small files because of many small
<codeph>INSERT</codeph> queries, use bulk
<codeph>INSERT</codeph>s so that more data is written to fewer
files. </li>
</ul>
</li>
</ul>
</conbody>
</concept>
<concept id="s3_sql">
<title>How Impala SQL Statements Work with S3</title>
<conbody>
<p> Impala SQL statements work with data in S3 as follows: </p>
<ul>
<li>
<p> The <xref href="impala_create_table.xml#create_table">CREATE
TABLE</xref> or <xref href="impala_alter_table.xml#alter_table"
>ALTER TABLE</xref> statement can specify that a table resides in
the S3 object store by encoding an <codeph>s3a://</codeph> prefix
for the <codeph>LOCATION</codeph> property. <codeph>ALTER
TABLE</codeph> can also set the <codeph>LOCATION</codeph> property
for an individual partition so that some data in a table resides in
S3 and other data in the same table resides on HDFS. </p>
</li>
<li>
<p> Once a table or partition is designated as residing in S3, the
<xref href="impala_select.xml#select"/> statement transparently
accesses the data files from the appropriate storage layer. </p>
</li>
<li>
<p>
If the S3 table is an internal table, the <xref
href="impala_drop_table.xml#drop_table">DROP TABLE</xref> statement
removes the corresponding data files from S3 when the table is dropped.
</p>
</li>
<li>
<p> The <xref href="impala_truncate_table.xml#truncate_table">TRUNCATE
TABLE</xref> statement always removes the corresponding
data files from S3 when the table is truncated. </p>
</li>
<li>
<p>
The <xref href="impala_load_data.xml#load_data">LOAD DATA</xref>
statement can move data files residing in HDFS into
an S3 table.
</p>
</li>
<li>
<p>
The <xref href="impala_insert.xml#insert">INSERT</xref> statement, or the <codeph>CREATE TABLE AS SELECT</codeph>
form of the <codeph>CREATE TABLE</codeph> statement, can copy data from an HDFS table or another S3
table into an S3 table. The <xref
href="impala_s3_skip_insert_staging.xml#s3_skip_insert_staging">S3_SKIP_INSERT_STAGING</xref>
query option chooses whether or not to use a fast code path for these write operations to S3,
with the tradeoff of potential inconsistency in the case of a failure during the statement.
</p>
</li>
</ul>
<p>
For usage information about Impala SQL statements with S3 tables, see <xref href="impala_s3.xml#s3_ddl"/>
and <xref href="impala_s3.xml#s3_dml"/>.
</p>
</conbody>
</concept>
<concept id="s3_creds">
<title>Specifying Impala Credentials to Access Data in S3</title>
<conbody>
<p> To allow Impala to access data in S3, specify values for the following
configuration settings in your <filepath>core-site.xml</filepath> file: </p>
<codeblock>
&lt;property&gt;
&lt;name&gt;fs.s3a.access.key&lt;/name&gt;
&lt;value&gt;<varname>your_access_key</varname>&lt;/value&gt;
&lt;/property&gt;
&lt;property&gt;
&lt;name&gt;fs.s3a.secret.key&lt;/name&gt;
&lt;value&gt;<varname>your_secret_key</varname>&lt;/value&gt;
&lt;/property&gt;
</codeblock>
<p> After specifying the credentials, restart both the Impala and Hive
services. Restarting Hive is required because Impala statements, such as
<codeph>CREATE TABLE</codeph>, go through the Hive Metastore. </p>
<note type="important">
<p>
Although you can specify the access key ID and secret key as part of the <codeph>s3a://</codeph> URL in the
<codeph>LOCATION</codeph> attribute, doing so makes this sensitive information visible in many places, such
as <codeph>DESCRIBE FORMATTED</codeph> output and Impala log files. Therefore, specify this information
centrally in the <filepath>core-site.xml</filepath> file, and restrict read access to that file to only
trusted users.
</p>
</note>
<p>See <xref
href="https://www.google.com/url?q=https://hadoop.apache.org/docs/current/hadoop-aws/tools/hadoop-aws/index.html%23Authenticating_with_S3&amp;sa=D&amp;ust=1572980027740000&amp;usg=AFQjCNFnzPSfNBMVRgJZRenvhLblezHbdw"
format="html" scope="external">Authenticating with S3</xref> for
additional authentication mechanisms to access S3.</p>
</conbody>
</concept>
<concept id="s3_etl">
<title>Loading Data into S3 for Impala Queries</title>
<prolog>
<metadata>
<data name="Category" value="ETL"/>
<data name="Category" value="Ingest"/>
</metadata>
</prolog>
<conbody>
<p>
If your ETL pipeline involves moving data into S3 and then querying through Impala,
you can either use Impala DML statements to create, move, or copy the data, or
use the same data loading techniques as you would for non-Impala data.
</p>
</conbody>
<concept id="s3_dml" rev="2.6.0 IMPALA-1878">
<title>Using Impala DML Statements for S3 Data</title>
<conbody>
<p>The Impala DML statements (<codeph>INSERT</codeph>, <codeph>LOAD
DATA</codeph>, and <codeph>CREATE TABLE AS SELECT</codeph>) can
write data into a table or partition that resides in S3. The syntax of
the DML statements is the same as for any other tables because the S3
location for tables and partitions is specified by an
<codeph>s3a://</codeph> prefix in the <codeph>LOCATION</codeph>
attribute of <codeph>CREATE TABLE</codeph> or <codeph>ALTER
TABLE</codeph> statements. If you bring data into S3 using the
normal S3 transfer mechanisms instead of Impala DML statements, issue
a <codeph>REFRESH</codeph> statement for the table before using Impala
to query the S3 data.</p>
<p conref="../shared/impala_common.xml#common/s3_dml_performance"/>
</conbody>
</concept>
<concept id="s3_manual_etl">
<title>Manually Loading Data into Impala Tables in S3</title>
<conbody>
<p>
As an alternative, or on earlier Impala releases without DML support for S3,
you can use the Amazon-provided methods to bring data files into S3 for querying through Impala. See
<xref href="http://aws.amazon.com/s3/" scope="external" format="html">the Amazon S3 web site</xref> for
details.
</p>
<note type="important">
<p conref="../shared/impala_common.xml#common/s3_drop_table_purge"/>
</note>
<p> After you upload data files to a location already mapped to an
Impala table or partition, or if you delete files in S3 from such a
location, issue the <codeph>REFRESH</codeph> statement to make Impala
aware of the new set of data files. </p>
</conbody>
</concept>
</concept>
<concept id="s3_ddl">
<title>Creating Impala Databases, Tables, and Partitions for Data Stored in
S3</title>
<prolog>
<metadata>
<data name="Category" value="Databases"/>
</metadata>
</prolog>
<conbody>
<p>To create a table that resides in S3, run the <codeph>CREATE
TABLE</codeph> or <codeph>ALTER TABLE</codeph> statement with the
<codeph>LOCATION</codeph> clause. </p>
<p><codeph>ALTER TABLE</codeph> can set the <codeph>LOCATION</codeph>
property for an individual partition, so that some data in a table
resides in S3 and other data in the same table resides on HDFS.</p>
<p>The syntax for the <codeph>LOCATION</codeph> clause is:</p>
<codeblock>LOCATION 's3a://<varname>bucket_name</varname>/<varname>path</varname>/<varname>to</varname>/<varname>file</varname>'</codeblock>
<p>The file system prefix is always <codeph>s3a://</codeph>. Impala does
not support the <codeph>s3://</codeph> or <codeph>s3n://</codeph>
prefixes. </p>
<p> For a partitioned table, either specify a separate
<codeph>LOCATION</codeph> clause for each new partition, or specify a
base <codeph>LOCATION</codeph> for the table and set up a directory
structure in S3 to mirror the way Impala partitioned tables are
structured in S3. </p>
<p> You point a nonpartitioned table or an individual partition at S3 by
specifying a single directory path in S3, which could be any arbitrary
directory. To replicate the structure of an entire Impala partitioned
table or database in S3 requires more care, with directories and
subdirectories nested and named to match the equivalent directory tree
in HDFS. Consider setting up an empty staging area if necessary in HDFS,
and recording the complete directory structure so that you can replicate
it in S3. </p>
<p> When working with multiple tables with data files stored in S3, you can
create a database with a <codeph>LOCATION</codeph> attribute pointing to
an S3 path. Specify a URL of the form
<codeph>s3a://<varname>bucket</varname>/<varname>root</varname>/<varname>path</varname>/<varname>for</varname>/<varname>database</varname></codeph>
for the <codeph>LOCATION</codeph> attribute of the database. Any tables
created inside that database automatically create directories underneath
the one specified by the database <codeph>LOCATION</codeph> attribute. </p>
<p>The following example creates a table with one partition for the year
2017 resides on HDFS and one partition for the year 2018 resides in
S3.</p>
<p>The partition for year 2018 includes a <codeph>LOCATION</codeph>
attribute with an <codeph>s3a://</codeph> URL, and so refers to data
residing in S3, under a specific path underneath the bucket
<codeph>impala-demo</codeph>. </p>
<codeblock>CREATE TABLE mostly_on_hdfs (x int) PARTITIONED BY (year INT);
ALTER TABLE mostly_on_hdfs ADD PARTITION (year=2017);
ALTER TABLE mostly_on_hdfs ADD PARTITION (year=2018)
LOCATION 's3a://impala-demo/dir1/dir2/dir3/t1';
</codeblock>
<p> The following session creates a database and two partitioned tables
residing entirely in S3, one partitioned by a single column and the
other partitioned by multiple columns. </p>
<ul>
<li>Because a <codeph>LOCATION</codeph> attribute with an
<codeph>s3a://</codeph> URL is specified for the database, the
tables inside that database are automatically created in S3 underneath
the database directory. </li>
<li>To see the names of the associated subdirectories, including the
partition key values, use an S3 client tool to examine how the
directory structure is organized in S3. </li>
</ul>
<codeblock>CREATE DATABASE db_on_s3 LOCATION 's3a://impala-demo/dir1/dir2/dir3';
CREATE TABLE partitioned_multiple_keys (x INT)
PARTITIONED BY (year SMALLINT, month TINYINT, day TINYINT);
ALTER TABLE partitioned_multiple_keys
ADD PARTITION (year=2015,month=1,day=1);
ALTER TABLE partitioned_multiple_keys
ADD PARTITION (year=2015,month=1,day=31);
!hdfs dfs -ls -R s3a://impala-demo/dir1/dir2/dir3
2015-03-17 13:56:34 0 dir1/dir2/dir3/
2015-03-17 16:47:13 0 dir1/dir2/dir3/partitioned_multiple_keys/
2015-03-17 16:47:44 0 dir1/dir2/dir3/partitioned_multiple_keys/year=2015/month=1/day=1/
2015-03-17 16:47:50 0 dir1/dir2/dir3/partitioned_multiple_keys/year=2015/month=1/day=31/</codeblock>
<p>
The <codeph>CREATE DATABASE</codeph> and <codeph>CREATE TABLE</codeph> statements create the associated
directory paths if they do not already exist. You can specify multiple levels of directories, and the
<codeph>CREATE</codeph> statement creates all appropriate levels, similar to using <codeph>mkdir
-p</codeph>.
</p>
<p> Use the standard S3 file upload methods to put the actual data files
into the right locations. You can also put the directory paths and data
files in place before creating the associated Impala databases or
tables, and Impala automatically uses the data from the appropriate
location after the associated databases and tables are created. </p>
<p>Use the <codeph>ALTER TABLE</codeph> statement with the
<codeph>LOCATION</codeph> clause to switch whether an existing table
or partition points to data in HDFS or S3. For example, if you have an
Impala table or partition pointing to data files in HDFS or S3, and you
later transfer those data files to the other filesystem, use the
<codeph>ALTER TABLE</codeph> statement to adjust the
<codeph>LOCATION</codeph> attribute of the corresponding table or
partition to reflect that change. </p>
</conbody>
</concept>
<concept id="s3_internal_external">
<title>Internal and External Tables Located in S3</title>
<conbody>
<p> Just as with tables located on HDFS storage, you can designate
S3-based tables as either internal (managed by Impala) or external, by
using the syntax <codeph>CREATE TABLE</codeph> or <codeph>CREATE
EXTERNAL TABLE</codeph> respectively. </p>
<p>When you drop an internal table, the files associated with the table
are removed, even if they are in S3 storage. When you drop an external
table, the files associated with the table are left alone, and are still
available for access by other tools or components.</p>
<p> If the data in S3 is intended to be long-lived and accessed by other
tools in addition to Impala, create any associated S3 tables with the
<codeph>CREATE EXTERNAL TABLE</codeph> syntax, so that the files are
not deleted from S3 when the table is dropped. </p>
<p> If the data in S3 is only needed for querying by Impala and can be
safely discarded once the Impala workflow is complete, create the
associated S3 tables using the <codeph>CREATE TABLE</codeph> syntax, so
that dropping the table also deletes the corresponding data files in S3. </p>
</conbody>
</concept>
<concept id="s3_queries">
<title>Running and Tuning Impala Queries for Data Stored in S3</title>
<conbody>
<p> Once a table or partition is designated as residing in S3, the
<codeph>SELECT</codeph> statement transparently accesses the data
files from the appropriate storage layer. </p>
<ul>
<li>
Queries against S3 data support all the same file formats as for HDFS data.
</li>
<li>
Tables can be unpartitioned or partitioned. For partitioned tables, either manually construct paths in S3
corresponding to the HDFS directories representing partition key values, or use <codeph>ALTER TABLE ...
ADD PARTITION</codeph> to set up the appropriate paths in S3.
</li>
<li>
HDFS and HBase tables can be joined to S3 tables, or S3 tables can be joined with each other.
</li>
<li> Authorization to control access to databases, tables, or columns
works the same whether the data is in HDFS or in S3. </li>
<li> The Catalog Server (<cmdname>catalogd</cmdname>) daemon caches
metadata for both HDFS and S3 tables.</li>
<li>
Queries against S3 tables are subject to the same kinds of admission control and resource management as
HDFS tables.
</li>
<li> Metadata about S3 tables is stored in the same Metastore database
as for HDFS tables. </li>
<li>
You can set up views referring to S3 tables, the same as for HDFS tables.
</li>
<li> The <codeph>COMPUTE STATS</codeph>, <codeph>SHOW TABLE
STATS</codeph>, and <codeph>SHOW COLUMN STATS</codeph> statements
work for S3 tables. </li>
</ul>
</conbody>
<concept id="s3_performance">
<title>Understanding and Tuning Impala Query Performance for S3 Data</title>
<prolog>
<metadata>
<data name="Category" value="Performance"/>
</metadata>
</prolog>
<conbody>
<p>Here are techniques you can use to interpret explain plans and
profiles for queries against S3 data, and tips to achieve the best
performance possible for such queries. </p>
<p> All else being equal, performance is expected to be lower for
queries running against data in S3 rather than HDFS. The actual
mechanics of the <codeph>SELECT</codeph> statement are somewhat
different when the data is in S3. Although the work is still
distributed across the DataNodes of the cluster, Impala might
parallelize the work for a distributed query differently for data on
HDFS and S3.</p>
<p>S3 does not have the same block notion as HDFS, so Impala uses
heuristics to determine how to split up large S3 files for processing
in parallel. Because all hosts can access any S3 data file with equal
efficiency, the distribution of work might be different than for HDFS
data, where the data blocks are physically read using short-circuit
local reads by hosts that contain the appropriate block replicas.
Although the I/O to read the S3 data might be spread evenly across the
hosts of the cluster, the fact that all data is initially retrieved
across the network means that the overall query performance is likely
to be lower for S3 data than for HDFS data. </p>
<p>Use the <codeph>PARQUET_OBJECT_STORE_SPLIT_SIZE</codeph> query option
to control the Parquet-specific split size. The default value is 256
MB.</p>
<p> When optimizing aspects of complex queries, such as the join order,
Impala treats tables on HDFS and S3 the same way. Therefore, follow
all the same tuning recommendations for S3 tables as for HDFS ones,
such as using the <codeph>COMPUTE STATS</codeph> statement to help
Impala construct accurate estimates of row counts and cardinality. See
<xref href="impala_performance.xml#performance"/> for details. </p>
<p> In query profile reports, the numbers for
<codeph>BytesReadLocal</codeph>,
<codeph>BytesReadShortCircuit</codeph>,
<codeph>BytesReadDataNodeCached</codeph>, and
<codeph>BytesReadRemoteUnexpected</codeph> are blank because those
metrics come from HDFS. By definition, all the I/O for S3 tables
involves remote reads. </p>
</conbody>
</concept>
</concept>
<concept id="s3_restrictions">
<title>Restrictions on Impala Support for S3</title>
<conbody>
<p>The following restrictions apply when using Impala with S3:</p>
<ul>
<li> Impala does not support the old <codeph>s3://</codeph> block-based
and <codeph>s3n://</codeph> filesystem schemes, and it only supports
<codeph>s3a://</codeph>. </li>
<li>Although S3 is often used to store JSON-formatted data, the current
Impala support for S3 does not include directly querying JSON data.
For Impala queries, use data files in one of the file formats listed
in <xref href="impala_file_formats.xml#file_formats"/>. If you have
data in JSON format, you can prepare a flattened version of that data
for querying by Impala as part of your ETL cycle. </li>
<li>You cannot use the <codeph>ALTER TABLE ... SET CACHED</codeph>
statement for tables or partitions that are located in S3. </li>
</ul>
</conbody>
</concept>
</concept>