impala是参照谷歌的新三篇论文(Caffeine–网络搜索引擎、Pregel–分布式图计算、Dremel–交互式分析工具)当中的Dremel实现而来,其中旧三篇论文分别是(BigTable,GFS,MapReduce)分别对应我们即将学的HBase和已经学过的HDFS以及MapReduce。
impala是基于hive并使用内存进行计算,兼顾数据仓库,具有实时,批处理,多并发等优点。
Impala主要由Impalad、 State Store、Catalogd和CLI组成。
impala集群的主节点
补充说明:
如果某个Impalad节点由于硬件错误、软件错误或者其他原因导致离线,statestored就会通知其他的节点,避免其他节点再向这个离线的节点发送请求。
由于statestored是当集群节点有问题的时候起通知作用,所以它对Impala集群并不是有关键影响的。
如果statestored没有运行或者运行失败,其他节点和分布式任务会照常运行,只是说当节点掉线的时候集群会变得没那么健壮。当statestored恢复正常运行时,它就又开始与其他节点通信并进行监控。
impala集群的主节点
补充说明:
因内存依赖大,所以最好不要和imapla的其他组件放到同一节点
最好是与hdfs的datanode节点部署在一起,提高查询计算(数据本地化)。
考虑集群性能问题,一般将StateStored 与 Catalogd 放在同一节点上,因两者之间要进行大量的通信。
客户端连接到impala daemon 上,它的内部有三个组件;
Query planner(查询解析器)
Query coordinator(中心协调节点)
Query executor(查询执行器)
1)impala集群中的元数据是保存在hive的metastore中的(mysql数据库中)
2)当impala集群启动之后,catalogd会从hive的metastore中把元数据信息同步过来,然后通过Statestore分发元数据信息到impala daemon中进行缓存。
3)如果在impala deamon中产生的元数据变更(创建库、创建表、修改表)操作。Catalog服务通知所有Impala daemons来更新缓存。这些都会缓存下来,然后通过catalog持久化这些信息到hive的metastore中.
4)如果是hive的客户端进行了元数据的变更操作,这个时候对于impala来说是不知道的,这里就需要impala去手动同步刷新.
用于刷新某个表或者某个分区的数据信息,它会重用之前的表元数据,仅仅执行文件刷新操作
REFRESH [table] //刷新某个表
REFRESH [table] PARTITION [partition] //刷新某个表的某个分区
用于刷新全库或者某个表的元数据,包括表的元数据和表内的文件数据.
INVALIDATE METADATA; //重新加载所有库中的所有表
INVALIDATE METADATA [table] //重新加载指定的某个表
2)我们这里就选择制作本地yum源来进行安装,所以首先我们需要下载到所有的rpm包,下载地址如下
http://archive.cloudera.com/cdh5/repo-as-tarball/5.14.0/
镜像文件 cdh5.14.0-centos7.tar.gz
把node3服务器作为镜像源节点,使用httpd这个软件来作为服务端,启动httpd的服务来作为我们镜像源的下载地址
yum -y install httpd
systemctl start httpd.service
进入到/etc/yum.repos.d目录,新建文件
vim localimp.repo
[localimp]
name=localimp
baseurl=http://node3/cdh5.14.0
gpgcheck=0
enabled=1
ln -s /opt/bigdata/cdh/5.14.0 /var/www/html/cdh5.14.0
http://node3/cdh5.14.
scp /etc/yum.repos.d/localimp.repo node1:/etc/yum.repos.d
scp /etc/yum.repos.d/localimp.repo node2:/etc/yum.repos.d
服务名称 | node1 | node2 | node3 |
---|---|---|---|
impala-catalog | 安装 | 不安装 | 不安装 |
impala-state-store | 安装 | 不安装 | 不安装 |
impala-server | 不安装 | 安装 | 安装 |
impala-shell | 不安装 | 安装 | 安装 |
主节点node1执行以下命令进行安装
yum install impala-state-store -y
yum install impala-catalog -y
yum install bigtop-utils -y
从节点node2和node3执行以下命令进行安装
yum install impala-server -y
yum install impala-shell -y
yum install bigtop-utils -y
impala依赖于hive,所以首先需要进行hive的配置修改;
# node1机器修改hive-site.xml内容如下:
vim /opt/bigdata/hive/conf/hive-site.xml
<property>
<name>hive.metastore.urisname>
<value>thrift://node1:9083value>
property>
<property>
<name>hive.metastore.client.socket.timeoutname>
<value>3600value>
property>
在node1上执行命令
cd /opt/bigdata/
scp -r hive node2:$PWD
scp -r hive node3:$PWD
在node1上启动hive的metastore服务
cd /opt/bigdata/hive
nohup bin/hive --service metastore &
注意:一定要保证mysql的服务正常启动,否则metastore的服务不能够启动
所有节点创建文件夹,并且授权
##用root用户创建,并授权给hadoop用户
mkdir -p /var/run/hdfs-sockets
chown -R hadoop:hadoop /var/run/hdfs-sockets
修改所有节点的hdfs-site.xml添加以下配置,修改完之后重启hdfs集群生效
vim /opt/bigdata/hadoop/etc/hadoop/hdfs-site.xml
<!--短路读取 就是允许impala把一些信息存储在本地磁盘上,可以加快计算的速度-->
<property>
<name>dfs.client.read.shortcircuit</name>
<value>true</value>
</property>
<!--打开块位置的存储的元数据信息-->
<property>
<name>dfs.datanode.hdfs-blocks-metadata.enabled</name>
<value>true</value>
</property>
<!--Datanode和DFSClient之间沟通的Socket的本地文件路径-->
<property>
<name>dfs.domain.socket.path</name>
<value>/var/run/hdfs-sockets/dn</value>
</property>
<!--分布式文件系统中并行RPC的超时-->
<property>
<name>dfs.client.file-block-storage-locations.timeout.millis</name>
<value>10000</value>
</property>
<!--<property>
<name>dfs.datanode.hdfs-blocks-metadata.enabled</name>
<value>true</value>
</property>-->
三台机器执行以下命令给文件夹授权
sudo chown -R hadoop:hadoop /var/run/hdfs-sockets/
start-dfs.sh
ln -s /opt/bigdata/hadoop/etc/hadoop/core-site.xml /etc/impala/conf/core-site.xml
ln -s /opt/bigdata/hadoop/etc/hadoop/hdfs-site.xml /etc/impala/conf/hdfs-site.xml
ln -s /opt/bigdata/hive/conf/hive-site.xml /etc/impala/conf/hive-site.xml
所有节点修改impala默认配置
vi /etc/default/impala
#指定集群的CATALOG_SERVICE和STATE_STORE服务地址
IMPALA_CATALOG_SERVICE_HOST=node1
IMPALA_STATE_STORE_HOST=node1
mkdir -p /usr/share/java
ln -s /opt/bigdata/apache-hive-1.2.2-bin/lib/mysql-connector-java-5.1.46.jar /usr/share/java/mysql-connector-java.jar
修改bigtop的java_home路径
vim /etc/default/bigtop-utils
export JAVA_HOME=/usr/java/jdk1.8.0_211-amd64
1、需要启动HDFS
##用hadoop用户启动hadoop,hive 用root用户启动impala
start-dfs.sh
2、启动hive的元数据服务
cd /opt/bigdata/hive
nohup bin/hive --service metastore &
3、启动impala
service impala-state-store start
service impala-catalog start
service impala-server start
4、查看impala进程是否存在
ps -ef | grep impala
注意:启动之后所有关于impala的日志默认都在 /var/log/impala这个路径下,node1机器上面应该有二个进程,node2与node3机器上面只有一个进程,如果进程个数不对,去对应目录下查看报错日志
service impala-state-store stop
service impala-catalog stop
service impala-server stop
启动好impala集群之后,可以访问web地址,查看集群相关信息
1.不需要进入到impala-shell交互命令行当中即可执行的命令参数
2.impala-shell后面执行的时候可以带很多参数:
impala-shell -h
impala-shell -r
impala-shell -v -V
cd /opt/install
vim impala-shell.sql
select * from course.score;
通过-f 参数来执行执行的查询文件
impala-shell -f impala-shell.sql
impala-shell -f impala-shell.sql -p
在node2或者是node3上进入impala-shell命令行之后可以执行的语法
1)help
2)connect
3)refresh 刷新
refresh dbname.tablename
增量刷新,刷新某一张表的元数据,主要用于刷新hive当中数据表里面的数据改变的情况4)invalidate metadata
invalidate metadata
全量刷新,性能消耗较大,主要用于hive当中新建数据库或者数据库表的时候来进行刷新5)explain
explain select * from default.employee;
explain的值可以设置成0,1,2,3等几个值,其中3级别是最高的,可以打印出最全的信息
set explain_level=3;
6) profile命令:
select * from course.score;
profile;
7)注意
impala-shell进入到impala的交互窗口
show databases;
创建数据库
create database if not exists mydb1;
这里会涉及到在hdfs上无法创建目录权限的问题
(1)关闭文件权限检查: 修改hdfs-site.xml文件添加以下配置
<property>
<name>dfs.permissionsname>
<value>falsevalue>
property>
(2) 修改文件权限
hdfs dfs -chmod 777 /user/hive/warehouse
删除数据库
drop database if exists mydb1;
创建表的语法跟hive一样
内部表:
create table mydb1.student1(id int ,name string ,age int ) row format delimited fields terminated by '\t' ;
外部表:
create external table mydb1.student2(id int ,name string ,age int ) row format delimited fields terminated by '\t' location '/user/hive/warehouse/student2';
insert语句插入数据
insert into student1 values (1, 'zhangsan', 25 );
insert into student1 values (2, 'lisi', 20 );
insert into student1 values (3, 'xiaozhang', 35 );
insert into student1 values (4, 'laowang', 45 );
通过load hdfs的数据到impala表中
# 准备数据student.txt并上传到hdfs的 /impala/data路径下去(注意目录权限)
11 zhangsan1 15
22 zhangsan2 20
33 zhangsan3 30
44 zhangsan4 50
加载数据
load data inpath '/impala/data' into table student1;
使用insert into select 语法
insert into user1 select * from user2;
select * from student1;
truncate student1;
drop table student1;
1、在hive中创建一张表
create table access_user(
session_id string,
cookie_id string,
visit_time string,
user_id string,
age int,
sex string,
visit_url string,
visit_os string,
browser_name string,
visit_ip string,
province string,
city string,
page_id string,
goods_id string,
shop_id string
)row format delimited fields terminated by ',';
2、加载数据到hive表中
load data local inpath '/home/hadoop/user50w.csv' into table access_user;
3、hive中执行查询语句
select count(*) from access_user;
4、impala-shell中同步hive的元数据
invalidate metadata;
5、impala-shell中执行查询语句
select count(*) from access_user;
6、order by语句
select * from table_name ORDER BY col_name [ASC|DESC] [NULLS FIRST|NULLS LAST]
Select * from employee ORDER BY id asc;
7、group by语句
select name, sum(salary) from employee group by name;
8、having语句
select * from table_name ORDER BY col_name [ASC|DESC] [NULLS FIRST|NULLS LAST]
-- 按年龄对表进行分组,并选择每个组的最大工资,并显示大于20000的工资
select max(salary) from employee group by age having max(salary) > 20000;
9、limit语句
select * from employee order by id limit 4;
10、impala当中的数据表导入几种方式
create table user(id int ,name string,age int ) row format delimited fields terminated by "\t";
准备数据user.txt并上传到hdfs的 /user/impala路径下去
1 hello 15
2 zhangsan 20
3 lisi 30
4 wangwu 50
加载数据
load data inpath '/user/impala/' into table user;
查询加载的数据
select * from user;
如果查询不不到数据,那么需要刷新一遍数据表
refresh user;
create table user2 as select * from user;
insert into 不推荐使用 因为会产生大量的小文件
千万不要把impala当做一个数据库来使用
insert into select 用的比较多
构建maven工程,添加依赖
<dependency>
<groupId>com.clouderagroupId>
<artifactId>ImpalaJDBC41artifactId>
<version>2.5.42version>
dependency>
<dependency>
<groupId>org.apache.hivegroupId>
<artifactId>hive-serviceartifactId>
<version>1.2.1version>
dependency>
<dependency>
<groupId>org.apache.hivegroupId>
<artifactId>hive-jdbcartifactId>
<version>1.2.1version>
<exclusions>
<exclusion>
<groupId>org.apache.hivegroupId>
<artifactId>hive-service-rpcartifactId>
exclusion>
<exclusion>
<groupId>org.apache.hivegroupId>
<artifactId>hive-serviceartifactId>
exclusion>
exclusions>
dependency>
开发代码:
package com.xichuan.dev;
import java.sql.*;
/**
* Created by XiChuan on 2020/4/21.
*/
public class TestImpala {
//impala的url连接地址
private static String url = "jdbc:impala://node2:21050/default";
//数据库连接
private static Connection conn;
private static PreparedStatement ps;
public static void main(String[] args) {
try {
//获取数据库连接
conn = DriverManager.getConnection(url);
//定义查询的sql语句
String sql="select * from mydb1.student1 limit 5";
//预编译sql语句
ps= conn.prepareStatement(sql);
//执行sql查询
ResultSet rs = ps.executeQuery();
while(rs.next()){
String id = rs.getString("id");
String name = rs.getString("name");
String age = rs.getString("age");
System.out.println(id+"\t"+name+"\t"+age+"\t");
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}