java大数据开发训练营--Impala

1 部分 Impala概述

1.1 Impala是什么

ImpalaCloudera提供的⼀款开源的针对HDFSHBASE中的PB级别数据进⾏交互式实时查询(Impala 速度快)Impala是参照⾕歌的新三篇论⽂当中的Dremel实现⽽来,其中旧三篇论⽂分别是 (BigTableGFSMapReduce)分别对应我们即将学的HBase和已经学过的HDFS以及MapReduce

Impala最⼤卖点和最⼤特点就是快速Impala中⽂翻译是⾼⻆羚⽺。

1.2 Impala优势

回顾前⾯⼤数据课程路线其实就是⼀个⼤数据从业者⾯对的⼤数据相关技术发展的过程,

  • 技术发展以及更新换代的原因就是⽼的技术架构遇到新的问题,有些问题可以通过不断优化代码优化设计得以解决,有⼀些问题就不再是简简单单修改代码就能解决,需要从框架本身架构设计上改 变,以⾄于需要推到重建。
  • 在⼤数据领域主要解决的问题是数据的存储和分析,但是其实⼀个完整的⼤数据分析任务如果细分 会有⾮常多具体的场景,⾮常多的环节;并没有⼀个类似Java WebSpring框架实现⼤⼀统的局⾯。

⽐如我们按照阶段划分⼀个⼤数据开发任务,会有:数据采集(⽇志⽂件,关系型数据库中),数据清洗 (数据格式整理,脏数据过滤等),数据预处理(为了后续分析所做的⼯作),数据分析:离线处理(T+1分析),实时处理(数据到来即分析),数据可视化,机器学习,深度学习等

⾯对如此众多的阶段再加上⼤数据天⽣的⼤数据量问题没有任何⼀个框架可以完美cover以上每个阶 段。所以⼤数据领域有⾮常多框架,每个框架都有最适合⾃⼰的具体场景。⽐如:HDFS负责⼤数据量存储,MapReduceHive)负责⼤数据量的分析计算,

Impala 抛弃了 MapReduce 使⽤了类似于传统的 MPP 数据库技术 ,⼤⼤提⾼了查询的速度。
 
MPP 是什么?

MPP (Massively Parallel Processing),就是⼤规模并⾏处理,在MPP集群中,每个节点资源都是独⽴享有也就是有独⽴的磁盘和内存,每个节点通过⽹络互相连接,彼此协同计算,作为整体提供数据服务。

简单来说,MPP是将任务并⾏的分散到多个服务器和节点上,在每个节点上计算完成后,将各⾃部分的结果汇总在⼀起得到最终的结果

对于MPP架构的软件来说聚合操作⽐如计算某张表的总条数,则先进⾏局部聚合(每个节点并⾏计算),然后把局部汇总结果进⾏全局聚合(Hadoop相似)。 

 1.2.1ImpalaHive对⽐

Impala的技术优势
  • Impala没有采取MapReduce作为计算引擎,MR是⾮常好的分布式并⾏计算框架,但MR引擎更多 的是⾯向批处理模式,⽽不是⾯向交互式的SQL执⾏。与 Hive相⽐:Impala把整个查询任务转为 ⼀棵执⾏计划树,⽽不是⼀连串的MR任务,在分发执⾏计划后,Impala使⽤拉取的⽅式获取上个 阶段的执⾏结果,把结果数据、按执⾏树流式传递汇集,减少的了把中间结果写⼊磁盘的步骤,再从磁盘读取数据的开销。Impala使⽤服务的⽅式避免 每次执⾏查询都需要启动的开销,即相⽐Hive没了MR启动时间。
  • 使⽤LLVM(C++编写的编译器)产⽣运⾏代码,针对特定查询⽣成特定代码。
  • 优秀的IO调度,Impala⽀持直接数据块读取和本地代码计算。
  • 选择适合的数据存储格式可以得到最好的性能(Impala⽀持多种存储格式)。
  • 尽可能使⽤内存,中间结果不写磁盘,及时通过⽹络以stream的⽅式传递。

ImpalaHive对⽐分析

查询过程

Hive:在Hive中,每个查询都有⼀个冷启动的常⻅问题。(map,reduce每次都要启动关闭,申请资源,释放资源。。。)

ImpalaImpala避免了任何可能的启动开销,这是⼀种本地查询语⾔。 因为要始终处理查询,则 Impala守护程序进程总是在集群启动之后就准备就绪。守护进程在集群启动之后可以接收查询任务并执⾏查询任务。

中间结果

HiveHive通过MR引擎实现所有中间结果,中间结果需要落盘,这对降低数据处理速度有不利影响。

Impala:在执⾏程序之间使⽤流的⽅式传输中间结果,避免数据落盘。尽可能使⽤内存避免磁盘开销

交互查询

Hive:对于交互式计算,Hive不是理想的选择。

Impala:对于交互式计算,Impala⾮常适合。(数据量级PB)

计算引擎

Hive:是基于批处理的Hadoop MapReduce

Impala:更像是MPP数据库

容错

HiveHive是容错的(通过MR&Yarn实现)

ImpalaImpala没有容错,由于良好的查询性能,Impala遇到错误会重新执⾏⼀次查询

查询速度

ImpalaImpalaHive3-90倍。

Impala优势总结

1. Impala最⼤优点就是查询速度快,在⼀定数据量下;

2. 速度快的原因:避免了MR引擎的弊端,采⽤了MPP数据库技术,

1.3 Impala的缺点

1. Impala属于MPP架构,只能做到百节点级,⼀般并发查询个数达到20左右时,整个系统的吞吐已经达到满负荷状态,在扩容节点也提升不了吞吐量,处理数据量在PB级别最佳。

2. 资源不能通过YARN统⼀资源管理调度,所以Hadoop集群⽆法实现ImpalaSparkHive等组件的动态资源共享。

1.4 适⽤场景

Hive: 复杂的批处理查询任务,数据转换任务,对实时性要求不⾼同时数据量⼜很⼤的场景。

Impala:实时数据分析,与Hive配合使⽤,Hive的结果数据集进⾏实时分析。impala不能完全取代hiveimpala可以直接处理hive表中的数据。

2 部分 Impala 安装与⼊⻔案例

2.1 集群准备

2.1.1 安装Hadoop,Hive

  • Impala的安装需要提前装好HadoopHive这两个框架(Impala数据存储在hdfs,Impala直接使用hive元数据管理数据
  • hive需要在所有的Impala安装的节点上⾯都要有,因为Impala需要引⽤Hive的依赖包,
  • hadoop的框架需要⽀持C程序访问接⼝,查看下图,ll $HADOOP_HOME/lib/native 如果有.so结尾⽂件,就证明⽀持C 接⼝。

2.1.2 准备Impala的所有依赖包,制作yum本地源

Cloudera公司对于Impala的安装只提供了rpm包没有提供tar包;所以我们选择使⽤Clouderarpm包 进⾏Impala的安装,但是另外⼀个问题,Impalarpm包依赖⾮常多的其他的rpm包,我们可以⼀个个 的将依赖找出来,但是这种⽅式实在是浪费时间。

 

rpm⽅式安装:需要⾃⼰管理rpm包的依赖关系;⾮常麻烦;解决依赖关系使⽤yum;默认Yum源是没有 Impalarpm安装包,所以我们⾃⼰准备好所有的Impala安装所需的rpm包,制作Yum本地源,配置 Yum命令去到我们准备的Yun源中下载Impalarpm包进⾏安装

本地Yum源⽅式

具体制作步骤

1. Linux121安装Httpd服务器

#yum ⽅式安装 httpd 服务器

yum install httpd -y

# 启动 httpd 服务器

systemctl start httpd

# 验证 httpd ⼯作是否正常 , 默认端⼝是 80 ,可以省略

http://linux121

2.httpd默认存放⻚⾯路径

/var/www/html/

注:后续可以把下载的rpm包解压放置到此处便可以供⼤家访问。

3. 下载Impala安装所需rpm

Impala所需安装包需要到Cloudera提供地址下载

http://archive.cloudera.com/cdh5/repo-as-tarball/5.7.6/cdh5.7.6- centos7.tar.gz

移动该安装包到/opt/lagou/software

解压缩
tar -zxvf cdh5.7.6-centos7.tar.gz
 

4. 使⽤Httpd盛放依赖包

创建软链接到 /var/www/html
 

ln -s /opt/lagou/software/cdh/5.7.6 /var/www/html/cdh57

验证

http://linux121/cdh57/

如果提示403 forbidden
vim /etc/selinux/config

5. 修改Yum源配置⽂件

cd /etc/yum.repos.d
# 创建⼀个新的配置⽂件
vim local.repo

 

# 添加如下内容
[local]
name = local
baseurl = http://linux121/cdh57/
gpgcheck = 0
enabled = 1
  • name:对于当前源的描述

  • baseurl:访问当前源的地址信息

  • gpgcheck: 1 0,gpg校验

  • enabled:1/0,是否使⽤当前源

6. 分发local.repo⽂件到其它节点

rsync-script local.repo

rsync-script是自定义的分发函数

1.yum install -y rsync

2.cd /usr/local/bin

3.vi rsync-script

写入,注意循环使用自己的hostname

#!/bin/bash

paramnum=$#
if((paramnum==0)); then
echo no params;
exit;
fi

p1=$1
file_name=`basename $p1`
echo fname=$file_name

pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir

user=`whoami`
for((host=1; host<4; host++)); do
echo ------------------- linux12$host--------------
 rsync -rvl $pdir/$file_name $user@linux12$host:$pdir
done

4.chmod 777 rsync-script

2.2 安装Impala

2.2.1 集群规划

服务名称
linux121linux122linux123
impala-catalogd
不安装
不安装
安装
impala-statestored
不安装
不安装
安装
impala-server
安装
安装安装
Impala⻆⾊

impala-server:这个进程是Impala真正⼯作的进程,官⽅建议把impala-server安装在datanode节点, 更靠近数据(短路读取),进程名impalad

impala-statestored:健康监控⻆⾊,主要监控impala-server,impala-server出现异常时告知给其它 impala-server;进程名叫做statestored

impala-catalogd :管理和维护元数据(Hive),impala更新操作;把impala-server更新的元数据通知给其 它impala-server,进程名catalogd

官⽅建议statestorecatalog安装在同⼀节点上!!

2.2.2 具体安装步骤

Linux123

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

Linux121Linux122

yum install impala-server -y
yum install impala-shell -y

配置Impala

1. 修改hive-site.xml

vim hive-site.xml
<!-- 指定 metastore 地址,之前添加过可以不⽤添加 -- >
<property>
<name>hive.metastore.uris</name>
<value>thrift://linux121:9083,thrift://linux123:9083</value>
</property>
<property>
<name>hive.metastore.client.socket.timeout</name>
<value>3600</value>  
</property>

2. 分发Hive安装包到集群节点

rsync-script hive-site.xml

3. Linux123启动metastore服务

nohup hive --service metastore &

启动hiveserver2服务 

nohup hive --service hiveserver2 &

4. 修改HDFS集群hdfs-site.xml

配置 HDFS 集群的短路读取
 
什么是短路读取?

HDFS中通过DataNode来读取数据。但是,当客户端向DataNode请求读取⽂件时,DataNode 就会从磁盘读取该⽂件并通过TCP socket将数据发送到客户端。所谓短路是指Client客户端直接读取⽂件。很明显,这种情况只在客户端与数据放在同⼀地点(译者注:同⼀主机)时才有可能发 ⽣。短路读对于许多应⽤程序会带来重⼤的性能提升。

短路读取:就是ClientDataNode属于同⼀节点,⽆需再经过⽹络传输数据,直接本地读取。

要配置短路本地读,需要验证本机Hadoop是否有libhadoop.so;

进⼊⼀下⽬录:
  • cd $HADOOP_HOME/lib/native 

短路读取配置步骤

1. 创建短路读取本地中转站

# 所有节点创建⼀下⽬录
mkdir -p /var/lib/hadoop-hdfs
#如果已经存在,更换用户权限,不然datanode可能不能正常启动
chown -R root:root /var/lib/hadoop-hdfs/
 

 2. 修改hdfs-site.xml

<!-- 添加如下内容 -->
<!-- 打开短路读取开关 -->
<!-- 打开短路读取配置 -->
<property>
<name> dfs.client.read.shortcircuit </name>
<value> true </value>
</property>
<!-- 这是⼀个 UNIX 域套接字的路径,将⽤于 DataNode 和本地 HDFS 客户机之间的通信 -->
<property>
<name> dfs.domain.socket.path </name>
<value> /var/lib/hadoop-hdfs/dn_socket </value>
</property>
<!--block 存储元数据信息开发开关 -->
<property>
<name> dfs.datanode.hdfs-blocks-metadata.enabled </name>
<value> true </value>
</property>
<property>
<name> dfs.client.file-block-storage-locations.timeout </name>
<value> 30000 </value>
</property>

注:分发到集群其它节点。重启Hadoop集群。

# 停⽌集群
stop-dfs.sh
start-dfs.sh
# 启动集群
start-dfs.sh
start-yarn.sh

3. Impala具体配置

引⽤HDFSHive配置,使⽤Yum⽅式安装impala默认的Impala配置⽂件⽬录为 /etc/impala/confImpala的使⽤要依赖 HadoopHive框架,所以需要把Hdfs,Hive的配置⽂件告知Impala

执⾏以下命令把HdfsHive的配置⽂件软链接到/etc/impala/conf

ln -s /opt/lagou/servers/hadoop-2.9.2/etc/hadoop/core-site.xml /etc/impala/conf/core-site.xml
ln -s /opt/lagou/servers/hadoop-2.9.2/etc/hadoop/hdfs-site.xml /etc/impala/conf/hdfs-site.xml
ln -s /opt/lagou/servers/hive-2.3.7/conf/hive-site.xml /etc/impala/conf/hive-site.xml
注:所有节点都要执⾏此命令!
4.Impala ⾃身配置

所有节点更改Impala默认配置⽂件以及添加mysql的驱动包

vim /etc/default/impala

<!-- 更新如下内容 -->
IMPALA_CATALOG_SERVICE_HOST=linux123
IMPALA_STATE_STORE_HOST=linux123

所有节点创建mysql的驱动包的软链接

# 创建节点
mkdir -p /usr/share/java
ln -s /opt/lagou/servers/hive-2.3.7/lib/mysql-connector-java-5.1.49.jar   /usr/share/java/mysql-connector-java.jar

所有节点修改bigtopjava_home路径

vim /etc/default/bigtop-utils
export JAVA_HOME = /opt/lagou/servers/jdk1.8.0_231

启动Impala

#linux123 启动如下⻆⾊
service impala-state-store start
service impala-catalog start
service impala-server start
# 其余节点启动如下⻆⾊
service impala-server start

验证Impala启动结果

ps -ef | grep impala

注意:启动之后所有关于 Impala 的⽇志默认都在 /var/log/impala 这个路径下, Linux123机器上⾯应该有三个进程, Linux121 Linux122机器上⾯只有⼀个进程,如果进程个数不对,去对应⽬录 下查看报错⽇志 .

浏览器Web界⾯验证

访问 impalad 的管理界⾯
http://linux123:25000/
访问 statestored 的管理界⾯
http://linux123:25010/

消除Impala影响

由于使⽤Yum命令安装Impala,我们选择使⽤yum⾃动进⾏Impala依赖的安装和处理,所以本次安装 默认会把Impala依赖的所有框架都会安装,⽐如Hadoop,Hive,Mysql等,为了保证我们⾃⼰安装的 Hadoop等使⽤正常我们需要删除掉Impala默认安装的其它框架

[root@linux122 conf] # which hadoop
/usr/bin/hadoop
[root@linux122 conf] # which hive
/usr/bin/hive
# 使⽤ which 命令 查找 hadoop,hive 等会发现,命令⽂件是 /usr/bin/hadoop ⽽⾮我们⾃⼰安装的路
径,需要把这些删除掉 , 所有节点都要执⾏
rm -rf /usr/bin/hadoop
rm -rf /usr/bin/hdfs
rm -rf /usr/bin/hive
rm -rf /usr/bin/beeline
rm -rf /usr/bin/hiveserver2
# 重新⽣效环境变量
source /etc/profile

jps 时出现没有名字的进程 或者process information unavailable

rm -rf /tmp/hsperfdata_impala/ 

2.3 Impala⼊⻔案例

使⽤Yum⽅式安装Impala后,impala-shell可以全局使⽤;进⼊impala-shell命令⾏

impala-shell进⼊到impala的交互窗⼝

 

如果想要使⽤Impala ,需要将数据加载到Impala中,如何加载数据到Impala中呢?
  • 使⽤Impala的外部表,这种适⽤于已经有数据⽂件,只需将数据⽂件拷⻉到HDFS上,创建⼀张Impala外部表,将外部表的存储位置指向数据⽂件的位置即可。(类似Hive
  • 通过Insert⽅式插⼊数据,适⽤于我们没有数据⽂件的场景。

1. 准备数据⽂件 user.csv

392456197008193000, 张三 ,20,0
267456198006210000, 李四 ,25,1
892456199007203000, 王五 ,24,1
492456198712198000, 赵六 ,26,2
392456197008193000, 张三 ,20,0
392456197008193000, 张三 ,20,0
2. 创建 HDFS 存放数据的路径
hadoop fs -mkdir -p /user/impala/t1
# 上传本地 user.csv hdfs /user/impala/table1
hadoop fs -put user.csv /user/impala/t1
3. 创建表
# 进⼊ impala-shell
impala-shell
# 表如果存在则删除
drop table if exists t1;
# 执⾏创建
create external table t1(id string,name string,age int,gender int)
row format delimited fields terminated by ','
location '/user/impala/t1' ;
4. 查询数据
5. 创建 t2
# 创建⼀个内部表
create table t2(id string,name string,age int,gender int)
row format delimited fields terminated by ',' ;
# 查看表结构
desc t1;
desc formatted t2;
 
6. 插⼊数据到 t2
insert overwrite table t2 select * from t1 where gender = 0 ;
# 验证数据
select * from t2;
更新元数据
使⽤ Beeline 连接 Hive 查看 Hive 中的数据,发现通过 Impala 创建的表,导⼊的数据都可以被 Hive感知到。
⼩结:
1. 上⾯案例中 Impala 的数据⽂件我们准备的是以逗号分隔的⽂本⽂件,实际上, Impala可以⽀持 RCFile,SequenceFile,Parquet 等多种⽂件格式。
2. Impala Hive 元数据的关系?
  • Hive对于元数据的更新操作不能被Impala感知到;
  • Impala对元数据的更新操作可以被Hive感知到。
Impala 同步 Hive 元数据命令:

⼿动执⾏invalidate metadata ,Impala是通过Hivemetastore服务来访问和操作Hive的元数据,但是Hive对表进⾏创建删除修改等操作,Impala是⽆法⾃动识别到Hive中元数据的变更情况的,如果想让Impala识别 到Hive元数据的变化,所以需要进⼊impala-shell之后⾸先要做的操作就是执⾏invalidate metadata,该命令会将所有的Impala的元数据失效并重新从元数据库同步元数据信息。后⾯ 详细讲解元数据更新命令。

3. Impala 操作 HDFS 使⽤的是 Impala⽤户,所以为了避免权限问题,我们可以选择关闭权限校验

hdfs-site.xml中添加如下配置

<!--关闭hdfs权限校验 -->
 <property>
     <name>dfs.permissions.enabled</name>
     <value>false</value>
 </property>

3 部分 Imapla的架构原理

1 Impala的组件

Impala是⼀个分布式,⼤规模并⾏处理(MPP)数据库引擎,它包括多个进程。ImpalaHive类似不是数据库⽽是数据分析⼯具;

 

impalad

⻆⾊名称为Impala Daemon,是在每个节点上运⾏的进程,是Impala的核⼼组件,进程名是 Impalad;

作⽤,负责读写数据⽂件,接收来⾃Impala-shellJDBC,ODBC等的查询请求,与集群其它 Impalad分布式并⾏完成查询任务,并将查询结果返回给中⼼协调者。

为了保证Impalad进程了解其它Impalad的健康状况,Impalad进程会⼀直与statestore保持通信。

Impalad服务由三个模块组成:Query PlannerQuery CoordinatorQuery Executor,前两个 模块组成前端,负责接收SQL查询请求,解析SQL并转换成执⾏计划,交由后端执⾏,

statestored

statestore监控集群中Impalad的健康状况,并将集群健康信息同步给Impalad,

statestore进程名为statestored

catalogd

Impala执⾏的SQL语句引发元数据发⽣变化时,catalog服务负责把这些元数据的变化同步给其它 Impalad进程(⽇志验证,监控statestore进程⽇志)

catalog服务对应进程名称是catalogd

由于⼀个集群需要⼀个catalogd以及⼀个statestored进程,⽽且catalogd进程所有请求都是经过statestored进程发送,所以官⽅建议让statestored进程与catalogd进程安排同个节点。

2 Impala的查询

 
1. Client 提交任务

Client发送⼀个SQL查询请求到任意⼀个Impalad节点,会返回⼀个queryId⽤于之后的客户端操作。

2. ⽣成单机和分布式执⾏计划

SQL提交到Impalad节点之后,Analyser依次执⾏SQL的词法分析、语法分析、语义分析等操作;

MySQL元数据库中获取元数据,从HDFS的名称节点中获取数据地址,以得到存储这个查询相关数据的所有数据节点

单机执⾏计划: 根据上⼀步对SQL语句的分析,由Planner先⽣成单机的执⾏计划,该执⾏计划是有PlanNode组成的⼀棵树,这个过程中也会执⾏⼀些SQL优化,例如Join顺序改变、谓词下推等。

分布式并⾏物理计划:将单机执⾏计划转换成分布式并⾏物理执⾏计划,物理执⾏计划由⼀个个的Fragment组成,Fragment之间有数据依赖关系,处理过程中需要在原有的执⾏计划之上加⼊⼀些ExchangeNodeDataStreamSink信息等。

Fragment sql⽣成的分布式执⾏计划的⼀个⼦任务;

DataStreamSink:传输当前的Fragment输出数据到不同的节点

3. 任务调度和分发

CoordinatorFragment(⼦任务)根据数据分区信息发配到不同的Impalad节点上执⾏。Impalad节点接收到执⾏Fragment请求交由Executor执⾏。

4. Fragment 之间的数据依赖

每⼀个Fragment的执⾏输出通过DataStreamSink发送到下⼀个FragmentFragment运⾏过程中不断向coordinator节点汇报当前运⾏状态。

5. 结果汇总

查询的SQL通常情况下需要有⼀个单独的Fragment⽤于结果的汇总,它只在Coordinator节点运⾏,将多个节点的最终执⾏结果汇总,转换成ResultSet信息。

6. 获取结果

客户端调⽤获取ResultSet的接⼝,读取查询结果。

4 部分 Impala的使⽤

Impala 的核⼼开发语⾔是 sql 语句, Impala shell 命令⾏窗⼝,以及 JDBC 等⽅式来接收 sql语句执⾏, 对于复杂类型分析可以使⽤ C++ 或者 Java 来编写 UDF 函数。
Impala sql 语法是⾼度集成了 Apache Hive sql 语法, Impala ⽀持 Hive ⽀持的数据类型以及部分Hive 的内置函数。
需要注意的⼏点:

1. ImpalaHive类似它们的重点都是在与查询,所以像Update,delete等具有更新性质的操作最好不要使⽤这种⼯具,对于删除数据的操作可以通过Drop Table,Alter Table Drop Partition来实现,更新可以尝试使⽤Insert overwrite⽅式

2. 通常使⽤Impala的⽅式是数据⽂件存储在Hdfs⽂件系统,借助于Impala的表定义来查询和管理 Hdfs上的数据⽂件;

3. Impala的使⽤⼤多数与Hive相同,⽐如Impala同样⽀持内外部表,以及分区等,可以借鉴参考 Hive的使⽤。

1 Impala-shell命令参数

1.1 impala-shell外部命令

所谓的外部命令指的是不需要进⼊到impala-shell交互命令⾏当中即可执⾏的命令参数。impala-shell⾯执⾏的时候可以带很多参数。你可以在启动 impala-shell 时设置,⽤于修改命令执⾏环境。

impala-shell –h可以帮助我们查看帮助⼿册。也可以参考课程附件资料。

⽐如⼏个常⻅的:
impala-shell –r 刷新 impala 元数据,与建⽴连接后执⾏ REFRESH 语句效果相同 ( 元数据发⽣变化的时候 )
impala-shell –f ⽂件路径 执⾏指的的 sql 查询⽂件。
impala-shell –i 指定连接运⾏ impalad 守护进程的主机。默认端⼝是 21000 。你可以连接到集群中运⾏
impalad 的任意主机。
impala-shell –o 保存执⾏结果到⽂件当中去。
展示 Impala 默认⽀持的内置函数需要进⼊ Impala 默认系统数据库中执⾏
use _impala_builtins;
 show functions;
 

1.2 impala-shell内部命令

所谓内部命令是指,进⼊impala-shell命令⾏之后可以执⾏的语法。

connect hostname 连接到指定的机器 impalad 上去执⾏。
refresh dbname.tablename 增量刷新,刷新某⼀张表的元数据,主要⽤于刷新 hive当中数据表⾥⾯的数据改变的情况。
invalidate metadata 全量刷新,性能消耗较⼤,主要⽤于 hive当中新建数据库或者数据库表的时候来进⾏刷新。
quit/exit 命令 从 Impala shell 中退出
explain 命令 ⽤于查看sql语句的执⾏计划。
explain 的值可以设置成 0,1,2,3 等⼏个值,其中 3级别是最⾼的,可以打印出最全的信息 set explain_level = 3 ;
profifile 命令执⾏ sql语句之后执⾏,可以打印出更加详细的执⾏步骤,主要⽤于查询结果的查看,集群的调优等。
 
  • expalin:可以不真正执⾏任务,只是展示任务的执⾏计划;
  • profifile:需要任务执⾏完成后调⽤,可以从更底层以及更详细的层⾯来观察我们运⾏impala的任务,进⾏调优。

2 Impala sql语法

2.1 数据库特定语句

1. 创建数据库

CREATE DATABASE语句⽤于在Impala中创建新数据库。

CREATE DATABASE IF NOT EXISTS database_name;

这⾥, IF NOT EXISTS是⼀个可选的⼦句。如果我们使⽤此⼦句,则只有在没有具有相同名称的现有数据库时,才会创建具有给定名称的数据库。
默认就会在hive的数仓路径下创建新的数据库名⽂件夹
/user/hive/warehouse/lagoutest.db

 

2. 删除数据库
Impala DROP DATABASE 语句⽤于从 Impala中删除数据库。 在删除数据库之前,建议从中删除所有表。
如果使⽤级联删除, Impala 会在删除指定数据库中的表之前删除它。
drop database sample cascade;
2.2 表特定语句
1. create table 语句
CREATE TABLE 语句⽤于在 Impala中的所需数据库中创建新表。 需要指定表名字并定义其列和每列的数据类型。
impala ⽀持的数据类型和 hive 类似 .
create table IF NOT EXISTS database_name.table_name ( column1 data_type,
column2 data_type, column3 data_type, ……… columnN data_type);
CREATE TABLE IF NOT EXISTS my_db.student(name STRING, age INT, contact INT );
默认建表的数据存储路径跟 hive ⼀致。也可以在建表的时候通过 location指定具体路径。
2. insert 语句
Impala INSERT 语句有两个⼦句 : into overwrite into ⽤于插⼊新记录数据, overwrite⽤于覆盖已有的记录。
这⾥, column1 column2 ... columnN是要插⼊数据的表中的列的名称。还可以添加值⽽不指定列名,但是,需要确保值的顺序与表中的列的顺序相同。
insert into table_name (column1, column2, column3,.. .columnN ) values (value1,
value2, value3,.. .valueN );
Insert into table_name values (value1, value2, value2);
例⼦
 
create table employee (Id INT , name STRING, age INT ,address STRING, salary BIGINT );
insert into employee VALUES ( 1 , 'Ramesh' , 32 , 'Ahmedabad' , 20000 );
insert into employee values ( 2 , 'Khilan' , 25 , 'Delhi' , 15000 );
Insert into employee values ( 3 , 'kaushik' , 23 , 'Kota' , 30000 );
Insert into employee values ( 4 , 'Chaitali' , 25 , 'Mumbai' , 35000 );
Insert into employee values ( 5 , 'Hardik' , 27 , 'Bhopal' , 40000 );
Insert into employee values ( 6 , 'Komal' , 22 , 'MP' , 32000 );

overwrite覆盖⼦句覆盖表当中全部记录。 覆盖的记录将从表中永久删除。

Insert overwrite employee values (1, 'Ram', 26, 'Vishakhapatnam', 37000 );

 3. select语句

Impala SELECT 语句⽤于从数据库查询数据, 此查询以表的形式返回数据。
4. describe 语句
Impala 中的 describe语句⽤于提供表的描述。 此语句的结果包含有关表的信息,例如列名称及其数据类型。
describe table_name;
简写
desc table_name;
5. alter table
Impala 中的Alter table语句⽤于对给定表执⾏更改。使⽤此语句,我们可以添加,删除或修改现有表中的列,也可以重命名它们。参考 Hive 实现。
6. delete truncate table
Impala drop table 语句⽤于删除 Impala 中的现有表。此语句还会删除内部表的底层 HDFS ⽂件。
drop table database_name .table_name ;
注意:使⽤此命令时必须⼩⼼,因为删除表后,表中可⽤的所有信息也将永远丢失。
Impala Truncate Table 语句⽤于从现有表中删除所有记录。保留表结构。
您也可以使⽤ DROP TABLE命令删除⼀个完整的表,但它会从数据库中删除完整的表结构,如果您希望存储⼀些数据,您将需要重新创建此表。
truncate table_name;
Impala对复杂数据类型的⽀持:对于 Text 存储格式中的复杂类型不⽀持,复杂类型要使⽤ parquet 格式。
7. view 视图
视图仅仅是存储在数据库中具有关联名称的 Impala 查询语⾔的语句。 它是以预定义的 SQL查询形式的表 的组合。
视图可以包含表的所有⾏或选定的⾏。
create view if not exists view_name as select statement
创建视图 view 、查询视图 view
create view if not exists employee_view AS select name, age from employee;
修改视图
alter view database_name .view_name as Select 语句
删除视图
drop view database_name .view_name ;
8. order by ⼦句
Impala ORDER BY⼦句⽤于根据⼀个或多个列以升序或降序对数据进⾏排序。 默认情况下,⼀些数据库按升序对查询结果进⾏排序。
select * from table_name ORDER BY col_name
[ ASC |DESC] [NULLS FIRST|NULLS LAST]
可以使⽤关键字 ASC DESC 分别按升序或降序排列表中的数据。
如果我们使⽤ NULLS FIRST ,表中的所有空值都排列在顶⾏ ; 如果我们使⽤ NULLS LAST,包含空值的⾏ 将最后排列。
9. group by ⼦句
Impala GROUP BY ⼦句与 SELECT 语句协作使⽤,以将相同的数据排列到组中。
10. having ⼦句
容易与 where 过滤进⾏混淆,
如何区分:

where:过滤的数据是原始数据,表中本来就存在的数据;

having:过滤的是查询结果数据;

按年龄对表进⾏分组,并选择每个组的最⼤⼯资,并显示⼤于 20000 的⼯资
select max(salary) from employee group by age having max(salary) > 20000;
11. limit offffset
Impala 中的 limit⼦句⽤于将结果集的⾏数限制为所需的数,即查询的结果集不包含超过指定限制的记 录。
⼀般来说, select 查询的 resultset 中的⾏从 0 开始。使⽤ offffset ⼦句,我们可以决定从哪⾥考虑输出。
select * from employee order by salary limit 2 offset 2 ;
使⽤offffset关键字要求结果数据必须是排序之后的!!
3 Impala 导⼊数据
1. insert into values

这种⽅式⾮常类似于RDBMS的数据插⼊⽅式。

create table t_test2(id int ,name string);
insert into table t_test2 values ( 1 ,”zhangsan”);
2. insert into select
插⼊⼀张表的数据来⾃于后⾯的 select 查询语句返回的结果。
3. create table as select
建表的字段个数、类型、数据来⾃于后续的 select 查询语句。
load data ⽅式,这种⽅式不建议在 Impala 中使⽤,先使⽤ load data ⽅式把数据加载到 Hive表中,然后使⽤以上⽅式插⼊ Impala 表中。

5 部分 ImpalaJDBC⽅式查询

在实际⼯作当中,因为impala的查询⽐较快,所以可能有会使⽤到impala来做数据库查询的情况,我们可以通过java代码来进⾏操作impala的查询

1. 导⼊ jar
<dependencies>
    <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>2.9.2</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.hive/hive-common -->
    <dependency>
    <groupId>org.apache.hive</groupId>
    <artifactId>hive-common</artifactId>
    <version>2.3.7</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.hive/hive-metastore-->
    <dependency>
        <groupId>org.apache.hive</groupId>
        <artifactId>hive-metastore</artifactId>
        <version>2.3.7</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.hive/hive-service -->
    <dependency>
    <groupId>org.apache.hive</groupId>
    <artifactId>hive-service</artifactId>
    <version>2.3.7</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.hive/hive-jdbc -->
    <dependency>
        <groupId>org.apache.hive</groupId>
        <artifactId>hive-jdbc</artifactId>
        <version>2.3.7</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.hive/hive-exec -->
    <dependency>
        <groupId>org.apache.hive</groupId>
        <artifactId>hive-exec</artifactId>
        <version>2.3.7</version>
    </dependency>
</dependencies>
2. java 代码开发
 
import java.sql.*;

public class ImpalaTest {
    public static void main(String[] args) throws SQLException, ClassNotFoundException {
        //定义连接impala的驱动和连接url
        String driver = "org.apache.hive.jdbc.HiveDriver";
        String driverUrl = "jdbc:hive2://test3.bigload.com:21050/impala;auth=noSasl";
        //查询的sql语句
        String querySql = "select * from t1";
        //获取连接
        Class.forName(driver);
        //通过Drivermanager获取连接
        final Connection connection = DriverManager.getConnection(driverUrl);
        final PreparedStatement ps = connection.prepareStatement(querySql);
        //执⾏查询
        final ResultSet resultSet = ps.executeQuery();
        //解析返回结果
        //获取到每条数据的列数
        final int columnCount = resultSet.getMetaData().getColumnCount();
        //遍历结果集
        while (resultSet.next()) {
            for (int i = 1; i <= columnCount; i++) {
                final String string = resultSet.getString(i);
                System.out.print(string + "\t");
            }
            System.out.println();
        }
        //关闭资源
        ps.close();
        connection.close();
    }

}

6 部分 Impala进阶

1 Impala的负载均衡

Impala 主要有三个组件,分别是 statestore catalog impalad ,对于 Impalad节点,每⼀个节点都可以接收客户端的查询请求,并且对于连接到该 Impalad 的查询还要作为 Coordinator节点(需要消耗⼀定的内存和 CPU )存在,为了保证每⼀个节点的资源开销的平衡需要对于集群中的 Impalad节点做⼀下负载均衡 .
Cloudera 官⽅推荐的代理⽅案 :HAProxy
DNS 做负载均衡
DNS 做负载均衡⽅案是最简单的,但是性能⼀般,所以这⾥我们按照官⽅的建议使⽤ HAProxy实现负载均衡
⽣产中应该选择⼀个⾮ Impalad 节点作为 HAProxy 的安装节点

1.1 HAProxy⽅案

安装 haproxy
yum install haproxy -y
配置⽂件
vim /etc/haproxy/haproxy.cfg
具体配置内容  在main frontend which proxys to the backends上面添加
listen impalashell
    bind 0.0.0.0:25003#ha作为 proxy 所绑定的 IP 和端口
    mode tcp#以 4 层⽅式代理,重要
    option tcplog
    balance roundrobin#调度算法 'leastconn' 最少连接数分配,或者 'roundrobin',轮询
    server impalashell_1 linux121:21000 check
    server impalashell_2 linux122:21000 check
    server impalashell_3 linux123:21000 check
 
listen impalajdbc
    bind 0.0.0.0:25004#ha作为 proxy 所绑定的 IP 和端⼝
    mode tcp#以 4 层⽅式代理,重要
    option tcplog
    balance roundrobin #调度算法 'leastconn' 最少连接数分配,或者 'roundrobin',轮询分
    server impalajdbc_1 linux121:21050 check
    server impalajdbc_2 linux122:21050 check
    server impalajdbc_3 linux122:21050 check
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
启动
开启: service haproxy start
关闭: service haproxy stop
重启: service haproxy restart
使⽤
Impala-shell 访问⽅式
impala-shell -i linux123:25003
使⽤起来⼗分⽅便,区别仅仅相当于是修改了⼀个 ip 地址和端⼝⽽已,其余不变。
jdbc:hive2://linux123:25004/default;auth=noSasl
Impala 集群在操作过程中尽量多给内存,如果内存不能满⾜使⽤要求, Impala 的执⾏很可能会报错!!

2 Impala优化

cloudera 官⽹上的 Impala ⽂档,原名为《 Impala Performance Guidelines and Best Practices 》。主要介绍了为了提升 impala 性能应该考虑的⼀些事情,结合实际考虑:
1. 基本优化策略
  • ⽂件格式

对于⼤数据量来说,Parquet⽂件格式是最佳的

  • 避免⼩⽂件

insert ... values 会产⽣⼤量⼩⽂件,避免使⽤

  • 合理分区粒度

利⽤分区可以在查询的时候忽略掉⽆⽤数据,提⾼查询效率,通常建议分区数量在3万以下 (太多的分区也会造成元数据管理的性能下降)

  • 分区列数据类型最好是整数类型
  • 分区列可以使⽤string类型,因为分区列的值最后都是作为HDFS⽬录使⽤,如果分区列使⽤ 整数类型可以降低内存消耗
  • 获取表的统计指标:在追求性能或者⼤数据量查询的时候,要先获取所需要的表的统计指标 (:执⾏ compute stats )
  • 减少传输客户端数据量

聚合(countsummax )

过滤(WHERE )

limit限制返回条数

返回结果不要使⽤美化格式进⾏展示(在通过impala-shell展示结果时,添加这些可选参数: - B --output_delimiter )

  • 在执⾏之前使⽤EXPLAIN来查看逻辑规划,分析执⾏逻辑
  • Impala join⾃动的优化⼿段就是通过使⽤COMPUTE STATS来收集参与Join的每张表的统计信 息,然后由Impala根据表的⼤⼩、列的唯⼀值数⽬等来⾃动优化查询。为了更加精确地获取每张表的统计信息,每次表的数据变更时(如执⾏Insert,add partition,drop partition)最好 都要执⾏⼀遍COMPUTE STATS获取到准确的表统计信息。
 
 
 
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页