写点什么

Cloudera Impala 与 Hive:架构对比及协同工作机制

  • 2024-10-18
    四川
  • 本文字数:5684 字

    阅读完需:约 19 分钟

Cloudera Impala与Hive:架构对比及协同工作机制

impala 简介  


impala 由 Cloudera 公司推出,提供对 HDFS、Hbase 数据的高性能、低延迟的交 互式 SQL 查询功能。基于 Hive 使用内存计算,兼顾数据仓库、具有实时、批处理、 多并发等优点。是 CDH 平台首选的 PB 级大数据实时查询分析引擎。已有的 Hive 系 统虽然也提供了 SQL 语义,但由于 Hive 底层执行使用的是 MapReduce 引擎,仍然 是一个批处理过程,难以满足查询的交互性。相比之下,Impala 的最大特点就是基 于内存处理数据,查询速度快。


Impala 与 Hive 都是构建在 Hadoop 之上的数据查询工具各有不同的侧重适应面, 但从客户端使用来看 Impala 与 Hive 有很多的共同之处,如数据表元数据、 ODBC/JDBC 驱动、SQL 语法、灵活的文件格式、存储资源池等。


Impala 与 Hive 在 Hadoop 中的关系下图所示。Hive 适合于长时间的批处理查询 分析,而 Impala 适合于实时交互式 SQL 查询,Impala 给数据分析人员提供了快速 实验、验证想法的大数据分析工具。可以先使用 hive 进行数据转换处理,之后使用 Impala 在 Hive 处理后的结果数据集上进行快速的数据分析。  


impala 架构  


impala 架构

Impala 主要有 Impalad、State Store、Catlog 和 CLI 组成:

ØImpalad:

与 DataNode 运行在同一节点上,由 Impalad 进程表示,它接收客户端的查询请求 (接收查询请求的 Impalad 为 Coordinator,Coordinator 通过 JNI[java native interface]调用 java 前端解释 SQL 查询语句,生成查询计划树,再通过 调度器把执行计划分发给具有相应数据的其它 Impalad 进行执行),读写数据,并行执行查询,并把结果通过网络流式的传送回给 Coordinator,由 Coordinator 返回给客户端。


同时 Impalad 也与 State Store 保持连接,用于确定哪个 Impalad 是健康和可以接受新的工作。在 Impalad 中启动三 ThriftServer: beeswax_server(连接客户端),hs2_server(借用 Hive 元数据), be_server (Impalad 内部使用)和一个 ImpalaServer 服务。


每个 impalad 实例会接收、规划并调节来自 ODBC 或 Impala Shell 等客户端的查 询。每个 impalad 实例会充当一个 Worker,处理由其它 impalad 实例分发出来的 查询片(queryfragments)。客户端可以随便连接到任意一个 impalad 实例, 被连接的 impalad 实例将充当本次查询的协调者(Ordinator),将查询分发给集 群内的其它 impalad 实例进行并行计算。


当所有计算完毕时,其它各个 impalad 实例将会把各自的计算结果发送给充当 Ordinator 的 impalad 实例,由这个 Ordinator 实例把结果返回给客户端。每个 impalad 进程可以处理多个并发请求。


ØImapla State Store:


负责 Quary 的调度及跟踪集群中的 Impalad 的健康状态及位置信息,由 statestored 进程表示,它通过创建多个线程来处理 Impalad 的注册订阅和与各 Impalad 保持心跳连接,各 Impalad 都会缓存一份 State Store 中的信息,当 State Store 离线后,因为 Impalad 有 State Store 的缓存仍然可以工作,但会因为有些 Impalad 失效了,而已缓存数据无法更新,导致把执行计划分配给了失效 的 Impalad,导致查询失败。Impalad 发现 State Store 处于离线时,会进入 recovery 模式,反复注册,当 State Store 重新加入集群后,自动恢复正常,更 新缓存数据。    


ØCatalog:


当 Impala 集群启动后,负责从 Hive MetaStore 中获取元数据信息,放到 impala 自己的 catalog 中。Catalog 会与 StateStore 通信,将原数据信息通过 StateStore 广播到每个 Impalad 节点。同时当 Impala 客户端在某个 Impalad 中创建表后,Impalad 也会将建表的原数据信息通过 State Store 通知给各个 Impalad 节点和 Catalog,由 Catalog 同步到 Hive 的元数据中。


注意 :Hive 中创建表产生的原数据信息,不能同步到 catalog 中,需要手动执行命 令同步。


ØCLI(Impala shell):


命令行客户端,提供给用户查询使用的命令行工具。


impala 优势  

  1. 基于内存进行计算,能够对 PB 级数据进行交互式实时查询、分析。不需要把中间结果写入磁盘,省掉了大量的 I/O 开销。最大限度的使用内存,中间结果不写磁盘,Impalad 之间通过网络以 stream 的方式传递数据。

  2. 无需转换为 MR,直接读取 HDFS 数据。省掉了 MR 作业启动的开销,Impala 直接通过相应的服务进程来进行作业调度, 速度快。

  3. C++编写,LLVM 统一编译运行。LLVM 是构架编译器(compiler)的框架系统,以 C++编写而成,用于优化以任意 程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time)。使用 C++实现,做了很多针对 性的硬件优化。

  4. 兼容 HiveSQL,可对 Hive 数据直接分析。 

  5. 支持 Data Local,Impala 支持 Data Locality 的 I/O 调度机制,尽可能的将数据和计算分配在 同一台机器上执行,减少网络开销。

  6. 支持列式存储。

  7. 支持 JDBC/ODBC 远程访问。


impala 劣势  

  1. 对内存的依赖大,要求高。        

  2. 完全依赖 Hive,不支持 Hive 的 UDF 和 UDAF 函数,不支持查询期的容错。 

  3. 分区超过 1w 性能严重下降。

  4. 稳定性不如 hive。

impala 与 Hive 差异  


同点:

impala 与 Hive 使用相同的元数据,都支持将数据存储在 HDFS 和 Hbase 中,都是对 SQL 进行词法分析生成执行计划。


不同点:

1.执行计划:

Hive: 依 赖 与 MapReduce 执 行 框 架 , 执 行 计 划 分 为 map->shuffle->reduce->map->shuffle->reduce... 由于中间有很多次 shuffle,SQL 执行时间长。


Impala:执行计划表现为一棵完整的执行计划树,可以更自然地分发执行计划到各 个 Impalad 中执行查询,而不需要转换成 MapReduce 模式处理,保证 impala 有更好的并发性和避免不必要的中间 sort 和 shuffle。


2.数据流

Hive:采用推的方式,每个计算节点计算完成之后将数据主动退给后续节点。


impala:采用拉的方式,后续节点通过 getNext 主动向前面节点要数据,此方式 可以将数据流式的返回给客户端,只要有一条数据处理完成,就可以立即被展示出 来,不需要等待全部数据处理完成,更符合 sql 交互式查询。    


3.内存使用

Hive:在执行过程中如果内存放不下数据,则会使用磁盘,保证 SQL 能顺序执行 完成,每一轮 Map-Reduce 执行结束后,中间结果也会落地磁盘。


Impala:在遇到内存放不下数据时,就会报错。这使 impala 处理数据有一定的局 限性,最好与 Hive 配合使用。Impala 在多个阶段之间利用网络传输数据,在执 行过程中不会有写磁盘操作(insert 除外)。


4.调度          

Hive:Hive 调度依赖于 Hadoop 的调度策略。

Impala:调度由 Impala 自己完成,会尽量将处理数据的进程靠近数据本身所在的物理机器。


5.容错

Hive:依赖于 Hadoop 的容错能力。

Impala:整体来看,Impala 容错一般,用户可以向任意一台 impalad 提交 SQL 查询。如果一个 Impalad 失效,在当前 Impala 上执行的所有 SQL 查询将失败, 但是用户可以重新提交查询由其他的 Impalad 代替执行,不影响服务。在查询过 程中,没有容错逻辑,如果执行过程中发生故障,则直接返回错误。对于 Impala 中的 State Store 目前只有一个,但当 State Store 失效,也不会影响服务, 每个 Impalad 都缓存了 State Store 的信息,只是不能在更新集群状态,有可 能会把执行任务分配给已经失效的 Impalad 执行,导致 SQL 执行失败。    


6.适用方面 Hive:复杂的批处理查询任务,数据转换任务。

Impala:实时数据分析,因为不支持 UDF,对处理复杂的问题分析有局限性,与 Hive 配合使用,对 Hive 的结果数据集进行实时分析。


安装  


1.选择集群,添加服务



2.添加服务向导          

在弹出的窗口中选择 impala,点击“继续”:    



选择 HDFS:



角色按照默认配置即可,点击“继续”:



选择 impala 的数据目录,默认即可,点击“继续”->“完成”,完成 impala 的安装:    


impala 的使用 

在集群主页上,启动 impala。


1.测试 Hive&impala 的速度  


首先切换 hdfs 用户,在 cm2 节点的 xshell 上进入 hive 客户端,在之前 hue 的 使用中,给 Hive 中插入过表“my_hive_table”,执行 sql 语句查看在 hive 中 执行速度:

[root@cm2 init.d]# su hdfs [hdfs@cm2 init.d]$ hivehive> show tables;OKmy_hive_tableTime taken: 0.515 seconds, Fetched: 1 row(s)hive> select count(*) from my_hive_table;Query ID = hdfs_20190814201010_cc6c373e-c7a4-4046-8d50-e48e79d02c72Total jobs = 1Launching Job 1 out of 1Number of reduce tasks determined at compile time: 1In order to change the average load for a reducer (in bytes):set hive.exec.reducers.bytes.per.reducer=<number>In order to limit the maximum number of reducers:set hive.exec.reducers.max=<number>In order to set a constant number of reducers:set mapreduce.job.reduces=<number>Starting Job = job_1565783077183_0001, Tracking URL = http://cm1:8088/proxy/application_1565783077183_0001/Kill Command = /opt/cloudera/parcels/CDH-5.4.0-1.cdh5.4.0.p0.27/lib/hadoop/bin/hadoop job -kill job_1565783077183_0001Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 12019-08-14 20:10:28,069 Stage-1 map = 0%, reduce = 0%2019-08-14 20:10:41,848 Stage-1 map = 100%, reduce = 100%, Cumulative CPU 4.01 sec2019-08-14 20:10:41,848 Stage-1 map = 100%, reduce = 100%, Cumulative CPU 4.01 secMapReduce Total cumulative CPU time: 4 seconds 10 msecEnded Job = job_1565783077183_0001MapReduce Jobs Launched:Stage-Stage-1: Map: 1 Reduce: 1 Cumulative CPU: 4.01 sec HDFS Read: 6435 HDFS  Write: 2 SUCCESSTotal MapReduce CPU Time Spent: 4 seconds 10 msecOK3Time taken: 26.603 seconds, Fetched: 1 row(s)
复制代码


其次,在 cm3 节点上执行 impala-shell,执行相同的语句查看执行时长:

[root@cm3 init.d]# impala-shell[cm3:21000] > show tables;Query: show tables+---------------+| name |+---------------+| my_hive_table |+---------------+Fetched 1 row(s) in 0.21s[cm3:21000] > select count(*) from my_hive_table;Query: select count(*) from my_hive_table +----------+| count(*) |+----------+| 3 |+----------+Fetched 1 row(s) in 0.85s
复制代码


2.测试 impala 创建表同步元数据  


在 impala 中创建一张表,查看是否元数据会同步到 Hive 的 MetaStore,在 impala-shell 中执行建表语句:

[cm3:21000] > create table impala_table (id int,name string,score int) row format delimited fields terminated by '\t';Query: create table impala_table (id int,name string,score int) row format delimited fields terminated by '\t'Fetched 0 row(s) in 0.22s
复制代码

同时,在 cm2 节点的 Hive 客户端查看是否有表“impala_table”,发现在 impala 中创建的表元数据在 Hive 中立即可以查询到。

hive> show tables; OKimpala_tablemy_hive_tableTime taken: 0.016 seconds, Fetched: 2 row(s)
复制代码


3.测试 Hive 创建表不同步元数据  


在 cm2 节点,Hive 中创建一张表,执行命令如下,在 impala 中看不到对应的表信息,需要手动更新元数据才可以。xainzai

hive> create table my_hive_table1 (id int,name string) row format delimited fields terminated by '\t';OKTime taken: 10.224 seconds
复制代码

在 cm3 节点查询 impala-shell,执行命令如下: 

[cm3:21000] > show tables;Query: show tables+---------------+| name |+---------------+ | impala_table | | my_hive_table | +---------------+Fetched 2 row(s) in 0.11s
复制代码

如果需要 impala 同步元数据信息,可以在 cm3 中 impala-shell 中执行 “invalidate metadata”命令:

[cm3:21000] > invalidate metadata ; Query: invalidate metadataFetched 0 row(s) in 3.48s[cm3:21000] > show tables; Query: show tables+----------------+| name |+----------------+| impala_table || my_hive_table || my_hive_table1 |+----------------+Fetched 3 row(s) in 0.01s
复制代码


4.impala Shell 命令          


一般命令<进入 impala-shell 使用命令>:

-h(--help)帮助 -v(--version)查询版本信息; 

-V(--verbose)启用详细输出显示详细时间,显示执行信息;     

--quiet 关闭详细输出;          

-p 显示执行计划; 

-i hostname(--impalad=hostname) 指定连接主机格式 hostname:port 默认端口 21000;

-r(--refresh_after_connect)刷新所有元数据;        

-q query(--query=query)从命令行执行查询,不进入 impala-shell -d default_db(--database=default_db)指定数据库;

-B(--delimited)去格式化输出;   

-f query_file(--query_file=query_file)执行查询文件,以分号分隔 ;

-o filename(--output_file filename)结果输出到指定文件;

-c 查询执行失败时继续执行;

-k(--kerberos) 使用 kerberos 安全加密方式运行 impala-shell ;

-l 启用 LDAP 认证 ;

-u 启用 LDAP 时,指定用户名;


特殊用法<在 impala-shell 中命令>:          

Ø help :在 impala-shell 中查看帮助;          

Ø connect 连接主机,默认端口 21000;

Ø refresh 增量刷新元数据库;      

Ø invalidate metadata 全量刷新元数据库;          

Ø explain 显示查询执行计划、步骤信息; 

Ø set explain_level 设置显示级别(0,1,2,3);

Ø shell 不退出 impala-shell 执行 Linux 命令;

Ø profile (查询完成后执行) 查询最近一次查询的底层信息;  


5.impala 存储和压缩方式  




以上就是今天的全部内容分享。

想了解更多关于大数据技术的内存扩容、缩容策略,详尽解析了故障诊断与问题排查的方法论的问题,可以找我:15928721005


用户头像

公众号:【TASKCTL】官方免费直接授权使用 2020-12-23 加入

一款国产免费企业级ETL调度批处理工具;支持各类脚本任务程序和扩展;具备可视化图形拖拽设计界面以及可视化任务管理、计划调度、实时监控、消息预警和日志分析;有效弥补了传统ETL工具在调度管理和监控分析方面不足

评论

发布
暂无评论
Cloudera Impala与Hive:架构对比及协同工作机制_hadoop_敏捷调度TASKCTL_InfoQ写作社区