Hadoop生态技术圈之交互式查询⼯具Impala

#文章输出内容来源拉勾教育大数据高薪训练营#

前言

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 &

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

配置 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
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⽅式;ImpalaDDL,查询语法,导⼊数据)

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进行简单介绍,安装配置,及其简单的使用,后续有待完善中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值