标签(空格分隔): Impala
Impala Server的组件
Impala服务器是分布式,大规模并行处理(MPP)数据库引擎。它由不同的在群集中的特定主机上运行的守护程序进程组成。
Impala守护进程
核心Impala组件是一个守护进程,它通过impalad进程在集群的每个DataNode上运行。它读写数据文件;接受从impala-shell、Hue、JDBC或ODBC传输的查询命令;并行化查询并在整个集群中分配工作;传输中间查询结果返回中央协调节点。
您可以向在任何DataNode上运行的Impala守护进程提交查询,并且该守护进程的实例用作该查询的协调节点。其他节点将部分结果发送回协调器,该协调器构造查询的最终结果集。通过impala-shell命令运行具有功能的实验时,为方便起见,您可能始终连接到相同的Impala守护进程。对于运行生产工作负载的集群,您可以通过使用JDBC或ODBC接口将每个查询以round robin的方式提交给不同的Impala守护程序来进行负载均衡。
Impala守护进程与statestore持续通信,以确认哪些节点是健康的并且可以
接受新的工作。
无论什么Impala节点在集群中创建、更改或删除任何类型的对象,或者是INSERT或LOAD DATA语句,它们还会从catalogd守护进程(在Impala 1.2中引入)接收广播消息。这种后台通信最大限度地减少了对REFRESH或INVALIDATE METADATA语句的这种在Impala 1.2之前跨节点协调元数据所需的需求。
Impala Statestore
称为statestore的Impala组件检查一个集群中所有DataNode上的Impala守护进程的运行状况,并不断将其发现传递给每个守护进程。它由守护进程名字为statestored来表示;您只需要在群集中的一台主机上执行此进程。如果一个Impala守护进程由于硬件故障,网络错误,软件问题或其他原因离线,statestore通知所有其他Impala守护进程,以便将来的查询可以避免向无法访问的节点发出请求。
因为statestore的目的是在出现问题时提供帮助,因此对Impala集群的正常操作并不重要。如果statestore未运行或无法访问,则Impala守护程序将继续运行和分发,他们像往常一样工作;集群只是变得不那么健壮了,当statestore离线时无法感知其他Impala守护进程的失败。当statestore重新联机时,它会重新建立与Impala守护进程的通信,恢复其监控功能。
负载均衡和高可用性的大多数注意事项适用于impalad守护进程。statestored和catalogd守护进程对高可用性没有特殊要求,因为这些问题不会导致数据丢失。如果这些守护进程因特定主机的中断而变得不可用,那么
可以停止Impala服务,删除Impala StateStore和Impala Catalog Server角色,添加这些角色到不同的主机,并重新启动Impala服务。
Impala Catalog Service
称为目录服务的Impala组件将Impala SQL语句中的元数据变更,传递到集群中所有DataNodes。 它由名为catalogd的守护进程物理表示;你只需要再集群中一台主机上运行该进程。 因为请求是通过statestore守护进程传递的,所以在同一主机上运行statestored和catalogd服务是比较靠谱的。
目录服务避免了由Impala执行语句导致的元数据更改,所带来的REFRESH和INVALIDATE METADATA语句的需要。当通过Hive创建表或者加载数据等操作时,您需要在执行之前在发生查询的Impala节点上发出REFRESH或INVALIDATE METADATA指令。
此功能涉及Impala的许多方面:
- 请参阅第24页的“安装Impala”,第30页的“升级Impala”和第31页的“启动Impala”,来查看catalogd守护程序的使用信息。
- CREATE TABLE,INSERT或者通过Impala执行其他表更改或数据更改操作时不需要REFRESH和INVALIDATE METADATA语句。
如果这样的操作是通过Hive完成的,或者是直接在HDFS中操作数据文件,这些语句仍然需要。但在那些情况下,这些语句只需要在一个Impala节点上发布,而不是在所有节点上发布。请参阅第311页上REFRESH声明有关这些内容的最新用法信息,请参见304页的INVALIDATE METADATA语句声明。
默认情况下,启动时的元数据加载和缓存是异步发生的,因此Impala可以立即开始接受请求。 要启用原始行为,Impala在接受任何请求之前等待所有元数据加载,请设置catalogd配置选项--load_catalog_in_background=false
。
负载均衡和高可用性的大多数注意事项适用于impalad守护程序。 statestored和catalogd守护进程对高可用性没有特殊要求,因为这些守护进程的问题不会导致数据丢失。如果这些守护进程由于特定主机上的中断而变得不可用,则可以停止Impala服务,删除Impala StateStore和Impala Catalog Server的角色,在其他主机上添加角色,然后重新启动Impala服务。
开发Impala程序
Impala的核心开发语言是SQL。您还可以使用Java或其他语言通过许多商业智能工具使用的标准JDBC和ODBC接口与Impala进行交互。对于专业类
分析,您可以通过在C++或Java中编写用户定义的函数(UDF)来补充SQL内置函数。
Impala SQL方言概览
Impala SQL方言与Apache Hive组件(HiveQL)中使用的SQL语法高度兼容。
因此,已经熟悉在Hadoop基础结构上运行SQL查询的用户会很熟悉Impala查询。目前,Impala SQL支持HiveQL语句,数据类型和内置函数的子集。Impala也包括用于常见行业功能的其他内置函数,以简化从非Hadoop系统移植SQL的过程。
对于从传统数据库或数据仓库背景来到Impala的用户,有以下几个方面
SQL方言似乎很熟悉:
- SELECT语句包括熟悉的子句,如WHERE,GROUP BY,ORDER BY和WITH。您
会找到熟悉的概念,例如连接,用于处理字符串,数字和日期的内置函数,聚合函数,子查询和比较运算符,如IN()和BETWEEN。SELECT语句是SQL标准合规性最重要的地方。 - 从数据仓库世界,您将认识到分区表的概念。一列或多列
用作分区键,并且数据按此物理排列以便查询引用分区键列在WHERE子句中可以跳过与过滤条件不匹配的分区。例如,如果你有10年的数据并使用诸如WHERE year= 2015,WHERE year > 2010年或WHERE年IN(2014年,2015年),Impala会跳过非匹配年份的所有数据,为查询大大减少了I/O的数量。 - 在Impala 1.2及更高版本中,UDF允许您在SELECT期间执行自定义比较和转换逻辑和INSERT ... SELECT语句。
对于从传统数据库或数据仓库背景进入Impala的用户,SQL方言的以下方面可能需要一些学习和练习才能使您熟练掌握Hadoop环境:
- Impala SQL专注于查询,包含相对较少的DML。没有UPDATE或DELETE语句。过时数据通常被丢弃(通过DROP TABLE或ALTER TABLE ... DROP PARTITION语句)或替换(通过INSERT OVERWRITE语句)。
- 所有数据创建都由INSERT语句完成,这些语句通常通过查询其他表来批量插入数据。有两种变体,INSERT INTO附加到现有数据,INSERT OVERWRITE替换表或分区的全部内容(类似于TRUNCATE TABLE后跟新的INSERT)。尽管INSERT ... VALUES语法在单个语句中创建了少量值,但使用INSERT ... SELECT在一次操作中从一个表复制和转换大量数据到另一个表效率要高得多。
- 您经常在其他环境中构建Impala表定义和数据文件,然后附加Impala
它可以运行实时查询。相同的数据文件和表元数据与其他组件共享Hadoop生态系统。特别是,Impala可以访问由Hive创建的表或Hive插入的数据,Hive可以访问Impala生成的表和数据。许多其他Hadoop组件可以以Parquet和Avro等格式写入文件,然后可以通过Impala查询。 - 由于Hadoop和Impala专注于大型数据集上的数据仓库式操作,因此Impala SQL包含一些您可能在传统数据库系统的导入实用程序中找到的习惯用法。例如,您可以创建一个表,该表读取逗号分隔或制表符分隔的文本文件,在CREATE TABLE语句中指定分隔符。您可以创建读取现有数据文件但不移动或转换它们的外部表。
- 由于Impala读取的数据量可能不是很完整且可预测,因此不需要对字符串数据类型进行长度限制。例如,您可以将数据库列定义为STRING,其长度不受限制,而不是CHAR(1)或VARCHAR(64)。(尽管在Impala 2.0及更高版本中,您也可以使用长度限定的CHAR和VARCHAR类型。)
Impala编程接口概览
您可以通过以下方式连接并向Impala守护程序提交请求:
- impala-shell交互式命令解释程序。
- Hue基于Web的用户界面。
- JDBC。
- ODBC。
使用这些选项,您可以在异构环境中使用Impala,在非Linux平台上运行JDBC或ODBC应用程序。您还可以将Impala与使用JDBC和ODBC接口的各种商业智能工具结合使用。在集群中的不同节点上运行的每个impalad守护进程都会侦听多个端口以接收传入请求。来自impala-shell和Hue的请求将通过同一端口路由到impalad守护程序。impalad守护程序在单独的端口上侦听JDBC和ODBC请求。
Impala如何适用在Hadoop生态系统中
Impala利用Hadoop生态系统中许多熟悉的组件。 Impala可以与其他Hadoop组件(作为消费者和生产者)交换数据,因此它可以灵活地适应您的ETL和ELT管道。
Impala和Hive协同工作
Impala的一个主要目标是使SQL-on-Hadoop操作快速高效,足以吸引新类别的用户,并将Hadoop打开到新类型的用例。在可行的情况下,它利用许多Hadoop用户已有的现有Apache Hive基础架构来执行长期运行的,面向批处理的SQL查询。
特别的,Impala将其表定义保存在传统的MySQL或PostgreSQL数据库中,称为Metastore,即Hive保存此类数据的同一数据库。因此,只要所有列都使用Impala支持的数据类型,文件格式和压缩编解码器,Impala就可以访问由Hive定义或加载的表。
最初关注查询功能和性能意味着Impala可以使用SELECT语句读取比使用INSERT语句编写的更多类型的数据。要使用Avro,RCFile或SequenceFile文件格式查询数据,请使用Hive加载数据。
Impala查询优化器还可以使用表统计信息和列统计信息。最初,您使用Hive中的ANALYZE TABLE语句收集了此信息;在Impala 1.2.2及更高版本中,请改用Impala COMPUTE STATS语句。 COMPUTE STATS需要较少的设置,更可靠,并且不需要在impala-shell和Hive shell之间来回切换。
Impala元数据和Metastore
如第17页的Impala如何与Hive一起使用中所述,Impala在称为Metastore的中央数据库中维护有关表定义的信息。 Impala还跟踪数据文件的低级特征的其他元数据:
- HDFS中文件块的物理位置。
对于具有大量数据和/或许多分区的表,检索表的所有元数据可能是耗时的,在某些情况下需要几分钟。因此,每个Impala节点都会缓存所有这些元数据,以便针对同一个表进行将来的查询。
如果更新了表定义或表中的数据,则在针对该表发出查询之前,集群中的所有其他Impala守护程序必须接收最新的元数据,替换过时的缓存的元数据。在Impala 1.2及更高版本中,对于通过Impala发出的所有DDL和DML语句,元数据更新是通过catalogd守护程序自动协调的。有关详细信息,请参阅第15页的Impala目录服务。
对于通过Hive发出的DDL和DML,或者手动更改为HDFS中的文件,您仍然使用REFRESH语句(当新数据文件添加到现有表时)或INVALIDATE METADATA语句(对于全新表,或在删除表之后,执行HDFS重新平衡操作或删除数据文件)。发出INVALIDATE METADATA本身会检索由Metastore跟踪的所有表的元数据。如果您知道在Impala之外只更改了特定表,则可以为每个受影响的表发出REFRESH table_name,以仅检索这些表的最新元数据。
Impala如何使用HDFS
Impala使用分布式文件系统HDFS作为其主要数据存储介质。Impala依赖于HDFS提供的冗余来防止单个节点上的硬件或网络中断。使用熟悉的HDFS文件格式和压缩编解码器,Impala表数据在物理上表示为HDFS中的数据文件。 当数据文件出现在新表的目录中时,Impala会全部读取它们,而不管文件名是什么。 新数据添加到名称由Impala控制的文件中.
Impala如何使用Hbase
HBase是HDFS的替代品,可作为Impala数据的存储介质。它是一个建立在HDFS之上的数据库存储系统,没有内置的SQL支持。许多Hadoop用户已经在其中配置并存储大量(通常是稀疏的)数据集。通过在Impala中定义表并将它们映射到HBase中的等效表,您可以通过Impala查询HBase表的内容,甚至执行包括Impala和HBase表的连接查询。有关详细信息,请参阅使用Impala查询HBase表(第685页)。