Impala的安装和使用
通过本地yum源进行安装impala
所有cloudera软件下载地址
http://archive.cloudera.com/cdh5/cdh/5/
http://archive.cloudera.com/cdh5/
1、 impala的介绍
imala基本介绍
impala是cloudera提供的一款高效率的sql查询工具,提供实时的查询效果,官方测试性能比hive快3到10倍,其sql查询比sparkSQL还要更加快速,号称是当前大数据领域最快的查询sql工具,
impala是参照谷歌的新三篇论文(Caffeine、Pregel、Dremel
)当中的Dremel实现而来,其中旧三篇论文分别是(BigTable,GFS,MapReduce)分别对应我们即将学的HBase和已经学过的HDFS以及MapReduce
impala是基于hive并使用内存进行计算,兼顾数据仓库,具有实时,批处理,多并发等优点
impala与hive的关系
impala是基于hive的大数据分析查询引擎,直接使用hive的元数据库metadata,意味着impala元数据都存储在hive的metastore当中,并且impala兼容hive的绝大多数sql语法。所以需要安装impala的话,必须先安装hive,保证hive安装成功,并且还需要启动hive的metastore服务
impala的优点
1、 impala比较快,非常快,特别快,因为所有的计算都可以放入内存当中进行完成,只要你内存足够大
2、 摈弃了MR的计算,改用C++来实现,有针对性的硬件优化
3、 具有数据仓库的特性,对hive的原有数据做数据分析
4、支持ODBC,jdbc远程访问
impala的缺点:
1、基于内存计算,对内存依赖性较大
2、改用C++编写,意味着维护难度增大
3、基于hive,与hive共存亡,紧耦合
4、稳定性不如hive,不存在数据丢失的情况
impala的架构以及查询计划
Impala的架构模块:
impala-server ==>启动的守护进程,执行我们的查询计划 从节点,官方建议与所有的datanode装在一起,可以通过hadoop的短路读取特性实现数据的快速查询
impala-statestore ==》 状态存储区 主节点
impalas-catalog ==》元数据管理区 主节点
查询执行
impalad分为frontend和backend两个层次, frondend用java实现(通过JNI嵌入impalad), 负责查询计划生成, 而backend用C++实现, 负责查询执行。
frontend生成查询计划分为两个阶段:
(1)生成单机查询计划,单机执行计划与关系数据库执行计划相同,所用查询优化方法也类似。
(2)生成分布式查询计划。 根据单机执行计划, 生成真正可执行的分布式执行计划,降低数据移动, 尽量把数据和计算放在一起。
上图是SQL查询例子, 该SQL的目标是在三表join的基础上算聚集, 并按照聚集列排序取topN。
impala的查询优化器支持代价模型: 利用表和分区的cardinality,每列的distinct值个数等统计数据, impala可估算执行计划代价, 并生成较优的执行计划。 上图左边是frontend查询优化器生成的单机查询计划, 与传统关系数据库不同, 单机查询计划不能直接执行, 必须转换成如图右半部分所示的分布式查询计划。 该分布式查询计划共分成6个segment(图中彩色无边框圆角矩形), 每个segment是可以被单台服务器独立执行的计划子树。
impala支持两种分布式join方式, 表广播和哈希重分布:
表广播方式保持一个表的数据不动, 将另一个表广播到所有相关节点(图中t3);
哈希重分布的原理是根据join字段哈希值重新分布两张表数据(譬如图中t1和t2)。
分布式计划中的聚集函数分拆为两个阶段执行。第一步针对本地数据进行分组聚合(Pre-AGG)以降低数据量, 并进行数据重分步, 第二步, 进一步汇总之前的聚集结果(mergeAgg)计算出最终结果。
与聚集函数类似, topN也是分为两个阶段执行, (1)本地排序取topN,以降低数据量; (2) merge sort得到最终topN结果。
Backend从frontend接收plan segment并执行, 执行性能非常关键,impala采取的查询性能优化措施有向量执行。 一次getNext处理一批记录, 多个操作符可以做pipeline。LLVM编译执行, CPU密集型查询效率提升5倍以上。IO本地化。 利用HDFS short-circuit local read功能,实现本地文件读取Parquet列存,相比其他格式性能最高提升5倍。
2、impala的安装环境准备
需要提前安装好hadoop,hive,这二个框架,并且hive需要在所有的impala安装的节点上面都要有,因为impala需要引用hive的依赖包,hadoop的框架需要支持C程序访问接口,查看下图,如果有该路径下有这么些文件,就证明支持C接口
3、下载impala的所有依赖包
由于impala没有提供tar包供我们进行安装,只提供了rpm包,所以我们在安装impala的时候,需要使用rpm包来进行安装,rpm包只有cloudera公司提供了,所以我们去cloudera公司网站进行下载rpm包即可,但是另外一个问题,impala的rpm包依赖非常多的其他的rpm包,可以一个个的将依赖找出来,也可以将所有的rpm包下载下来,制作成我们本地yum源来进行安装。我们这里就选择制作我们本地的yum源来进行安装,所以首先我们需要下载到所有的rpm包,下载地址如下
http://archive.cloudera.com/cdh5/repo-as-tarball/5.14.0/cdh5.14.0-centos6.tar.gz
下载好了之后,保留下,留作备用。
4、上传压缩包并解压
将我们5个G的压缩文件上传/data02目录下,并进行解压
cd /data02/ tar -zxvf cdh5.14.0-centos6.tar.gz
5、开始安装impala
安装规划
服务名称 |
node01 |
node02 |
node03 |
impala-catalog |
不安装 |
不安装 |
安装 |
impala-state-store |
不安装 |
不安装 |
安装 |
impala-server |
安装 |
安装 |
安装 |
主节点node03执行以下命令进行安装
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
从节点node01与node02安装以下服务
yum install impala-server -y
6、所有节点配置impala
第一步:修改hive-site.xml
node03机器修改hive-site.xml内容如下
hive-site.xml配置
vim /export/servers/hive-1.1.0-cdh5.14.0/conf/hive-site.xml
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://node03.hadoop.com:3306/hive?createDatabaseIfNotExist=true</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>123456</value> </property> <property> <name>hive.cli.print.current.db</name> <value>true</value> </property> <property> <name>hive.cli.print.header</name> <value>true</value> </property> <property> <name>hive.server2.thrift.bind.host</name> <value>node03.hadoop.com</value> </property> <property> <name>hive.metastore.uris</name> <value>thrift://node03.hadoop.com:9083</value> </property> <property> <name>hive.metastore.client.socket.timeout</name> <value>3600</value> </property> </configuration>
第二步:将hive的安装包发送到node02与node01机器上
在node03机器上面执行
cd /export/servers/ scp -r hive-1.1.0-cdh5.14.0/ node02:$PWD scp -r hive-1.1.0-cdh5.14.0/ node01:$PWD
第三步:node03启动hive的metastore服务
启动hive的metastore服务
node03机器启动hive的metastore服务
cd /export/servers/hive-1.1.0-cdh5.14.0 nohup bin/hive --service metastore & nohup bin/hive -- service hiveserver2 &
注意:一定要保证mysql的服务正常启动,否则metastore的服务不能够启动
第四步:所有hadoop节点修改hdfs-site.xml添加以下内容
所有节点创建文件夹
mkdir -p /var/run/hdfs-sockets
修改所有节点的hdfs-site.xml添加以下配置,修改完之后重启hdfs集群生效
vim /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/hdfs-site.xml
<property> <name>dfs.client.read.shortcircuit</name> <value>true</value> </property> <property> <name>dfs.domain.socket.path</name> <value>/var/run/hdfs-sockets/dn</value> </property> <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>
注意:root用户不需要这一步操作了,实际工作当中普通用户需要这一步操作
创建文件夹 /var/run/hadoop-hdfs/
给这个文件夹赋予权限,例如如果我们用的是普通用户,那就直接赋予普通用户的权限
例如:
chown -R hadoop:hadoop /var/run/hdfs-sockets/
因为我这里直接用的root用户,所以不需要赋权限了
第五步:重启hdfs
重启hdfs文件系统
node01服务器上面执行以下命令
cd /export/servers/hadoop-2.6.0-cdh5.14.0/ sbin/stop-dfs.sh sbin/start-dfs.sh
第六步:创建hadoop与hive的配置文件的连接
impala的配置目录为 /etc/impala/conf
这个路径下面需要把core-site.xml,hdfs-site.xml以及hive-site.xml拷贝到这里来,但是我们这里使用软连接的方式会更好
所有节点执行以下命令创建链接到impala配置目录下来
ln -s /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/core-site.xml /etc/impala/conf/core-site.xml ln -s /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/hdfs-site.xml /etc/impala/conf/hdfs-site.xml ln -s /export/servers/hive-1.1.0-cdh5.14.0/conf/hive-site.xml /etc/impala/conf/hive-site.xml
第七步:修改impala的配置文件
所有节点修改impala默认配置
所有节点更改impala默认配置文件以及添加mysql的连接驱动包
vim /etc/default/impala
IMPALA_CATALOG_SERVICE_HOST=node03 IMPALA_STATE_STORE_HOST=node03
所有节点创建mysql的驱动包的软连接
ln -s /export/servers/hive-1.1.0-cdh5.14.0/lib/mysql-connector-java-5.1.38.jar /usr/share/java/mysql-connector-java.jar
所有节点修改bigtop的java路径
修改bigtop的java_home路径
vim /etc/default/bigtop-utils export JAVA_HOME=/export/servers/jdk1.8.0_141
第八步:启动impala服务
启动impala服务
主节点node03启动以下三个服务进程
service impala-state-store start service impala-catalog start service impala-server start
从节点启动node01与node02启动impala-server
service impala-server start
查看impala进程是否存在
ps -ef | grep impala
注意:启动之后所有关于impala的日志默认都在/var/log/impala 这个路径下,node03机器上面应该有三个进程,node02与node01机器上面只有一个进程,如果进程个数不对,去对应目录下查看报错日志
浏览器页面访问:
访问impalad的管理界面
访问statestored的管理界面
7、impala的使用
7.1、impala-shell语法
7.1.1、impala-shell的外部命令参数语法
不需要进入到impala-shell交互命令行当中即可执行的命令参数
impala-shell后面执行的时候可以带很多参数:
-h 查看帮助文档
impala-shell -h
-r 刷新整个元数据,数据量大的时候,比较消耗服务器性能
impala-shell -r
-B 去格式化,查询大量数据可以提高性能
--print_header 去格式化显示列名
--output_delimiter 指定分隔符
-v 查看对应版本
impala-shell -v -V
-f 执行查询文件
--query_file 指定查询文件
cd /export/servers
vim impala-shell.sql
use weblog;
select * from ods_click_pageviews limit 10;
通过-f 参数来执行执行的查询文件
impala-shell -f impala-shell.sql
-i 连接到impalad
--impalad 指定impalad去执行任务
-o 保存执行结果到文件当中去
--output_file 指定输出文件名
impala-shell -f impala-shell.sql -o hello.txt
-p 显示查询计划
impala-shell -f impala-shell.sql -p
-q 不使用impala-shell进行查询
7.1.2、impala-shell的内部命令行参数语法
进入impala-shell命令行之后可以执行的语法
help命令
帮助文档
connect命令
connect hostname 连接到某一台机器上面去执行
refresh 命令
refresh dbname.tablename 增量刷新,刷新某一张表的元数据,主要用于刷新hive当中数据表里面的数据改变的情况
refresh mydb.stu;
invalidate metadata 命令:
invalidate metadata全量刷新,性能消耗较大,主要用于hive当中新建数据库或者数据库表的时候来进行刷新
explain 命令:
用于查看sql语句的执行计划
explain select * from stu;
explain的值可以设置成0,1,2,3等几个值,其中3级别是最高的,可以打印出最全的信息
set explain_level=3;
profile命令:
执行sql语句之后执行,可以打印出更加详细的执行步骤,
主要用于查询结果的查看,集群的调优等
select * from stu; profile;
注意:在hive窗口当中插入的数据或者新建的数据库或者数据库表,在impala当中是不可直接查询到的,需要刷新数据库,在impala-shell当中插入的数据,在impala当中是可以直接查询到的,不需要刷新数据库,其中使用的就是catalog这个服务的功能实现的,catalog是impala1.2版本之后增加的模块功能,主要作用就是同步impala之间的元数据。
7.2、创建数据库
impala-shell进入到impala的交互窗口
7.1.2查看所有数据库
show databases;
7.1.3创建与删除数据库
创建数据库
CREATE DATABASE IF NOT EXISTS mydb1; drop database if exists mydb;
创建数据库表并指定数据库表数据存放hdfs的位置(与hive建表语法类似)
hdfs dfs -mkdir -p /input/impala create external table t3(id int ,name string ,age int ) row forma
CREATE TABLE IF NOT EXISTS mydb1.student (name STRING, age INT, contact INT );
delimited fields terminated by '\t' location '/input/impala/external';
7.3、 创建数据库表
创建student表
CREATE TABLE IF NOT EXISTS mydb1.student (name STRING, age INT, contact INT );
创建employ表
create table employee (Id INT, name STRING, age INT,address STRING, salary BIGINT);
7.3.1、 数据库表中插入数据
insert into employee (ID,NAME,AGE,ADDRESS,SALARY)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 );
执行覆盖之后,表中只剩下了这一条数据了
另外一种建表语句
create table customer as select * from employee;
7.3.2、 数据的查询
select * from employee; select name,age from employee;
7.3.3、 删除表
DROP table mydb1.employee;
7.3.4、 清空表数据
truncate employee;
7.3.5、 创建视图
CREATE VIEW IF NOT EXISTS employee_view AS select name, age from employee;
7.3.6、 查看视图数据
select * from employee_view;
7.4、 order by语句
基础语法
select * from table_name ORDER BY col_name [ASC|DESC] [NULLS FIRST|NULLS LAST] Select * from employee ORDER BY id asc;
7.5、group by 语句
Select name, sum(salary) from employee Group BY name;
7.6、 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;
7.7、 limit语句
select * from employee order by id limit 4;
8、impala当中的数据表导入几种方式
第一种方式,通过load hdfs的数据到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
第四种:
insert into select
9、impala的java开发
在实际工作当中,因为impala的查询比较快,所以可能有会使用到impala来做数据库查询的情况,我们可以通过java代码来进行操作impala的查询
第一步:导入jar包
<repositories> <repository> <id>cloudera</id> <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url> </repository> <repository> <id>central</id> <url>http://repo1.maven.org/maven2/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> <dependencies> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.6.0-cdh5.14.0</version> </dependency> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-common</artifactId> <version>1.1.0-cdh5.14.0</version> </dependency> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-metastore</artifactId> <version>1.1.0-cdh5.14.0</version> </dependency> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-service</artifactId> <version>1.1.0-cdh5.14.0</version> </dependency> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-jdbc</artifactId> <version>1.1.0-cdh5.14.0</version> </dependency> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-exec</artifactId> <version>1.1.0-cdh5.14.0</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.thrift/libfb303 --> <dependency> <groupId>org.apache.thrift</groupId> <artifactId>libfb303</artifactId> <version>0.9.0</version> <type>pom</type> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.thrift/libthrift --> <dependency> <groupId>org.apache.thrift</groupId> <artifactId>libthrift</artifactId> <version>0.9.0</version> <type>pom</type> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient --> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.2.5</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpcore --> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpcore</artifactId> <version>4.2.5</version> </dependency> </dependencies>
第二步:impala的java代码查询开发
public class ImpalaJdbc {
public static void main(String[] args) throws Exception {
//定义连接驱动类,以及连接url和执行的sql语句
String driver = "org.apache.hive.jdbc.HiveDriver";
String driverUrl = "jdbc:hive2://192.168.52.120:21050/mydb1;auth=noSasl";
String sql = "select * from student"; //通过反射加载数据库连接驱动
Class.forName(driver);
Connection connection = DriverManager.getConnection(driverUrl);
PreparedStatement preparedStatement = connection.prepareStatement(sql);
ResultSet resultSet = preparedStatement.executeQuery();
//通过查询,得到数据一共有多少列
int col = resultSet.getMetaData().getColumnCount();
//遍历结果集
while (resultSet.next()){
for(int i=1;i<=col;i++){
System.out.print(resultSet.getString(i)+"\t");
}
System.out.print("\n");
}
preparedStatement.close();
connection.close();
}
}
Impala的安装和使用的更多相关文章
- 第一章 impala的安装
目录 第一章 impala的安装 1.impala的介绍 imala基本介绍 impala与hive的关系 impala的优点 impala的缺点: impala的架构以及查询计划 2.impala的 ...
- python连接impala(安装impyla)
相关环境如下: Python3.4 Win7 64位 参照官网https://github.com/cloudera/impyla中的安装步骤执行: 1.pip install six 2.pip i ...
- impala记录-安装kudu和impala
1.配置/etc/yum.repos.d clouder-kudu.repo [cloudera-kudu]# Packages for Cloudera's Distribution for kud ...
- cloudera impala编译 安装 配置 启动
无论是采用GDB调试impala或者尝试修改impala源码,前提都是需要本地环境编译impala,这篇文章详细的分享一下impala编译方法以及编译过程遇到的棘手的问题: 前言: impala官方的 ...
- Impala ODBC 安装笔记
Impala在线文档介绍了 Impala ODBC接口安装和配置 http://www.cloudera.com/content/cloudera-content/cloudera-docs/CDH5 ...
- Impala的安装(含使用CM安装 和 手动安装)(图文详解)
Impala有两种安装方式: 1)使用CM安装Impala 2)手动安装Impala 注意:Impala不支持在Debian/Ubuntu, SuSE, RHEL/CentOS 6.5系统中安装. 基 ...
- 第1节 IMPALA:7、impala的安装以及配置过程
6.制作本地yum源 镜像源是centos当中下载相关软件的地址,我们可以通过制作我们自己的镜像源指定我们去哪里下载impala的rpm包,这里我们使用httpd这个软件来作为服务端,启动httpd的 ...
- Cloudera impala简单介绍及安装具体解释
一.Impala简单介绍 Cloudera Impala对你存储在Apache Hadoop在HDFS,HBase的数据提供直接查询互动的SQL.除了像Hive使用同样的统一存储平台,Impala也使 ...
- 如何安装使用Impala
一.Impala简介 Cloudera Impala对你存储在Apache Hadoop在HDFS,HBase的数据提供直接查询互动的SQL.除了像Hive使用相同的统一存储平台,Impala也使 ...
随机推荐
- 简单记录下Jmeter通过CSV保存测试数据,测试用例,及将测试结果导出到Excel里
1.CSV保存测试数据,并上传到CSV Data Set Config,设置相关属性 2.CSV保存测试用例,并上传到CSV Data Set Config,设置相关属性 3.设置一个http请求,设 ...
- loj2573[TJOI2018]数字计算
题意:操作1:x=x*m,输出x%mod.2.x/=map[m].m即第m次操作,保证该次操作为1操作,并且每个操作最多只会被删一次.q<=1e5. 线段树维护操作信息的乘积,删除把对应位置的权 ...
- rest_framework框架实现之(认证)
一认证 我们可以想想,我们要访问一个页面,需不需要对其进行认证,希望进入页面的时候看到哪些内容,一般是根据用户的不同而不同 首先,我们先设计一个表,如何知道对方通过了验证,我们可以考虑给其加一个tok ...
- Delphi 左键代替右键
Delphi 左键代替右键: var Pt: TPoint; begin GetCursorPos(Pt); PopupMenu1.Popup(Pt.X, Pt.Y); end;
- 存储emoji表情,修改字符集为utf8mb4
SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%'; SET ch ...
- Shiro学习(15)单点登录
Shiro 1.2开始提供了Jasig CAS单点登录的支持,单点登录主要用于多系统集成,即在多个系统中,用户只需要到一个中央服务器登录一次即可访问这些系统中的任何一个,无须多次登录.此处我们使用Ja ...
- 思维——cf1178E
一开始少看了条件:相邻两个字符不相等,字符集只有abc 那么我们取开头结尾各两个字符,一定有两个是相等的 #include<bits/stdc++.h> using namespace s ...
- 基础(一):SCSI硬盘与IDE硬盘有什么区别
硬盘接口是硬盘与主机系统间的连接部件,作用是在硬盘缓存和主机内存之间传输数据.不同的硬盘接口决定着硬盘与计算机之间的连接速度,在整个系统中,硬盘接口的优劣直接影响着程序运行快慢和系统性能好坏.从整体的 ...
- centos修改、保存文件的详细步骤
[一]修改文件 如果是使用普通用户登录的,需要先切换到管理员用户,打开终端,输入:su,接着按提示输入密码即可:然后使用命令进入需要修改文件的所在目录,常用的几个命令如下: ① cd + 目录名 ② ...
- spring boot基于DRUID数据源密码加密及数据源监控实现
前言 随着需求和技术的日益革新,spring boot框架是越来越流行,她也越来越多地出现在我们的项目中,当然最主要的原因还是因为spring boot构建项目实在是太爽了,构建方便,开发简单,而且效 ...