Kylin和Impala区别:
既然在线分析已经使用了kylin,为啥还用impala呢?
因为kylin不够灵活,只能分析简单的星型/雪花模型,impala可以通过窗口函数,进行复杂的行为数据分析;
反之,当数据量大的时候,impala比较慢,所以只用kylin进行预计算。
一、Impala介绍
Impala 是建立在 Hadoop 生态圈的交互式 SQL 解析、执行引擎,Impala 的 SQL 语法与 Hive 高度兼容,并且提供标准的 ODBC 和 JDBC 接口。
Impala 本身不提供数据的存储服务,其底层数据可来自 HDFS、Kudu、Hbase。
impala优势:
和 Hive 高度相似的 SQL 语法,无需太多学习成本
超大数据规模 SQL 解析的能力,高效利用内存与 CPU 利用,快速返回 SQL 查询结果。
集成多个底层数据源,HDFS、Kudu、Hbase 等数据皆可通过 Impala 共享,并且无需进行数据同
步。
与 Hue 深度集成,提供可视化的 SQL 操作以及 work flow。
提供标准 JDBC 和 ODBC 接口,方便下游业务方无缝接入。
提供最多细化到列的权限管理,满足实际生产环境数据安全要求。
impala角色:
impala是一个 MPP引擎,它是基于内存进行大规模数据分析的系统。
impala-server: impalad,它是 impala 系统的计算节点,每个 impalad 角色都是对等的,没有谁是 master;这就涉及到一个问题:分布式计算的任务如何协调,如何分片?——coordinator 角色负责!
那个 impalad 接收这个 sql,谁就承担 coordinator 的角色,它自己负责解析 sql,形成执行计划,进行任务分片,然后通知到其他 impalad 来协作。
impala-state-store: 它是 impala 系统的状态协调节点,主要负责协调集群状态;imapla-server 会跟Impala-state-store 进行周期性的心跳通信,来感知集群中各个节点的状态。
impala-catalog: 元数据管理节点;其实 impala 中,每一个 impalad,都会自己在内存中缓存一份元数据;正因为每个 impalad 都会缓存元数据,就会带来一个问题:当你在 hive 中进行了建表/修改表定义/导入新数据,这些操作后,impalad 中的元数据并不会自动更新;所以,发生这些操作后,需要在 impala 的 shell 中执行一个命令: invalidate metadata 这个命令一执行,接收命令的 impalad 会通知所有其他impalad 清空元数据,并请求 impala-catalog来更新自己的缓存;
如果只是对某个表定义的修改,那么可以只更新这个指定的表元数据:refresh [table].
二、impala安装
impala是使用c语言实现的,所以使用yum进行安装。
1、选择一台电脑安装httpd服务
yum install -y httpd
service httpd start
chkconfig httpd o
将安装包放在 /var/www/html目录下
2、关闭 selinux
# 临时关闭:
[root@localhost ~]# getenforce
Enforcing
[root@localhost ~]# setenforce 0
[root@localhost ~]# getenforce
# 永久关闭:
[root@localhost ~]# vim /etc/sysconfig/selinux
SELINUX=enforcing 改为 SELINUX=disabled 重启服务 reb
3、配置本地yum源
vi /etc/yum.repos.d/cdh-local.repo
[cloudera-repo]
name=cloudera-repo
DOIT 北京多易教育科技有限公司 www.51doit.com
baseurl=http://doitedu01/cloudera-repos/cdh6/6.2.1/redhat7/yum
enabled=1
gpgcheck=0
# 并拷贝至其他 2 个
4、安装impala
#在 doitedu01 上
yum install -y impala impala-server impala-state-store impala-catalog impala-shell
#其他节点
yum install -y
5、复制 hadoop、hive 配置文件
# impala 的配置目录为/etc/impala/conf,这个路径下面需要把 core-site.xml,hdfs-site.xml 以及 hive-site.xml
# 所有节点执行以下命令
cp /opt/apps/hadoop-3.1.1/etc/hadoop/core-site.xml /etc/impala/conf/
cp /opt/apps/hadoop-3.1.1/etc/hadoop/hdfs-site.xml /etc/impala/conf/
cp /opt/apps/hive-3.1.2/conf/hive-site.xml /etc/impala/conf/
6、修改配置文件
# 所有节点
vi /etc/default/impala
# 集群唯一catalog服务器地址
IMPALA_CATALOG_SERVICE_HOST=impala01
# 集群唯一state‐store服务器地址
IMPALA_STATE_STORE_HOST=impala01
# catalog/state‐store 端口号,默认即可
IMPALA_STATE_STORE_PORT=24000
IMPALA_BACKEND_PORT=22000
# 日志存储目录
IMPALA_LOG_DIR=/var/log/impala
IMPALA_CATALOG_ARGS=" ‐log_dir=${IMPALA_LOG_DIR} "
IMPALA_STATE_STORE_ARGS=" ‐log_dir=${IMPALA_LOG_DIR} ‐
state_store_port=${IMPALA_STATE_STORE_PORT}"
# 注意,这里有个大坑,‐use_statestore参数要赋值:=true
# 不然‐state_store_host配置项不生效
IMPALA_SERVER_ARGS=" \
‐log_dir=${IMPALA_LOG_DIR} \
‐catalog_service_host=${IMPALA_CATALOG_SERVICE_HOST} \
‐state_store_port=${IMPALA_STATE_STORE_PORT} \
‐use_statestore=true \
‐state_store_host=${IMPALA_STATE_STORE_HOST} \
‐be_port=${IMPALA_BACKEND_PORT}"
ENABLE_CORE_DUMPS=false
修改bigtop配置
vi /etc/default/bigtop‐utils
export JAVA_HOME=/opt/apps/jdk1.8.0_191/
放置mysql驱动jar
# 拷贝一个mysql驱动到 /usr/share/java/ 下
7、启动、关闭impala服务
# 切记启动HDFS和HIVE元数据服务
‐ 启动 HDFS
start‐dfs.sh
‐ 启动hive metastore
hive ‐‐service metastore
# doitedu01上
service impala‐state‐store start
service impala‐catalog start
service impala‐server start
# 其他节点
service impala‐server start
# 关闭服务
service impala‐state‐store stop
service impala‐catalog stop
service impala‐server stop
启动脚本
vi impall.sh
#!/bin/bash
service impala‐state‐store $1
service impala‐catalog $1
for i in {1..3}
do
ssh doitedu0${i} "service impala‐server $1"
done
service impala‐state‐store status
service impala‐catalog status
service impala‐server status
注意,impala安装后,所有服务都已经被配置为开机自启,所以很少需要手动启动服务集群
8、web ui
访问impalad的管理界面http://node‐3:25000/
访问statestored的管理界面http://node‐3:25010/
9、命令客户端
[root@doitedu01 ~]# impala‐shell
[doitedu01:21000] default> show tables;
Query: show tables
Fetched 0 row(s) in 0.00s
三、复杂类型
hive支持最好的类型是orc, impala支持最好的类型是parquet
1、map类型查询
如果hive表中含有复杂类型,而表文件格式为TEXT,则impala不支持
如果hive表中含有复杂类型,而表文件格式为parquet,则impala支持
id,name,info
1,zs,addr:bj‐age:18‐marry:false
2,ls,addr:sh‐age:28‐marry:true
3,ww,addr:sz‐age:26‐marry:false‐inc:2000
select
id,
name,
info.key,
info.value
from
custom_parquet,
custom_parquet.info as info;
2、数组类型查询
select
id,
name,
actors.*
from
movie_parquet , movie_parquet.actors as actors
3、struct类型查询
select
stu_par.id,
stu_info.name,
stu_info.age,
stu_info.sex
from
stu_par
四、常用函数
1、group_concat(字段, 分隔符): 类似于hive的collect_list()
2、修改备注名称
alter table analytic_layer_zbyy_cwyy_014_cwzbbg.finance_all_targets change diff_met_date_avg diff_met_date_avg double comment "平均时长"
五、自定义函数
1、引入依赖
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive‐exec</artifactId>
<version>1.1.0</version>
</dependency>
2、编写MD5类
import org.apache.hadoop.hive.ql.exec.UDF;
import java.security.MessageDigest;
public class MD5 extends UDF{
public static String evaluate(String value) {
StringBuilder sb = new StringBuilder();
try {
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
byte[] bytes = messageDigest.digest(value.getBytes());
for (int i = 0; i < bytes.length; i++) {
int tempInt = bytes[i] & 0xff;
if (tempInt < 16) {
sb.append(0);
}
sb.append(Integer.toHexString(tempInt));
}
}
catch (Exception e) {
System.out.println(e.getMessage());
}
return sb.toString();
}
}
3、打包,并传入hdfs
hdfs dfs ‐copyFromLocal ./MyHiveUDF.jar /user/impala/user_function/
4、注册函数
create function md5(string) returns string location
'hdfs://nameservice/user/impala/user_function/MyHiveUDF.jar'
symbol='com.business.bi.udf.MD5';