前言
Impala
是
Cloudera
提供的⼀款开源的针对
HDFS
和
HBASE
中的
PB
级别数据进⾏交互式实时查询
(Impala
速度快
)
,
Impala
是参照⾕歌的新三篇论⽂当中的
Dremel
实现⽽来,其中旧三篇论⽂分别是
(
BigTable
,
GFS
,
MapReduce
)分别对应我们即将学的
HBase
和已经学过的
HDFS
以及
MapReduce
。
Impala
最⼤卖点和最⼤特点就是
快速
,
Impala
中⽂翻译是⾼⻆羚⽺。
一、Impala的安装(制作本地Yum源⽅式安装)
1.1
集群准备
1.1.1
安装
Hadoop,Hive
Impala
的安装需要提前装好
Hadoop
,
Hive
这两个框架,
hive
需要在所有的
Impala
安装的节点上⾯都要有,因为
Impala
需要引⽤
Hive
的依赖包,
hadoop
的框架需要⽀持
C
程序访问接⼝,查看下图,如果有该路径有
.so
结尾⽂件,就证明⽀持
C
接⼝
1.1.2
准备
Impala
的所有依赖包
此处制作本地yum源进行相关安装
步骤:
1. Linux121
安装
Httpd
服务器
#yum
⽅式安装
httpd
服务器
yum install httpd
-y
#
启动
httpd
服务器
systemctl
start
httpd
#
验证
httpd
⼯作是否正常
,
默认端⼝是
80
,可以省略
http://linux121
2.
新建⼀个测试⻚⾯
httpd
默认存放⻚⾯路径
/var/www/html/
例如放置一个静态页面index.html
点击
http://linux121/index.html看是否成功
3.
下载
Impala
安装所需
rpm
包
Impala
所需安装包需要到
Cloudera
提供地址下载
http://archive.cloudera.com/cdh5/repo-as-tarball/5.7.6/cdh5.7.6-
centos7.tar.gz
解压rpm包
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
2.2
安装
Impala
2.2.1
集群规划
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
官⽅建议
statestore
与
catalog
安装在同⼀节点上!!
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
Linux121
与
Linux122
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 -r /opt/lagou/servers/hive-2.3.7/ linux122:/opt/lagou/servers/
rsync -r /opt/lagou/servers/hive-2.3.7/ linux121:/opt/lagou/servers/
3. Linux123
启动
metastore
服务
nohup hive --service metastore &
启动hiveserver2服务
nohup hive --service hiveserver2 &
配置
HDFS
集群的短路读取
什么是短路读取?
在
HDFS
中通过
DataNode
来读取数据。但是,当客户端向
DataNode
请求读取⽂件时,
DataNode
就会从磁盘读取该⽂件并通过
TCP socket
将数据发送到客户端。所谓
“
短路
”
是指
Client
客户端直接
读取⽂件。很明显,这种情况只在客户端与数据放在同⼀地点(译者注:同⼀主机)时才有可能发
⽣。短路读对于许多应⽤程序会带来重⼤的性能提升。
短路读取:就是
Client
与
DataNode
属于同⼀节点,⽆需再经过⽹络传输数据,直接本地读取。
要配置短路本地读,需要验证本机
Hadoop
是否有
libhadoop.so;
进⼊⼀下⽬录:
/opt/lagou/servers/hadoop-2.9.2/lib/native
短路读取配置步骤
1.
创建短路读取本地中转站
#
所有节点创建⼀下⽬录
mkdir
-p
/var/lib/hadoop-hdfs
#设置目录拥有者,否则启动Hadoop集群会有问题
chown root /var/lib/hadoop-hdfs
chown 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
ps:创建短路读取后,如出现启动datanode
不成功
报错信息大致如下:
java.io.IOException: The path component: '/var/lib/hadoop-hdfs' in '/var/lib/hadoop-hdfs/dn_socket' has permissions 0755 uid 993 and gid 991. It is not protected because it is owned by a user who is not root and not the effective user: '0'. This might help: 'chown root /var/lib/hadoop-hdfs' or 'chown 0 /var/lib/hadoop-hdfs'. For more information: https://wiki.apache.org/hadoop/SocketPathSecurity
at org.apache.hadoop.net.unix.DomainSocket.validateSocketPathSecurity0(Native Method)
at org.apache.hadoop.net.unix.DomainSocket.bindAndListen(DomainSocket.java:193)
at org.apache.hadoop.hdfs.net.DomainPeerServer.<init>(DomainPeerServer.java:40)
at org.apache.hadoop.hdfs.server.datanode.DataNode.getDomainPeerServer(DataNode.java:1171)
at org.apache.hadoop.hdfs.server.datanode.DataNode.initDataXceiver(DataNode.java:1137)
at org.apache.hadoop.hdfs.server.datanode.DataNode.startDataNode(DataNode.java:1369)
at org.apache.hadoop.hdfs.server.datanode.DataNode.<init>(DataNode.java:495)
at org.apache.hadoop.hdfs.server.datanode.DataNode.makeInstance(DataNode.java:2695)
at org.apache.hadoop.hdfs.server.datanode.DataNode.instantiateDataNode(DataNode.java:2598)
at org.apache.hadoop.hdfs.server.datanode.DataNode.createDataNode(DataNode.java:2645)
at org.apache.hadoop.hdfs.server.datanode.DataNode.secureMain(DataNode.java:2789)
at org.apache.hadoop.hdfs.server.datanode.DataNode.main(DataNode.java:2813)
原因在创建hadoop-hdfs时未授权
解决办法:在集群中执行命令
chown root /var/lib/hadoop-hdfs
5. Impala具体配置 引⽤
HDFS
,
Hive
配置
使⽤
Yum
⽅式安装
impala
默认的
Impala
配置⽂件⽬录为
/etc/impala/conf
,
Impala
的使⽤要依赖
Hadoop
,
Hive
框架,所以需要把
Hdfs,Hive
的配置⽂件告知
Impala
。
执⾏以下命令把
Hdfs
,
Hive
的配置⽂件软链接到
/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
注:所有节点都要执⾏此命令!
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
修改
bigtop
的
java_home
路径
vim
/etc/default/bigtop-utils
export
JAVA_HOME
=
/opt/lagou/servers/jdk1.8.0_231
注意:
Apache Bigtop
是⼀个针对基础设施⼯程师和数据科学家的开源项⽬,旨在全⾯打包、测试
和配置领先的开源⼤数据组件
/
项⽬。
Impala
项⽬中使⽤到了此软件。
启动
Impala
#linux123启动如下⻆⾊
service impala-state-store start
service impala-catalog start
service impala-server start
#其余节点启动如下⻆⾊
service impala-server start
查看impala进程
ps
-ef
|
grep
impala
浏览器
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
至此impala安装配置完毕!
二、Impala的架构原理(有哪些组件,组件的作⽤,查询流程,查询计划)
Impala
的组件
Impala
是⼀个分布式,⼤规模并⾏处理
(MPP)
数据库引擎,它包括多个进程。
Impala
与
Hive
类似不是数
据库⽽是数据分析⼯具;
Impala
的查询
1. Client
提交任务
Client
发送⼀个
SQL
查询请求到任意⼀个
Impalad
节点,会返回⼀个
queryId
⽤于之后的客户端操
作。
2.
⽣成单机和分布式执⾏计划
SQL
提交到
Impalad
节点之后,
Analyser
依次执⾏
SQL
的词法分析、语法分析、语义分析等操作;
从
MySQL
元数据库中获取元数据,从
HDFS
的名称节点中获取数据地址,以得到存储这个查询相关
数据的所有数据节点
单机执⾏计划: 根据上⼀步对
SQL
语句的分析,由
Planner
先⽣成单机的执⾏计划,该执⾏计
划是有
PlanNode
组成的⼀棵树,这个过程中也会执⾏⼀些
SQL
优化,例如
Join
顺序改变、谓
词下推等。
分布式并⾏物理计划:将单机执⾏计划转换成分布式并⾏物理执⾏计划,物理执⾏计划由⼀
个个的
Fragment
组成,
Fragment
之间有数据依赖关系,处理过程中需要在原有的执⾏计划
之上加⼊⼀些
ExchangeNode
和
DataStreamSink
信息等。
Fragment
:
sql
⽣成的分布式执⾏计划的⼀个⼦任务;
DataStreamSink
:传输当前的
Fragment
输出数据到不同的节点
3.
任务调度和分发
Coordinator
将
Fragment(
⼦任务
)
根据数据分区信息发配到不同的
Impalad
节点上执⾏。
Impalad
节点接收到执⾏
Fragment
请求交由
Executor
执⾏。
4. Fragment
之间的数据依赖
每⼀个
Fragment
的执⾏输出通过
DataStreamSink
发送到下⼀个
Fragment
,
Fragment
运⾏过程中
不断向
coordinator
节点汇报当前运⾏状态。
5.
结果汇总
查询的
SQL
通常情况下需要有⼀个单独的
Fragment
⽤于结果的汇总,它只在
Coordinator
节点运
⾏,将多个节点的最终执⾏结果汇总,转换成
ResultSet
信息。
6.
获取结果
客户端调⽤获取
ResultSet
的接⼝,读取查询结果。
分析上⾯的单机执⾏计划,第⼀步先去扫描
t1
表中需要的数据,如果数据⽂件存储是列式存储我们可以
便利的扫描到所需的列
id,n1;
接着需要与
t2
表进⾏
Join
操作,扫描
t2
表与
t1
表类似获取到所需数据列
id,n2;t1
与
t2
表进⾏关联,关联之后再与
t3
表进⾏关联,这⾥
Impala
会使⽤谓词下推扫描
t3
表只取
join
所
需数据;对
group by
进⾏相应的
aggregation
操作,最终是排序取出指定数量的数据返回。
分布式并⾏执⾏计划
所谓的分布式并⾏化执⾏计划就是在单机执⾏计划基础之上结合数据分布式存储的特点,按照任务的计
算要求把单机执⾏计划拆分为多段⼦任务,每个⼦任务都是可以并⾏执⾏的。上⾯的单机执⾏计划转为
分布式并⾏执⾏计划如下图所示:
分布式执⾏计划中涉及到多表的
Join,Impala
会根据表的⼤⼩来决定
Join
的⽅式,主要有两种分别是
Hash
Join
与
Broadcast Join
上⾯分布式执⾏计划中可以看出
T1,T2
表⼤⼀些,⽽
T3
表⼩⼀些,所以对于
T1
与
T2
的
Join Impala
选择使
⽤
Hash Join,
对于
T3
表选择使⽤
Broadcast
⽅式,直接把
T3
表⼴播到需要
Join
的节点上。
分布式并⾏计划流程
1. T1
和
T2
使⽤
Hash join
,此时需要按照
id
的值分别将
T1
和
T2
分散到不同的
Impalad
进程,但是相同
的
id
会散列到相同的
Impalad
进程,这样每⼀个
Join
之后是全部数据的⼀部分
2. T1
与
T2Join
之后的结果数据再与
T3
表进⾏
Join,
此时
T3
表采⽤
Broadcast
⽅式把⾃⼰全部数据
(id
列
)
⼴播到需要的
Impala
节点上
3. T1,T2,T3Join
之后再根据
Group by
执⾏本地的预聚合,每⼀个节点的预聚合结果只是最终结果的⼀
部分(不同的节点可能存在相同的
group by
的值),需要再进⾏⼀次全局的聚合。
4.
全局的聚合同样需要并⾏,则根据聚合列进⾏
Hash
分散到不同的节点执⾏
Merge
运算(其实仍然
是⼀次聚合运算),⼀般情况下为了较少数据的⽹络传输,
Impala
会选择之前本地聚合节点做全
局聚合⼯作。
5.
通过全局聚合之后,相同的
key
只存在于⼀个节点,然后对于每⼀个节点进⾏排序和
TopN
计算,最
终将每⼀个全局聚合节点的结果返回给
Coordinator
进⾏合并、排序、
limit
计算,返回结果给⽤户
.
三、Impala的使⽤(使⽤与Hive类似,编写sql⽅式;Impala的DDL,查询语法,导⼊数据)
Impala
的核⼼开发语⾔是
sql
语句,
Impala
有
shell
命令⾏窗⼝,以及
JDBC
等⽅式来接收
sql
语句执⾏,
对于复杂类型分析可以使⽤
C++
或者
Java
来编写
UDF
函数。
Impala
的
sql
语法是⾼度集成了
Apache Hive
的
sql
语法,
Impala
⽀持
Hive
⽀持的数据类型以及部分
Hive
的内置函数。
需要注意的⼏点:
1. Impala
与
Hive
类似它们的重点都是在与
查询
,所以像
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
默认系统数据库中执⾏
show functions;在其它数据库下⽆法查看!!
impala-shell
内部命令
所谓内部命令是指,进⼊
impala-shell
命令⾏之后可以执⾏的语法。
connect hostname
连接到指定的机器
impalad
上去执⾏。
refresh dbname.tablename
增量刷新,刷新某⼀张表的元数据,主要⽤于刷新
hive
当中数据表⾥⾯的
数据改变的情况。
invalidate metadata
全量刷新,性能消耗较⼤,主要⽤于
hive
当中新建数据库或者数据库表的时候来进
⾏刷新。
quit/exit
命令 从
Impala shell
中退出
explain
命令 ⽤于查看
sql
语句的执⾏计划。
show functions;
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
的数仓路径下创建新的数据库名⽂件夹
2.
删除数据库
Impala
的
DROP DATABASE
语句⽤于从
Impala
中删除数据库。 在删除数据库之前,建议从中删除所有
表。
如果使⽤级联删除,
Impala
会在删除指定数据库中的表之前删除它。
2.2
表特定语句
1. create table
语句
CREATE TABLE
语句⽤于在
Impala
中的所需数据库中创建新表。 需要指定表名字并定义其列和每列的数
据类型。
impala
⽀持的数据类型和
hive
类似
.
默认建表的数据存储路径跟
hive
⼀致。也可以在建表的时候通过
location
指定具体路径。
2. insert
语句
Impala
的
INSERT
语句有两个⼦句
: into
和
overwrite
。
into
⽤于插⼊新记录数据,
overwrite
⽤于覆盖已
有的记录。
这⾥,
column1
,
column2
,
... columnN
是要插⼊数据的表中的列的名称。还可以添加值⽽不指定列
名,但是,需要确保值的顺序与表中的列的顺序相同。
例⼦
/user/hive/warehouse/lagoutest.db
drop database sample cascade;
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 );
insert into
table_name (column1, column2, column3,..
.columnN
)
values
(value1,
value2, value3,..
.valueN
);
Insert into
table_name
values
(value1, value2, value2);
overwrite
覆盖⼦句覆盖表当中
全部记录
。 覆盖的记录将从表中永久删除。
3. select
语句
Impala SELECT
语句⽤于从数据库查询数据, 此查询以表的形式返回数据。
4. describe
语句
Impala
中的
describe
语句⽤于提供表的描述。 此语句的结果包含有关表的信息,例如列名称及其数据
类型。
5. alter table
Impala
中的
Alter table
语句⽤于对给定表执⾏更改。使⽤此语句,我们可以添加,删除或修改现有表中
的列,也可以重命名它们。
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
);
Insert
overwrite employee
values
(
1
,
'Ram'
,
26
,
'Vishakhapatnam'
,
37000
);
describe table_name;
参考
Hive
实现。
6. delete
、
truncate table
Impala drop table
语句⽤于删除
Impala
中的现有表。此语句还会删除内部表的底层
HDFS
⽂件。
注意:使⽤此命令时必须⼩⼼,因为删除表后,表中可⽤的所有信息也将永远丢失。
Impala
的
Truncate Table
语句⽤于从现有表中删除所有记录。保留表结构。
您也可以使⽤
DROP TABLE
命令删除⼀个完整的表,但它会从数据库中删除完整的表结构,如果您希望
存储⼀些数据,您将需要重新创建此表。
Impala
对复杂数据类型的⽀持
对于
Text
存储格式中的复杂类型不⽀持,复杂类型要使⽤
parquet
格式。
7. view
视图
视图仅仅是存储在数据库中具有关联名称的
Impala
查询语⾔的语句。 它是以预定义的
SQL
查询形式的表
的组合。
视图可以包含表的所有⾏或选定的⾏。
创建视图
view
、查询视图
view
修改视图
删除视图
8. order by
⼦句
Impala ORDER BY
⼦句⽤于根据⼀个或多个列以升序或降序对数据进⾏排序。 默认情况下,⼀些数据
库按升序对查询结果进⾏排序。
drop table
database_name
.table_name
;
truncate table_name;
create
view if
not
exists view_name
as select
statement
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
;
可以使⽤关键字
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
⼦句,我们可以决定从哪⾥考虑输出。
使⽤
offffset
关键字要求结果数据必须是排序之后的!!
第
3
节
Impala
导⼊数据
1. insert into values
这种⽅式⾮常类似于
RDBMS
的数据插⼊⽅式。
2. insert into select
select
*
from
table_name
ORDER BY
col_name
[
ASC
|DESC] [NULLS FIRST|NULLS LAST]
select
name, sum(salary)
from
employee
group by
name;
select
*
from
employee
order by
salary
limit
2
offset
2
;
create table
t_test2(id
int
,name string);
insert into table
t_test2
values
(
1
,”zhangsan”);
插⼊⼀张表的数据来⾃于后⾯的
select
查询语句返回的结果。
3. create table as select
建表的字段个数、类型、数据来⾃于后续的
select
查询语句。
load data
⽅式,这种⽅式不建议在
Impala
中使⽤,先使⽤
load data
⽅式把数据加载到
Hive
表中,然后
使⽤以上⽅式插⼊
Impala
表中。
Impala
的负载均衡
Impala
主要有三个组件,分别是
statestore
,
catalog
和
impalad
,对于
Impalad
节点,每⼀个节点都可
以接收客户端的查询请求,并且对于连接到该
Impalad
的查询还要作为
Coordinator
节点(需要消耗⼀
定的内存和
CPU
)存在,为了保证每⼀个节点的资源开销的平衡需要对于集群中的
Impalad
节点做⼀下
负载均衡
.
Cloudera
官⽅推荐的代理⽅案
:HAProxy
DNS
做负载均衡
DNS
做负载均衡⽅案是最简单的,但是性能⼀般,所以这⾥我们按照官⽅的建议使⽤
HAProxy
实现负载
均衡
⽣产中应该选择⼀个⾮
Impalad
节点作为
HAProxy
的安装节点
1.1 HAProxy
⽅案
安装
haproxy
配置⽂件
具体配置内容
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
();
}
}
yum install haproxy -y
vim /etc/haproxy/haproxy.cfg
#---------------------------------------------------------------------
# Example configuration for a possible web application. See the
# full configuration options online.
#
# http://haproxy.1wt.eu/download/1.4/doc/configuration.txt
#
#---------------------------------------------------------------------
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
mode http#mode { tcp|http|health }
,
tcp
表示
4
层,
http
表示
7
层,
health
仅作为健康检查使⽤
log global
option httplog
option dontlognull
#option http-server-close
#option forwardfor except 127.0.0.0/8
#option abortonclose##
连接数过⼤⾃动关闭
option redispatch#
如果失效则强制转换其他服务器
retries 3#
尝试
3
次失败则从集群摘除
timeout http-request 10s
timeout queue 1m
#timeout connect 10s
#timeout client 1m
#timeout server 1m
timeout connect 1d#
连接超时时间,重要,
hive
查询数据能返回结果的保证
timeout client 1d#
同上
timeout server 1d#
同上
timeout http-keep-alive 10s
timeout check 10s#
健康检查时间
maxconn 3000#
最⼤连接数
listen status#
定义管理界⾯
bind 0.0.0.0:1080#
管理界⾯访问
IP
和端⼝
mode http#
管理界⾯所使⽤的协议
option httplog
maxconn 5000#
最⼤连接数
stats refresh 30s#30
秒⾃动刷新
stats uri /stats
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
#---------------------------------------------------------------------
frontend main *:5000
acl url_static path_beg -i /static /images /javascript
/stylesheets
acl url_static path_end -i .jpg .gif .png .css .js
use_backend static if url_static
default_backend app
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
backend static
balance roundrobin
server static 127.0.0.1:4331 check
#---------------------------------------------------------------------
启动
使⽤
Impala-shell
访问⽅式
使⽤起来⼗分⽅便,区别仅仅相当于是修改了⼀个
ip
地址和端⼝⽽已,其余不变。
Impala
集群在操作过程中尽量多给内存,如果内存不能满⾜使⽤要求,
Impala
的执⾏很可能会报错!!
后续待完善中...
总结
本文主要针对impala进行简单介绍,安装配置,及其简单的使用,后续有待完善中。