0%

Impala快速上手

Impala头图

Impala 是 Cloudera 公司主导开发的新型查询系统,它提供SQL语义,能查询存储在Hadoop的HDFS和HBase中的PB级大数据。已有的Hive系统虽然也提供了SQL语义,但由于Hive底层执行使用的是MapReduce引擎,仍然是一个批处理过程,难以满足查询的交互性。相比之下,Impala的最大特点也是最大卖点就是它的快速。


概述

Impala 是基于 Hive 并使用内存进行计算,兼顾数据仓库,具有实时、批处理、多并发等优点。

Impala 的架构

Impala架构

Impala架构

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

  • Impalad: 官方建议与 DataNode 运行在同一节点上,由 impalad 进程表示。它接收客户端的查询请求、读写数据、并行执行查询,并把结果通过网络流式的传送回给 Coordinator,由 Coordinator 返回给客户端。同时 Impalad 也与 State Store 保持连接,用于确定哪个 Impalad 可以接受新的工作
  • Impala State Store: 跟踪集群中的 Impalad 的健康状态及位置信息,由 statestored 进程表示。它通过创建多个线程来处理 Impalad 的注册订阅和与各 Impalad 保持心跳连接,各 Impalad 都会缓存一份 State Store 中的信息
  • CLI: 提供给用户查询使用的命令行工具。Impala 还提供了 Hue,JDBC,ODBC 接口

查询流程

Impalad 分为 frontend 和 backend 两个层次:

  • frondend:用 java 实现(通过JNI调用java解释SQL查询语句),负责生成查询计划,再通过调度器把执行计划分发给具有相应数据的其它 Impalad
  • backend:用 C++ 实现, 负责执行查询

Impala查询流程

Impala查询流程
  1. 客户端提交查询任务,impala 某个从节点接收这个请求
  2. 查询对应的表的元数据信息,找到 HDFS 对应的文件路径
  3. 生成单机版的查询计划,决定如何查询数据
  4. 分发单机版的查询计划给其他所有 impala 的节点,一起执行查询
  5. 汇总查询结果

Impala 与 Hive 的关系

Impala 是基于 Hive 的大数据分析查询引擎,直接使用 Hive 的元数据库 metadata,这意味着 Impala 元数据都存储在 Hive 的 metastore 当中。要使用 Impala 必须先启动 Hive,并且还需要启动 Hive 的 metastore 服务

Hive
在 Hive 中建表,会建立与存在HDFS当中的文件的映射关系,这些映射关系和 Hive 的元数据信息存储在 MySQL 中
Hive 的元数据信息有 Hive 的建表信息、Hive 的字段分隔符信息、Hive 加载的数据存储在 HDFS 上的路径等。通过这些信息 Hive 就可以操作 HDFS 上的数据了。

Impala
Impala 可以获取 Hive 的元数据信息,也就知道了数据存储在哪里,从而可以进行查询等操作了。
但是 Impala 不会直接读取 Hive 存在 MySQL 中的元数据信息,而是通过 Hive 去读取 Hive 自己存在 MySQL 当中的元数据信息

Impala 的优点

  • Impala 比较快,非常快,特别快,因为所有的计算都可以放入内存当中进行完成,只要内存足够大
  • 摒弃了MR的计算,改用 C++ 来实现,有针对性的硬件优化
  • 具有数据仓库的特性,对 Hive 的原有数据做数据分析
  • 支持 ODBC,JDBC 远程访问

Impala 的缺点

  • 基于内存计算,对内存依赖性较大,官方建议每个节点128G以上的内存
  • 底层的实现基于 C++,维护难度增大
  • 基于 Hive,与 Hive 共存亡,紧耦合
  • 稳定性不如 Hive

安装

开发环境

  1. 三台虚拟机
1
2
3
192.168.153.100 node01
192.168.153.101 node02
192.168.153.102 node03
  1. 目录结构
1
2
/export/softwares:存放安装包
/export/servers:存放安装程序
  1. 软件环境
1
2
hadoop:hadoop-2.6.0-cdh5.14.0
hive:hive-1.1.0-cdh5.14.0
  1. Hadoop 的框架需要支持 C 程序访问接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 验证方式一
# cd /export/servers/hadoop-2.6.0-cdh5.14.0/lib/native
# ll
总用量 15224
-rw-r--r-- 1 root root 1313978 2月 9 13:53 libhadoop.a
-rw-r--r-- 1 root root 1487316 2月 9 13:53 libhadooppipes.a
lrwxrwxrwx 1 root root 18 6月 3 20:51 libhadoop.so -> libhadoop.so.1.0.0
-rwxr-xr-x 1 root root 771647 2月 9 13:53 libhadoop.so.1.0.0
-rw-r--r-- 1 root root 582128 2月 9 13:53 libhadooputils.a
-rw-r--r-- 1 root root 382908 2月 9 13:53 libhdfs.a
lrwxrwxrwx 1 root root 16 6月 3 20:51 libhdfs.so -> libhdfs.so.0.0.0
-rwxr-xr-x 1 root root 244995 2月 9 13:53 libhdfs.so.0.0.0
-rw-r--r-- 1 root root 7707692 2月 9 13:53 libnativetask.a
lrwxrwxrwx 1 root root 22 6月 3 20:51 libnativetask.so -> libnativetask.so.1.0.0
-rwxr-xr-x 1 root root 3083213 2月 9 13:53 libnativetask.so.1.0.0

# 验证方式二
# /export/servers/hadoop-2.6.0-cdh5.14.0/bin/hadoop checknative
19/06/17 17:51:17 INFO bzip2.Bzip2Factory: Successfully loaded & initialized native-bzip2 library system-native
19/06/17 17:51:17 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
Native library checking:
hadoop: true /export/servers/hadoop-2.6.0-cdh5.14.0/lib/native/libhadoop.so.1.0.0
zlib: true /lib64/libz.so.1
snappy: true /usr/lib64/libsnappy.so.1
lz4: true revision:10301
bzip2: true /lib64/libbz2.so.1
openssl: true /usr/lib64/libcrypto.so

准备工作

下载 Impala 依赖包
源码包:需编译,不采用
rpm包:有多个rpm包,而且需安装依赖,不采用
完整包:解决依赖问题并打好了包(5.0 GB),采用

挂载磁盘
Impala 依赖包非常大,如果虚拟机磁盘不足,需要在关机状态下挂载磁盘。在 node03 的 VMware 虚拟机上执行:

  1. 虚拟机设置 -> 硬盘(SCSI) -> 添加 -> SCSI(推荐) -> 创建新虚拟磁盘 -> 将虚拟磁盘拆分成多个文件
  2. 分区、格式化,挂载新磁盘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 显示本机的文件系统
df -lh

# 查看分区列表
fdisk -l

# 开始对sdb进行分区
fdisk /dev/sdb
# 命令执行后依次输入
# n:创建新分区
# p:主分区
# 1:分区标识
# 回车:第一个卷的起始位置,使用默认值
# 回车:最后一个卷的起始位置,使用默认值
# w:写入磁盘分区表并退出

# 再次查看分区列表
fdisk -l

# 格式化分区
mkfs -t ext4 -c /dev/sdb1

# 将分区挂载到/data02目录下
mount -t ext4 /dev/sdb1 /data02

# 将挂载磁盘设置为开机启动
echo "/dev/sdb1 /data02 ext4 defaults 0 0" >> /etc/fstab

制作镜像源
将 5.0GB 的压缩包 cdh5.14.0-centos6.tar.gz 上传到 node03 的 /data02 目录下,解压

/data02/
1
tar -zxvf cdh5.14.0-centos6.tar.gz

镜像源是 CentOS 中下载软件的地址,可以制作自己的镜像源用于下载 Impala 的 rpm 包,这里使用httpd来作为服务端。

node03 上安装并启动 httpd 服务,作为 Impala 的镜像源:

1
2
3
4
5
6
7
8
9
10
11
12
13
# yum install -y httpd
# service httpd start
# chkconfig httpd on
# cd /etc/yum.repos.d
# vim /etc/yum.repos.d/localimp.repo
[localimp]
name=localimp
baseurl=http://node03/cdh5.14.0/
gpgcheck=0
enabled=1

# 创建读取链接
ln -s /data02/cdh/5.14.0 /var/www/html/cdh5.14.0

浏览器访问: http://node03/cdh5.14.0/ ,出现以下页面就说明本地镜像源制作成功。

Impala本地镜像源

将修改好的配置文件 localimp.repo 分发到所有需要安装 Impala 的节点上:

1
2
3
cd /etc/yum.repos.d/
scp localimp.repo node01:$PWD
scp localimp.repo node02:$PWD

安装 Impala

**安装规划**
服务名称 node01 node02 node03
impala-catalog
impala-state-store
impala-server

主节点 node03 安装以下服务:

1
yum install -y impala impala-server impala-state-store impala-catalog impala-shell

从节点 node01 与 node02 安装以下服务:

1
yum install impala-server -y

配置

  1. 在 node03 上修改hive-site.xml,新增内容如下:
/export/servers/hive-1.1.0-cdh5.14.0/conf/hive-site.xml
1
2
3
4
5
6
7
8
<property>
<name>hive.metastore.uris</name>
<value>thrift://node03:9083</value>
</property>
<property>
<name>hive.metastore.client.socket.timeout</name>
<value>3600</value>
</property>
  1. 将 node03 的 Hive 发送到 node01 与 node02 上
1
2
3
cd /export/servers/
scp -r hive-1.1.0-cdh5.14.0/ node01:$PWD
scp -r hive-1.1.0-cdh5.14.0/ node02:$PWD
  1. node03 启动 Hive 的 metastore 服务(mysql 和 hadoop 的服务正常启动后执行)
1
2
3
cd /export/servers/hive-1.1.0-cdh5.14.0
nohup bin/hive --service metastore 2>&1 &
nohup bin/hive --service hiveserver2 2>&1 &

如果能够看到两个 RunJar 进程则代表启动成功:

1
2
3
4
5
6
# jps
3173 Jps
2695 NodeManager
3018 RunJar
2588 DataNode
2845 RunJar
  1. 所有节点上修改hdfs-site.xml,新增内容如下:
/export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/hdfs-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<property>
<!-- 打开短路读取的开关 -->
<name>dfs.client.read.shortcircuit</name>
<value>true</value>
</property>
<property>
<!-- 短路读取的存放临时文件的路径,dn是一个文件 -->
<name>dfs.domain.socket.path</name>
<value>/var/run/hdfs-sockets/dn</value>
</property>
<property>
<!-- 存在本地的文件的超时时间 -->
<name>dfs.client.file-block-storage-locations.timeout.millis</name>
<value>10000</value>
</property>
<property>
<!-- 是否允许读取HDFS的block的元数据信息 -->
<name>dfs.datanode.hdfs-blocks-metadata.enabled</name>
<value>true</value>
</property>

所有节点上执行以下命令,创建文件夹:

1
mkdir -p /var/run/hdfs-sockets
  1. 在 node01 上执行以下命令,重启 HDFS,载入修改后的配置文件:
1
2
3
cd /export/servers/hadoop-2.6.0-cdh5.14.0/
sbin/stop-dfs.sh
sbin/start-dfs.sh
  1. 所有节点上执行以下命令,创建 Hadoop 与 Hive 配置文件的链接
1
2
3
ln -s /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/core-site.xml /etc/impala/conf/core-site.xml
ln -s /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/hdfs-site.xml /etc/impala/conf/hdfs-site.xml
ln -s /export/servers/hive-1.1.0-cdh5.14.0/conf/hive-site.xml /etc/impala/conf/hive-site.xml
  1. 所有节点上修改 impala
/etc/default/impala
1
2
IMPALA_CATALOG_SERVICE_HOST=node03
IMPALA_STATE_STORE_HOST=node03
  1. 所有节点上执行以下命令,创建 mysql 驱动包的软连接

    1
    ln -s /export/servers/hive-1.1.0-cdh5.14.0/lib/mysql-connector-java-5.1.38.jar /usr/share/java/mysql-connector-java.jar
  2. 所有节点上修改bigtop-utils,配置 JAVA_HOME

    /etc/default/bigtop-utils
    1
    2
    3
    # Override JAVA_HOME detection for all bigtop packages
    # export JAVA_HOME
    export JAVA_HOME=/usr/java/jdk1.8.0_141

启动

Impala 有三种服务:

  • impala-statestore:主节点。状态存储区,主要存储 SQL 语句的执行情况
  • impalas-catalog:主节点。元数据管理区,存储建表信息、建库信息、表字段之间的分隔符信息,HDFS 数据的路径信息
  • impala-server:从节点。启动守护进程 impalad,执行查询计划。官方建议与所有的 DataNode 装在一起

守护进程:在一个多任务的计算机操作系统中,守护进程(daemon)是一种在后台执行的计算机程序,程序的名称通常以字母d结尾,此类程序会被以进程的形式初始化。通常,守护进程没有任何存在的父进程(即PPID=1),且在UNIX系统进程层级中直接位于init之下。

启动 Impala 前需要确保启动了 Hadoop 和 Hive

1
2
3
4
5
6
7
8
# node01启动Hadoop
start-dfs.sh && start-yarn.sh && mr-jobhistory-daemon.sh start historyserver
stop-dfs.sh && stop-yarn.sh && mr-jobhistory-daemon.sh stop historyserver

# node03启动Hive
cd /export/servers/hive-1.1.0-cdh5.14.0
nohup bin/hive --service metastore 2>&1 &
nohup bin/hive --service hiveserver2 2>&1 &

启动 Impala

主节点 node03 启动三个服务进程:

1
2
3
service impala-state-store start
service impala-catalog start
service impala-server start

从节点 node01 与 node02 启动 impala-server:

1
service impala-server start

查看是否启动成功:

1
ps -ef | grep impala

注意:启动之后 node03 上应该有statestoredcatalogdimpalad三个 Impala 进程,node01 与 node02 上应该有一个impalad进程,如果进程个数不对,去/var/log/impala查看报错日志,对应的日志文件为statestored.ERRORcatalogd.ERRORimpalad.ERROR

停止 Impala

关机时候一定要手动停止 Impala 的各个进程,防止僵尸进程的出现(僵尸进程可能会占用端口)

1
2
3
service impala-state-store stop
service impala-catalog stop
service impala-server stop

识别僵尸进程:

1
2
3
4
5
6
# jps
2146 -- process information unavailable
2723 DataNode
9764 Jps
3046 NodeManager
2170 -- process information unavailable

解决僵尸进程:删除/tmp目录下名称为hsperfdata_{ username}的文件夹

1
rm -rf /tmp/hsperfdata_*

访问页面

impalad 的管理界面: http://node03:25000/
statestored 的管理界面: http://node03:25010/

impala前端页面

使用

impala-shell

impala-shell的外部命令参数语法

不需要进入到 impala-shell 命令行当中即可执行,impala-shell 后面可以跟很多参数。

  • impala-shell -h
  • impala-shell -i node03:21000
  • impala-shell -r:刷新整个元数据,数据量大的时候,比较消耗服务器性能
  • impala-shell -v:查看对应版本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 查看帮助文档
impala-shell -h

# 连接到指定服务器的 impalad 服务
-i <host:port>
impala-shell -i node03:21000

# 不进入shell窗口执行查询,类似于hive -e
-q QUERY
impala-shell -q "select * from myhive_db.student_tb limit 10;"
impala-shell -q "select * from myhive.student limit 10;"
# 不进入shell窗口执行sql脚本进行查询,类似于hive -f
-f QUERY_FILE
impala-shell -f impala.sql


# 进入impala-shell并且刷新Hive整个元数据,数据量大的时候,比较消耗服务器性能
impala-shell -r

# 将执行的结果保存到指定文件里
-o OUTPUT_FILE
impala-shell -f impala.sql -o impala_result.txt

# 显示查询计划(执行后始终显示查询配置文件)
-p
impala-shell -f impala.sql -p


# 查看对应版本
impala-shell -v

-f 执行查询文件



java开发

//TODO

  • 本文作者: SANNAHA
  • 本文链接: https://sannaha.moe/Impala/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!