数据分析引擎之Impala-1
1 快速了解Impala
什么是Impala
1 | 咱们在最开始学习大数据的时候学到了MapReduce这个框架,他可以对海量数据进行分布式计算分析,但是由于需要一定学习成本,并且对非开发人员不够友好,所以后来出现了Hive这个数据分析工具。 |
1 | 此时就需要有一个可以支持低延迟,并且计算效率也比较高的数据分析引擎了,所以Impala就出现了。 |
Impala的优点
1 | 1:基于内存运算,中间结果不落盘,节省大量的I/O开销;因为在MapReduce任务中,Map阶段产生的中间结果需要先写磁盘,再通过Shuffle拷贝到Reduce阶段,所以会产生大量的I/O,因此计算效率不如Impala。 |
1 | 这是Impala的一些优点。 |
Impala的缺点
1 | 1:基于内存进行计算,对内存依赖性较大。基于内存计算,既是优点,也是缺点。 |
Impala + Hive
1 | Impala和Hive之间的关系从这个图里面可以比较清晰的进行了解 |

1 | 最底层是HDFS,接着是MapReduce、Hive对MapReduce做了封装,提供了SQL支持。 |
Impala三大核心组件
1 | Impala架构中主要包含三大核心组件: |
Impala的整体运行架构
1 | Impala的整体运行架构是这样的: |

1 | 这个图里面包含了客户端、Hive Metastore、HDFS NameNode、HDFS DataNode、HBase以及Impala中的Statestore、Catalog、Impalad这三个核心组件。 |
1 | 客户端向Impala发送请求时的整个执行流程是这样的: |
2 快速上手使用Impala
Impala的安装部署
1 | 单独安装Impala是不靠谱的想法,尽快忘了它!!!,因为单独安装Impala需要自己编译、编译的时候需要依赖很多外部依赖,以及一些依赖冲突的问题,所以不建议单独安装。 |
1 | 注意了:想要安装CDH,对机器配置有一定的要求,如果本地环境不允许的话,不建议去折腾了,意义不大。 |
1 | Impala集群节点的规划是这样的: |

1 | Impala中的Catalog和Statestore进程所在的节点可以认为是主节点,建议把这两个进程部署在一起,因为他们两个之间需要经常通信。 |
CDH平台中安装Impala
1 | 进入CM首页。 |
1 | 添加服务: |

1 | 选择Impala,然后点击继续按钮: |

1 | 如果cdh01主节点的内存足够使用的话,建议将StateStore和Catalog Server服务放到cdh01主节点中。 |

1 | 什么都不用改,点击继续按钮: |

1 | 等待状态变为 已完成,然后点击继续按钮: |

1 | 点击完成按钮即可: |

1 | 此时Impala服务已经安装成功了,但是还需要重启HDFS服务,点击重启按钮: |

1 | 确认更改信息,直接点击 重启过时服务按钮即可: |

1 | 注意:先选中【重新部署客户端配置】,然后再点击右下角的立即重启按钮: |

1 | 等待服务重启成功,状态变为 已完成,最后点击完成按钮即可。到这位置,Impala就安装好了。 |

处理HDFS的权限问题
1 | 注意:由于我们现在默认使用的Linux中的root用户,所以在操作HDFS的时候会遇到一些权限问题,解决方案有2个: |




1 | 2:先在Linux添加supergroup组,把root用户添加到supergroup里,再同步权限到HDFS。 |
1 | 在测试环境建议使用第一种方式。 |
Impala的常见操作方式
1 | Impala可以支持多种操作方式,在不同的应用场景中,可以选择不同的操作方式。 |
impala-shell客户端命令行
1 | 进入cdh01机器: |
1 | 此时发现里面有报错信息,提示的是无法连接cdh01:21000。 |
1 | 第一种方法: |
1 | 第二种方法: |
1 | 第三种方法: |
1 | 不过在实际工作中我们操作Impala一般都是在客户端节点操作的,所以还是需要通过-i或者connect参数指定impalad节点的。 |
-h / –help
1 | 在impala-shell脚本后面还可以指定一些高级命令,下面我们来看一些比较常见的: |
-v:查询当前Impala的版本。
1 | [root@cdh01 ~]# impala-shell -v |
-B / –delimited:对Impala的查询结果进行格式化。
1 | 默认Impala中返回的结果数据是使用表格的样式格式化的,但是有时候我们想把impala查询的结果输出到文件中,便于后续其他的程序使用,这样就不希望把额外的表格输出到文件中了,只需要核心的数据内容即可。 |
1 | 此时可以发现结果数据会使用表格进行格式化,这样其实看起来是比较清晰的,但是这种数据格式不便于后期使用。 |
1 | 此时可以看到结果数据就比较干净了,只有数据自身的内容,默认情况下字段之间的分隔符是制表符。 |
–output_delimiter:指定字段分隔符,默认\t
1 | 在使用-B对数据结果进行格式化的时候,如果想自定义字段分隔符,还需要使用这个参数。 |
-o / –output_file:将查询结果输出到指定的文件中
1 | 现在查询的结果还是输出在控制台中,想要将结果输出到文件中的话需要使用这个参数指定目标文件名。 |
1 | 此时发现在命令行中执行select语句是看不到返回结果的,因为这些结果数据会输出到im_t1.dat文件中。 |
1 | 但是这种方式用起来还是不方便,我们还需要先进入到impala-shell客户端里面之后才能执行查询命名,能不能在不进入impala-shell客户端的情况下实现这种需求呢?其实就是实现类似于hive -e这种效果。 |
-q / –query:指定查询语句
1 | 通过-q参数可以在命令行中指定sql语句,不需要进入impala-shell客户端里面,适合在脚本中封装impala sql语句。 |
1 | [root@cdh01 ~]# rm -rf im_t1.dat |
1 | 然后使用-q指定select查询语句。 |
1 | 查看im_t1.dat文件中的内容: |
JDBC访问
1 | 下面看一下如何使用JDBC代码操作Impala。 |
1 | 创建类:ImpalaJdbcDemo |
Hue访问


1 | 注意:第一次使用hue时,需要创建hue的账号,输入用户名和密码则会自动创建,这个账户将会是超级管理员账户。 |

1 | 在查询按钮中可以选择Hue支持查询的组件,里面默认是没有Impala的。 |

1 | 注意:默认CDH中提供的Hue里面是不支持访问Impala,需要在Hue配置中开启才可以。 |

1 | 保存更改后,需要重启Hue,因为配置发生了变化。 |


1 | 选中重新部署客户端配置,然后点击立即重启按钮即可。 |

1 | 等待状态变为已完成,点击完成按钮即可。 |

1 | 最终的效果是这样的: |

1 | 此时就可以选择Impala编辑器来操作Impala了。 |


Impala的常见使用
1 | Impala中的DDL和DML语句和Hive中的用法基本上是一样的,并且Impala中也支持内部表、外部表和分区表,下面我们来实际体验一下: |
内部表的使用
1 | 创建内部表:im_inner_table |
desc
1 | 查看表中的字段信息,以及详细建表语句。 |
load加载数据
1 | 表需要加载的数据文件为im_inner_table.dat,字段分隔符使用制表符,文件内容如下: |
1 | 使用load data命令加载数据: |
1 | 再尝试加载数据: |
1 | 注意:impala中第一次查询一个表的时候会有点慢,后续查询就快了。 |


1 | Impala中的元数据会存储在Hive的Metastore中,所以我们到Hive对应的MySQL中查看一下表信息: |

1 | 查看表tbls中的数据: |

1 | 我们在impala中基于这个表执行一个group by功能,大家可以对比一下和Hive中执行的效率: |
1 | 此时发现在impala中执行是很快的,只需要0.4秒左右。 |
1 | 下面在hive中执行,因为他们使用的是同一个元数据库,所以在hive中也可以看到这个表,并且也可以正常使用: |
1 | [root@cdh01 ~]# hive |
1 | 在hive中执行就比较慢了,大致需要75秒,而Impala执行只需要0.4秒(第一次大致需要0.57秒),所以他们之间的对比就非常明显了。 |
外部表的使用
1 | 创建外部表:im_external_table |
1 | 查询外部表中的数据: |
分区表的使用
1 | 分区表也可以分为外部分区表和内部分区表,在这里我们以外部分区表为例演示一下: |
1 | 此时需要先到HDFS里面创建分区目录,再使用alter的方式添加分区,这种思路也是正常的操作流程,因为在实际工作中,外部分区表的数据是由专门的程序负责写入的。 |
1 | 在impala中添加分区。 |
1 | 查询表中的分区信息: |
1 | 查询表中的数据: |