@changedi
2019-06-03T22:16:31.000000Z
字数 5774
阅读 1328
Impala
Impala服务器是分布式,大规模并行处理(MPP)数据库引擎。它由不同的在群集中的特定主机上运行的守护程序进程组成。
核心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之前跨节点协调元数据所需的需求。
称为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组件将Impala SQL语句中的元数据变更,传递到集群中所有DataNodes。 它由名为catalogd的守护进程物理表示;你只需要再集群中一台主机上运行该进程。 因为请求是通过statestore守护进程传递的,所以在同一主机上运行statestored和catalogd服务是比较靠谱的。
目录服务避免了由Impala执行语句导致的元数据更改,所带来的REFRESH和INVALIDATE METADATA语句的需要。当通过Hive创建表或者加载数据等操作时,您需要在执行之前在发生查询的Impala节点上发出REFRESH或INVALIDATE METADATA指令。
此功能涉及Impala的许多方面:
默认情况下,启动时的元数据加载和缓存是异步发生的,因此Impala可以立即开始接受请求。 要启用原始行为,Impala在接受任何请求之前等待所有元数据加载,请设置catalogd配置选项--load_catalog_in_background=false
。
负载均衡和高可用性的大多数注意事项适用于impalad守护程序。 statestored和catalogd守护进程对高可用性没有特殊要求,因为这些守护进程的问题不会导致数据丢失。如果这些守护进程由于特定主机上的中断而变得不可用,则可以停止Impala服务,删除Impala StateStore和Impala Catalog Server的角色,在其他主机上添加角色,然后重新启动Impala服务。
Impala的核心开发语言是SQL。您还可以使用Java或其他语言通过许多商业智能工具使用的标准JDBC和ODBC接口与Impala进行交互。对于专业类
分析,您可以通过在C++或Java中编写用户定义的函数(UDF)来补充SQL内置函数。
Impala SQL方言与Apache Hive组件(HiveQL)中使用的SQL语法高度兼容。
因此,已经熟悉在Hadoop基础结构上运行SQL查询的用户会很熟悉Impala查询。目前,Impala SQL支持HiveQL语句,数据类型和内置函数的子集。Impala也包括用于常见行业功能的其他内置函数,以简化从非Hadoop系统移植SQL的过程。
对于从传统数据库或数据仓库背景来到Impala的用户,有以下几个方面
SQL方言似乎很熟悉:
对于从传统数据库或数据仓库背景进入Impala的用户,SQL方言的以下方面可能需要一些学习和练习才能使您熟练掌握Hadoop环境:
您可以通过以下方式连接并向Impala守护程序提交请求:
Impala利用Hadoop生态系统中许多熟悉的组件。 Impala可以与其他Hadoop组件(作为消费者和生产者)交换数据,因此它可以灵活地适应您的ETL和ELT管道。
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之间来回切换。
如第17页的Impala如何与Hive一起使用中所述,Impala在称为Metastore的中央数据库中维护有关表定义的信息。 Impala还跟踪数据文件的低级特征的其他元数据:
对于具有大量数据和/或许多分区的表,检索表的所有元数据可能是耗时的,在某些情况下需要几分钟。因此,每个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提供的冗余来防止单个节点上的硬件或网络中断。使用熟悉的HDFS文件格式和压缩编解码器,Impala表数据在物理上表示为HDFS中的数据文件。 当数据文件出现在新表的目录中时,Impala会全部读取它们,而不管文件名是什么。 新数据添加到名称由Impala控制的文件中.
HBase是HDFS的替代品,可作为Impala数据的存储介质。它是一个建立在HDFS之上的数据库存储系统,没有内置的SQL支持。许多Hadoop用户已经在其中配置并存储大量(通常是稀疏的)数据集。通过在Impala中定义表并将它们映射到HBase中的等效表,您可以通过Impala查询HBase表的内容,甚至执行包括Impala和HBase表的连接查询。有关详细信息,请参阅使用Impala查询HBase表(第685页)。