下面是 Clouder Impala 产品常见问题的目录。
继续阅读:
想要试试 Impala 的核心特性和功能,最简便的实验 Impala 的方法就是下载 Cloudera QuickStart VM 并通过 Cloudera Manager 启动 Impala 服务,然后在终端窗口使用 impala-shell,或者在Hue web 接口中使用 Impala Query UI。
想要在集群中测试 Impala 的性能并实验管理特性,你需要超越 QuickStart VM 和它的虚拟化的单节点环境。理想情况下,下载 Cloudera Manager 软件来设置集群,然后通过 Cloudera Manager 安装 Impala。
Cloudera 提供演示 VM 环境 QuickStart VM,包含 VMWare, VirtualBox, KVM 三种格式。更多信息,参见 the Cloudera QuickStart VM。启动 QuickStart VM 后,其中许多服务默认是关闭的;在自动出现的 Cloudera Manager UI 中,启用 Impala 和其他你想要实验的组件
参见 Impala Documentation 了解 Impala 版本说明、关于 Impala 安装、更新、配置、以及 Impala 查询语言的信息。
这里有更多 Impala 产品的信息:
在 Cloudera Announcements 论坛查看最新的 Impala 公告。
你可以在 this Github repository 获得生成数据文件并设置 TPC-DS 类型基准测试环境的脚本。除了可以用于性能试验外,这些表也适用于测试 Impala SQL 的许多方面:他们包含了各种数据类型、数据分布、分区、以及适合连接查询的关系数据。
关于 Impala 的需求,参见 Cloudera Impala Requirements。需要注意的是,对于给定版本的 Impala,通常有一个最小支持的 Clouder Manager 版本。
尽管 Impala 不是内存数据库,当处理大的表和大的结果集时,你应当期待为 impalad 守护进程分配大量的物理内存(you should expect to dedicate a substantial portion of physical memory for the impalad daemon)。推荐 Impala 节点具有至少 128 GB 内存。Impala 操作所需的内存依赖于几个因素:
select * from giant_table order by some_column limit 1000;
并且你的集群有 50 个节点,然后这 50 个节点每个节点将传递最多 1000 行记录给协调节点。协调节点需要足够的内存进行排序(LIMIT *集群节点数) ,尽管这时最终的结果集最多返回 1000 行。如何 Impala 节点在处理中间结果集时超出了预留给 Impala 内存的限制,目前 Impala 不支持"溢出的硬盘(spill to disk)"。假如这对你的情况来说是个问题(例如连接两个非常大的表时),更多内存是有益的。
参见 Hardware Requirements 了解更详细的信息以及 Impala 硬件方面的先决条件。
Impala 使用 SSE4.2 指令。对应 Intel 的 Nehalem+ 芯片和 AMD 的 Bulldozer+ 芯片。Impala 可以在较老的机器上正常运行,但无法达到最佳性能。
关于更详细的不支持的 HiveQL 特性列表,参见 SQL Differences Between Impala and Hive。
Impala 支持 HiveServer2 JDBC 驱动。
是的,支持 Avro。Impala 可以查询 Avro 表。但目前你必须在 Hive 中创建表并加载数据。参见 Using the Avro File Format with Impala Tables 了解详细信息。
请看我们的博客: http://blog.cloudera.com/blog/2012/12/whats-next-for-cloudera-impala/
关于如何设置 Impala 日志对未授权的用户不可读的介绍,参见 Securing Impala Data and Log Files.
关于web 接口对 Impala 日志文件和其他内部服务器信息的密码保护(For instructions on password-protecting the web interface to the Impala log files and other internal server information),参见 Securing the Impala Web User Interface。
Impala statestore 会跟踪当前有多少 impalad 节点可用。你可以通过 statestore 的 web 接口看到这些信息。例如,在 http://statestore_host:25010/metrics 你可以看到类似下面的行:
statestore.live-backends:3
statestore.live-backends.list:[host1:22000,host1:26000,host2:22000]
其中 impalad 节点的个数是列出的对象中使用 22000 端口的对象的个数,这里是 2 个(通常这个数值比 statestore.live-backends 报告的数值少一)。假如一个 impalad 不可用,经过停机后恢复正常,那本页报告的信息会对应的修改。
Impala 尽可能的一有结果就输出来。特定的 SQL 操作(聚合函数或排序操作) 需要所有的结果都准备好才可以返回。
一个查询运行的慢可能有许多原因。使用下面的列表,诊断已有查询性能问题,在写新的查询时避免出现这些问题,配置新的节点,创建新的表,或者加载数据。
- BytesRead: 180.33 MB
- BytesReadLocal: 180.33 MB
- BytesReadShortCircuit: 180.33 MB
假如 BytesReadLocal 低于 BytesRead,你集群中的一些配置可能错了, 例如 impalad 守护进程没有在全部数据节点上都运行。假如 BytesReadShortCircuit 低于 BytesRead,这一节点上可能没有启用 short-circuit 读;参见 Post-Installation Configuration for Impala 了解相关信息InputFormat: org.apache.hadoop.mapred.TextInputFormat
尽管对于不包含 STORED AS 子句的 CREATE TABLE 语句,默认使用未压缩的文本文件格式,但它是占用硬盘空间最大的格式,所以也是查询最慢的格式。对于查询性能很关键的数据,特别是频繁查询的表,请考虑开始或转换成紧凑的二进制文件格式,如Parquet 、Avro、RCFile、SequenceFile。详细信息,参见 How Impala Works with Hadoop File Formatsselect some_col from
huge_table join big_table join medium_table join small_table
where
huge_table.id = big_table.id
and big_table.id = medium_table.id
and medium_table.id = small_table.id;
参见 Performance Considerations for Join Queries 了解连接查询的性能提示当一个 SELECT 语句失败了,原因通常是以下类别之一:
当 INSERT 语句失败时,通常是因为超出 Hadoop 组件的一些限制,特别是 HDFS。
是的。Impala 性能随主机数而扩展(Impala scales with the number of hosts)。在集群中所有数据节点上安装 Impala 很重要,否则的话,一些节点必须进行远程读取以获得本地读取无法获得的数据。对于 Impala 性能来说,数据本地化(Data locality) 是一个重要的架构方面(architectural aspect)。参见 this Impala performance blog post 了解背景信息。请注意这些博客使用 Impala 1.1.1 进行的基准测试;在 Impala 1.2.x 系列中,已经添加了更多性能特性。
不会。Impala 不会对 HDFS 或 HBase 数据集做任何修改。
默认的 Parquet 块大小已经相当的大(1GB),并且在创建 Parquet 文件时使用 PARQUET_FILE_SIZE 查询选项可以控制块大小。
Impala 不会缓存数据,但它缓存一些表和文件的元数据。尽管因为数据集被缓存到 OS 的缓冲区中,接下来的重复查询可能运行的更快,Impala 不会明确的控制这些。
Impala 非常适合在大的数据集上,为交互式探索分析执行 SQL。Hive 和 MapReduce 则适合长时间运行的、批处理的任务,例如 ETL。
Impala 根本用不到 MapReduce。
例如,在工业环境中,许多客户端可能产生大量的数据。Impala 是否可用与分析这些数据,发现环境中显著的变化?
复杂事件处理(Complex Event Processing,CEP) 通常使用专门的流处理系统处理。Impala 不是流处理系统,它其实更像关系数据库。
即席查询(Ad-hoc)是 Impala 的主要使用情况。我们估计它会在许多需要低延迟的环境中使用。Impala 是否适合某个特定的情况依赖于此时的负载、数据大小和查询次数。参见 Impala Benefits 了解使用 Impala 可以获得的主要益处。
Impala 与 Hive 和 Pig 不同,因为它使用自己的守护进程,跨集群分布式进行查询。因为 Impala 不依赖于 MapReduce,它避免了 MapReduce 作业的启动开销,让 Impala 能实时返回结果。
Impala 1.2 开始支持 UDFs。你可以使用 C++ 写你自己的函数,或者重用已有的基于 Java 的 Hive UDFs。支持的 UDF 包括标量函数和用户定义聚合函数(UDAs)。目前不支持用户定义表函数(UDTFs)。
Impala 目前不支持扩展序列号-反序列化(serialization-deserialization)框架(SerDes),因此为 Impala 添加扩展功能不像 Hive 或 Pig 那么简单。
是的。尽管在一些查询如何处理方面有细微的差别,但是 Impala 查询也可以在 Hive 中完成。Impala SQL 是 HiveQL 的子集,有一些功能限制如变换(transforms)。关于具体的 Impala SQL 方言,参见 SQL Statements。关于 Impala 内置函数,参见 Built-in Functions。关于不支持的 HiveQL 特性,参见 SQL Differences Between Impala and Hive。
允许 Impala 查询 Hive 管理的表,不管它是存放在 HDFS 还是 HBase中,都不需要额外的步骤。请确保已经正确的配置 Impala 访问 Hive metastore,并且你准备好了。请记住,默认的 impalad 使用 impala 用户运行,所以你可能需要调整一些文件的权限,这取决于你目前权限多么严格。
参见 Using Impala to Query HBase Tables 了解查询 HBase 中数据的详细信息。
Hive metastore 服务是必需的。Impala 与 Hive 共享同一个 metastore 数据库,透明的允许 Impala 和 Hive 访问相同的表。
Hive 本身是可选的,并且不需要跟 Impala 安装在同一个节点上。相比目前 Impala 支持的写(插入)操作(的文件格式),Impala 支持更多类型的读取(查询)操作;对于使用的特定的文件格式,你应当使用 Hive 向表里插入数据。参见 How Impala Works with Hadoop File Formats 了解详细信息。
Impala 已经完成了它的测试版本发布周期,1.0 GA 版本已经为生产环境做好准备。而 1.1.x 系列包括了授权这一新增的安全特性,这是许多组织使用产品的重要需求。一些 Cloudera 客户已经为大的负载使用 Impala。
Impala 1.2.0 版本目前是测试版,因为它使用了许多仅在 CDH 5.0 测试版中可用的特性。随后的与 CDH 4 协同的 1.2.1 和 1.2.2,适用于生产环境 (相比 1.2.1,更推荐 1.2.2,因为 1.2.2 包含了许多针对连接查询的性能优化)。
你可以设置代理服务器,转发 Impala 服务器来回的请求,以实现负载均衡和高可用性。参见 Using Impala through a Proxy for High Availability 了解详细信息。
你可以为 Hive metastore 启用 HDFS HA。参见 CDH4 High Availability Guide 了解详细信息。
Impala 中不会出现单点故障。所有的 Impala 守护进程全都可以处理所接受的查询。假如一台机器出现故障,在这台机器上有查询片段(fragments)在上面运行的查询都会失败。因为查询被期望快速返回的,当查询失败时你可以重新运行失败的查询(Because queries are expected to return quickly, you can just rerun the query if there is a failure)。参见 Impala Concepts and Architecture 了解 Impala 架构的详细信息。
完整回答:Impala 必须能够连接到 Hive metastore。Impala 积极缓存元数据,这样 metastore 主机的负载很小。Impala 依赖于 HDFS NameNode,并且在 CDH 4中你可以为 HDFS 配置 HA。Impala 同样有一个集中的软件状态(soft-state)服务,称作 statestore 和 catalog 服务,仅仅在一台主机上运行。假如 statestore 主机下线,Impala 会继续执行查询,但不会获得状态更新。例如,如果在 statestore 主机下线期间向集群添加了一台主机,运行在其他主机上的已有的 impalad 实例将不会发现这台新的主机。一当 statestore 进程重启后,所有它提供的信息会根据所有运行的 Impala 守护进程自动重建。
没有限制。一些用户已经使用 Impala 查询包含上万亿记录的表。
是的。参见 Controlling Resource Usage 了解如何使用 Linux cgroup 机制控制 Impala 使用的资源,以及 Using YARN Resource Management with Impala (CDH 5 Only) 了解如何使用 Impala 和 YARN 资源管理框架。Impala 被设计为运行在 DataNode 主机上的。任何资源冲突都依赖于集群的配置和负载。
关于详细的如何配置集群在 Impala 查询和 MapReduce 作业之间共享资源的例子,参见 Setting up a Multi-tenant Cluster for Impala and MapReduce
为了更佳的性能,Cloudera 强烈推荐在每一台数据节点(DataNode)上都运行 impalad 守护进程。尽管这一拓扑结构不是硬性要求,假如有任意主机,上面包含了数据块副本但是没有 Impala 守护进程运行,那么涉及到这些数据的查询的效率将非常低下(if there are data blocks with no Impala daemons running on any of the hosts containing replicas of those blocks, queries involving that data could be very inefficient)。这时候,这些数据必须通过"远程读取"从一台主机传输到另外一台主机以进行处理,这是 Impala 应尽量避免的情况。参见 Impala Concepts and Architecture 了解关于 Impala 架构的详细信息。Impala 会尽可能的调度查询分片,以便能在存放对应数据的主机上执行查询(Impala schedules query fragments on all hosts holding data relevant to the query, if possible)。
默认的,Impala 使用基于成本的方法,根据表的总大小和行数,自动确定最高效的表连接顺序(这是从 Impala 1.2.2 才开始具有的新特性)。使用 COMPUTE STATS 语句采集的每一个表的统计信息是高效连接的关键。Impala 连接查询在两种连接技术之间进行选择,分别是 "广播连接(broadcast joins)" 和 "分割连接(partitioned joins)"。参见 Joins 了解语法详情,参见 Performance Considerations for Join Queries 了解性能注意事项。
Impala 采用多种策略,允许不同大小的表和结果集进行连接。当一个大表与一个小表连接时,小表中的所有数据会传输到每一节点上以进行中间处理。当连接两个大表时,其中一个表的数据被拆分成多块,每一个节点只处理其中选中的块。参见 Joins 了解连接处理的详细信息,Performance Considerations for Join Queries 了解性能注意事项,Hints 了解如何微调连接策略。
Impala 目前仅支持内存中的哈希聚合(hash aggregation)。
Impala 使用两部分的元数据:Hive metastore 中的目录信息和 NameNode 中的文件元数据。目前,当 impalad 需要元数据以产生查询的执行计划时才加载并缓存元数据(this metadata is lazily populated and cached when an impaladneeds it to plan a query)
当在 Hive 中加载新数据之后,使用 REFRESH 语句更新这个表的元数据。INVALIDATE METADATA Statement 语句刷新所有的元数据,以便 Impala 识别到 Hive 中创建的新表或其他 DDL 、DML 的修改。
在 Impala 1.2 及以上版本中,有一个单独的 catalogd 守护进程向所有节点广播 Impala 中 DDL 或 DML 语句导致的元数据变化,减少或避免了使用 REFRESH 和 INVALIDATE METADATA 语句的需求。
Impala 产生的负载与 MapReduce 产生的非常类似。Impala 在规划阶段连接 NameNode 以获得文件元数据(仅在接收到查询的主机上执行)。每一个 impalad 将读取文件作为查询正常处理的一部分(Every impalad will read files as part of normal processing of the query)。
这是 Impala 与其他 Hadoop 组件和相关技术在性能方面不同的主要原因(These are the main factors in the performance of Impala versus that of other Hadoop components and related technologies)。
Impala 避免使用 MapReduce。尽管 MapReduce 是一种伟大的通用并行处理模型,具有许多优点,但是它不是专为执行 SQL 设计的。Impala 在这些方面避免了 MapReduce 的低效:
Impala 通过利用最新机器和技术(modern hardware and technologies),采用了一种更高效的执行引擎(Impala uses a more efficient execution engine by taking advantage of modern hardware and technologies):
目前来说,假如在某一节点上处理中间结果集所需的内存超出了这一节点上 Impala 可用的内存,查询会被取消。你可以调整每一节点上 Impala 的可用内存,也可以对你最大的查询微调连接策略来减少内存需求。我们计划在将来支持外部连接和排序。
但请记住,使用内存的大小并不是跟输入数据集的大小直接相关。对于聚合来说,使用的内存跟分组后的行数有关。对于连接来说,使用的内存与除了最大的表之外其他所有表的大小相关,并且 Impala 可以采用在每个节点之间拆分大的连接表而不是把整个表都传输到每个节点的连接策略。
假如查询失败,错误信息是 "memory limit exceeded",你可能怀疑有内存泄露(memory leak)。其实问题可能是因为查询构造的方式导致 Impala 分配超出你预期的内存,从而在某些节点上超出 Impala 分配的内存限制(The problem could actually be a query that is structured in a way that causes Impala to allocate more memory than you expect, exceeded the memory allocated for Impala on a particular node)。一些特别内存密集型的查询和表结构如下:
Impala 使用 tcmalloc 分配内存,一款专为高并发优化的内存分频器。一当 Impala 分配了内存,它保留这些内存用于将来的查询。因此,空闲时显示 Impala 有很高的内存使用是很正常的。假如 Impala 检测到它将超过内存限制(通过 -mem_limit 启动选项或 MEM_LIMIT 查询选项定义),它将释放当前查询不需要的所有内存。
当通过 JDBC 或 ODBC 接口执行查询,请确保在之后调用对应的关闭方法。否则,查询关联的一些内存不会释放。
Impala 目前不支持 UPDATE 语句,它通常用于修改单行数据、一小组数据、或特定的列。通常 Impala 查询使用的基于 HDFS 的文件针对一次超过许多M的批量操作(bulk operations)进行了优化,这使得传统的 UPDATE 操作低效或不切实际。
你可以使用下面的技术来达到与熟悉的 UPDATE 语句相同的目标,并为之后的查询保持高效的文件布局:
Impala 1.2 及以上版本支持 UDFs 和 UDAs。你可以使用 C++ 编写本地 Impala UDFs 和 UDAs,或者重用之前用 Java 编写的 Hive 中的 UDFs (但不支持 UDAs) 。参见 User-Defined Functions 了解详细信息。
在 Impala 1.2 或更高版本中,大大减少了使用 REFRESH 和 INVALIDATE METADATA 语句的情况:
当你对内部表而不是外部表执行 DROP TABLE 后,Impala 删除对应的数据文件。默认的,CREATE TABLE 语句创建内部表,文件被 Impala 管理。外部表通过 CREATE EXTERNAL TABLE 语句创建,文件位置在 Impala 控制范围之外。请执行 DESCRIBE FORMATTED 语句检查表是内部表还是外部表。关键字 MANAGED_TABLE 表示是内部表,Impala 可以删除这些数据文件。关键字 EXTERNAL_TABLE 表示这是外部表,当你删除表时,Impala 将保持这些数据文件不变。
即使当你删除一个内部表并且文件已经从原来的位置移除,你可能也不会立刻得到空闲的硬盘空间。默认的,HDFS 中删除的文件放到特定的回收站(trashcan)目录,在那里过一段时间(默认是 6 小时)后被清除。关于回收站机制的背景知识,请参见 http://archive.cloudera.com/cdh4/cdh/4/hadoop/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html。更多关于在回收站清除文件的信息,参见 http://archive.cloudera.com/cdh4/cdh/4/hadoop/hadoop-project-dist/hadoop-common/FileSystemShell.html。
当 Impala 删除文件,并且那些文件被移动到 HDFS 回收站,他们存放在属于 impala 用户的 HDFS 目录中。假如 impala 用户没有 HDFS home 目录,在这里回收站会被创建,基于安全的考虑,这些文件不会被删除和移动。假如你执行了 DROP TABLE 语句,然后发现表的数据文件仍然在原来的位置,请先创建 HDFS 目录 /user/impala,属于 impala 用户,并可写。例如,你可能发现 /user/impala 属于 hdfs 用户,这时你需要切换成 hdfs 用户并执行类似的命令:
hdfs dfs -chown -R impala /user/impala
为了向分区表里加载数据文件,当数据文件包含类似 year,month, 等等对应着分区键的列时,使用两步处理。首先,使用 LOAD DATA 或 CREATE EXTERNAL TABLE 语句加载数据到未分区的表里。然后使用 INSERT ... SELECT 语句从未分区的表向分区表复制数据。在 INSERT 语句中包含 PARTITION 子句指定分区键列。对每一个分区,这一 INSERT 操作把数据拆分成单独的数据文件。例如,参见 Partitioning 中的例子。关于如何把数据加载到分区 Parquet 表(大批量数据的热门选择)的详细信息,参见 Loading Data into Parquet Tables。
当你使用 INSERT ... SELECT * 语法复制数据到分区表时,对应分区键的列必须出现在 SELECT * 所返回列的最后。你可以把分区键定义放在最后来创建表。或者,你可以使用 CREATE VIEW 语句创建一个记录这些列:把分区键列放在最后,然后使用 INSERT ... SELECT * from the view。