失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 大数据开发基础入门与项目实战(三)Hadoop核心及生态圈技术栈之5.即席查询Impala介绍

大数据开发基础入门与项目实战(三)Hadoop核心及生态圈技术栈之5.即席查询Impala介绍

时间:2018-11-03 11:40:23

相关推荐

大数据开发基础入门与项目实战(三)Hadoop核心及生态圈技术栈之5.即席查询Impala介绍

文章目录

前言1.Impala概述(1)Impala的概念和优势(2)Impala的缺点及适用场景 2.Impala的安装与入门(1)准备工作(2)制作本地yum源(3)安装Impala(4)Impala启动和完善(5)入门案例 3.Impala架构原理(1)Impala组件(2)Impala单机执行计划和分布式执行计划 总结

前言

本文主要介绍了Impala的使用,Impala是一款开源的数据交互式查询工具,可以实现k快速查询。

1.Impala概述

(1)Impala的概念和优势

Impala是Cloudera提供的一款开源的针对HDFS和HBASE中的PB级别数据进行交互式实时查询(Impala速度快),Impala是参照⾕谷歌的新三篇论⽂(分别是Caffeine、Dremel和Pregel)中的Dremel实现而来,其中旧三篇论文分别是(BigTable,GFS,MapReduce)分别对应HBase和已经学过的HDFS以及MapReduce。

Impala最⼤的亮点和特点就是快速,其文翻译是⾼角羚羊。

一个大数据从业者面对的大数据相关技术发展的过程:

技术发展以及更新换代的原因就是老的技术架构遇到新的问题,有些问题可以通过不断优化代码优化设计得以解决,有一些问题就不再是简简单单修改代码就能解决,需要从框架本身架构设计上改变,以至于需要推到重建。

在大数据领域主要解决的问题是数据的存储和分析,但是其实一个完整的⼤大数据分析任务如果细分会有非常多具体的场景,非常多的环节;并没有一个类似Java Web的Spring框架实现大一统的局面。

按照阶段划分一个大数据开发任务,会有:

数据采集:日志文件,关系型数据库中

数据清洗:数据格式整理,脏数据过滤等

数据预处理:为了后续分析所做的工作

数据分析:离线处理(T+1分析)、实时处理(数据到来即分析)

数据可视化

机器学习和深度学习等

面对如此众多的阶段再加上大数据天生的大数据量问题没有任何一个框架可以完美cover以上每个阶段。所以大数据领域有非常多框架,每个框架都有最适合自己的具体场景,比如HDFS负责大数据量存储,MapReduce(Hive)负责大数据量的分析计算。

之前的Hive以及MR适合离线批处理,但是对交互式查询的场景无能为力(要求快速响应),所以为了解决查询速度的问题,Cloudera公司依据Google的Dremel开发了Impala,Impala抛弃了MapReduce,使用了类似于传统的MPP数据库技术,大大提高了查询的速度。

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

简单来说,MPP是将任务并行的分散到多个服务器和节点上,在每个节点上计算完成后,将各自部分的结果汇总在一起得到最终的结果对于MPP架构的软件来说聚合操作比如计算某张表的总条数,则先进行局部聚合(每个节点并行计算),然后把局部汇总结果进行全局聚合(与Hadoop相似)。

MR执行慢的原因主要如下:

shuffle阶段,IO多;

shuffle阶段默认对key分区排序。

相比于Hive,Impala的优势:

避免数据落磁盘

处理进程无需每次启动

lmpala默认不会对数据排序

.

Impala的技术优势:

Impala没有采取MapReduce作为计算引擎,MR是非常好的分布式并行计算框架,但MR引擎更多的是面向批处理模式,而不是面向交互式的SQL执行。与Hive相比:Impala把整个查询任务转为一棵执行计划树,而不是一连串的MR任务,在分发执行计划后,Impala使用拉取的方式获取上个阶段的执行结果,把结果数据、按执行树流式传递汇集,减少的了把中间结果写入磁盘的步骤,再

从磁盘读取数据的开销。Impala使用服务的方式避免 每次执行查询都需要启动的开销,即相比Hive没了MR启动时间。

使用LLVM(C++编写的编译器)产生运行代码,针对特定查询生成特定代码。

优秀的IO调度,Impala支持直接数据块读取和本地代码计算。

Impala支持多种存储格式,例如列式存储对数据分析提升很大,选择适合的数据存储格式可以得到最好的性能。

尽可能使用内存,中间结果不写磁盘,及时通过网络以stream的方式传递。

Impala与Hive对比分析:

查询过程

    - Hive:在Hive中,每个查询都有一个“冷启动”的常见问题。(MapReduce每次都要启动关闭,即申请资源、释放资源)

    

    - Impala:Impala避免了任何可能的启动开销,这是一种本地查询语言。 因为要始终处理查询,则

    Impala守护程序进程总是在集群启动之后就准备就绪。守护进程在集群启动之后可以接收查询任务并执⾏行行查询任务。

    

中间结果

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

    

    - Impala:在执行程序之间使用流的方式传输中间结果,避免数据落盘。尽可能使用内存避免磁盘

    开销

    

交互查询

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

    

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

    

计算引擎

    - Hive:是基于批处理的Hadoop MapReduce

    

    - Impala:更像是MPP数据库

    

容错

    - Hive:Hive是容错的(通过MR&Yarn实现)

    

    - Impala:Impala没有容错,由于良好的查询性能,Impala遇到错误会重新执行一次查询

查询速度

    Impala比Hive快3-90倍。

可以总结:

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

其速度快的原因是避免了MR引擎的弊端,采⽤了MPP数据库技术。

(2)Impala的缺点及适用场景

Impala的缺点:

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

资源不能通过YARN统一资源管理调度,所以Hadoop集群无法实现Impala、Spark、Hive等组件的动态资源共享。

Impala不能完全取代Hive,Impala可以直接处理Hive表中的数据。

适用场景:

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

Impala:实时数据分析,与Hive配合使用,对Hive的结果数据集进行实时分析。

2.Impala的安装与入门

(1)准备工作

准备工作包括:

(1)安装Hadoop和Hive

Impala的安装需要提前装好Hadoop和Hive两个框架:

依赖Hadoop主要是Impala需要用到HDFS,Impala数据存储在HDFS;

依赖Hive是因为Impala直接使用Hive元数据来管理元数据;

需要保证所有安装Impala的节点上面都要有Hive,因为Impala需要引用Hive的依赖包,因此需要确保各个节点都已经安装了Hive,如果没有完全安装,需要分发并配置环境变量;

需要保证Hadoop框架支持C程序访问接口,查看如下:

[root@node01 ~]$ cd $HADOOP_HOME/lib[root@node01 lib]$ cd native/[root@node01 native]$ ll总用量 5020drwxr-xr-x 2 root root94 11月 13 examples-rw-r--r-- 1 root root 1440164 11月 13 libhadoop.a-rw-r--r-- 1 root root 1632592 11月 13 libhadooppipes.alrwxrwxrwx 1 root root18 11月 13 libhadoop.so -> libhadoop.so.1.0.0-rwxr-xr-x 1 root root 842132 11月 13 libhadoop.so.1.0.0-rw-r--r-- 1 root root 476106 11月 13 libhadooputils.a-rw-r--r-- 1 root root 454188 11月 13 libhdfs.alrwxrwxrwx 1 root root16 11月 13 libhdfs.so -> libhdfs.so.0.0.0-rwxr-xr-x 1 root root 284815 11月 13 libhdfs.so.0.0.0

如果Hadoop安装路径下的lib/native路径下有.so文件,就证明支持C接口;

显然,是支持C接口的。

(2)准备Impala的所有依赖包

Cloudera公司对于Impala的安装只提供了rpm包没有提供tar包;所以我们选择使用Cloudera的rpm包进行Impala的安装,但是另外一个问题,Impala的rpm包依赖非常多的其他的rpm包,可以自己管理rpm包的依赖关系,即逐个找出依赖,但是这种方式浪费时间、非常麻烦。

Linux系统中提供了Yum来解决依赖关系,类似于Java工程中的包管理工具Maven,Maven可以自动搜寻指定Jar所需的其它依赖并自动下载。Yum同理,可以非常方便地进行rpm包的安装⽆无需关系当前rpm所需的依赖。但是默认Yum源是没有Impala的rpm安装包,所以需要自己准备好所有的Impala安装所需的rpm包,制作Yum本地源,配置Yum命令去到我们准备的Yun源中下载Impala的rpm包进行安装。

(2)制作本地yum源

Yum的默认源方式如下:

在节点上使用yum命令安装软件时,下载关联依赖都是从默认源处理下载;

如果使用rpm方式安装lmpala,Yum默认源中没有lmpala的rpm包,所以需要提前下载lmpala安装所需的所有rpm包,并制作成为本地Yum源供集群所有节点使用。

本地Yum源⽅方式如下:

通过在每个节点修改/etc/yum.repos.d配置指定访问的Yum源为节点node01,同时node01节点配置HTTPD服务,让其他节点访问。

具体操作步骤如下:

(1)node01节点安装Httpd服务器器

使用安装Httpd的步骤如下:

# yum方式安装httpd服务器yum -y install httpd# 启动httpd服务器systemctl start httpd

启动之后需要验证httpd工作是否正常,可以在本地浏览器访问,因为默认端口是80、可以省略,所以直接使用主机名即可,即访问http://node01/,显示以下页面,则说明安装成功:

(2)新建一个测试页面

httpd默认存放页面路径是/var/www/html/,在该路径下新建一个页面test.html用于测试,如下:

<html><div style="font-size:100px">this is a new page!!</div></html>

然后访问http://node01/test.html,如下:

可以看到,访问到了页面。

所以可以将Impala所需的RPM包也放到该路径下,后面其他节点就可以通过HTTP请求访问到。

(3)下载Impala安装所需rpm包

Impala所需安装包需要到Cloudera提供地址下载,地址为/cdh5/repo-as-tarball/5.7.6/cdh5.7.6-centos7.tar.gz,现在下载需要注册和输入用户名和密码才能下载。

可以在本地下载再上传到节点node01,上传到node01节点的/opt/packages目录下,再执行tar -xzf cdh5.7.6-centos7.tar.gz -C ../software/进行解压。

需要注意,cdh5.7.6-centos7.tar.gz包含了Cloudera所提供的几乎所有rpm包,整个文件比较大,有3.8G。下载和上传时选择一个磁盘空间够的节点,后续还要把压缩包解压,所以磁盘空间要剩余10G以上。

解压后查看:

[root@node01 packages]$ cd ../software/[root@node01 software]$ cd cdh/[root@node01 cdh]$ tree -L 4.├── 5 -> 5.7.6├── 5.7 -> 5.7.6└── 5.7.6├── mirrors├── repodata│ ├── filelists.xml.gz│ ├── filelists.xml.gz.asc│ ├── other.xml.gz│ ├── other.xml.gz.asc│ ├── primary.xml.gz│ ├── primary.xml.gz.asc│ ├── repomd.xml│ └── repomd.xml.asc├── RPMS│ ├── noarch│ │ ├── avro-doc-1.7.6+cdh5.7.6+119-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── avro-libs-1.7.6+cdh5.7.6+119-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── avro-tools-1.7.6+cdh5.7.6+119-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── bigtop-tomcat-0.7.0+cdh5.7.6+0-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── bigtop-utils-0.7.0+cdh5.7.6+0-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── crunch-0.11.0+cdh5.7.6+97-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── crunch-doc-0.11.0+cdh5.7.6+97-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── flume-ng-1.6.0+cdh5.7.6+61-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── flume-ng-agent-1.6.0+cdh5.7.6+61-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── flume-ng-doc-1.6.0+cdh5.7.6+61-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── hbase-solr-1.5+cdh5.7.6+70-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── hbase-solr-doc-1.5+cdh5.7.6+70-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── hbase-solr-indexer-1.5+cdh5.7.6+70-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── hive-1.1.0+cdh5.7.6+685-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── hive-hbase-1.1.0+cdh5.7.6+685-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── hive-hcatalog-1.1.0+cdh5.7.6+685-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── hive-jdbc-1.1.0+cdh5.7.6+685-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── hive-metastore-1.1.0+cdh5.7.6+685-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── hive-server-1.1.0+cdh5.7.6+685-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── hive-server2-1.1.0+cdh5.7.6+685-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── hive-webhcat-1.1.0+cdh5.7.6+685-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── hive-webhcat-server-1.1.0+cdh5.7.6+685-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── kite-1.0.0+cdh5.7.6+140-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── llama-1.0.0+cdh5.7.6+0-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── llama-doc-1.0.0+cdh5.7.6+0-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── llama-master-1.0.0+cdh5.7.6+0-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── mahout-0.9+cdh5.7.6+33-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── mahout-doc-0.9+cdh5.7.6+33-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── oozie-4.1.0+cdh5.7.6+306-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── oozie-client-4.1.0+cdh5.7.6+306-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── parquet-1.5.0+cdh5.7.6+180-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── parquet-format-2.1.0+cdh5.7.6+18-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── pig-0.12.0+cdh5.7.6+92-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── pig-udf-datafu-1.1.0+cdh5.7.6+24-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── search-1.0.0+cdh5.7.6+0-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── sentry-1.5.1+cdh5.7.6+214-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── sentry-hdfs-plugin-1.5.1+cdh5.7.6+214-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── sentry-store-1.5.1+cdh5.7.6+214-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── solr-4.10.3+cdh5.7.6+430-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── solr-crunch-1.0.0+cdh5.7.6+0-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── solr-doc-4.10.3+cdh5.7.6+430-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── solr-mapreduce-1.0.0+cdh5.7.6+0-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── solr-server-4.10.3+cdh5.7.6+430-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── spark-core-1.6.0+cdh5.7.6+240-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── spark-history-server-1.6.0+cdh5.7.6+240-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── spark-master-1.6.0+cdh5.7.6+240-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── spark-python-1.6.0+cdh5.7.6+240-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── spark-worker-1.6.0+cdh5.7.6+240-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── sqoop-1.4.6+cdh5.7.6+87-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── sqoop2-1.99.5+cdh5.7.6+44-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── sqoop2-client-1.99.5+cdh5.7.6+44-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── sqoop2-server-1.99.5+cdh5.7.6+44-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ ├── sqoop-metastore-1.4.6+cdh5.7.6+87-1.cdh5.7.6.p0.7.el7.noarch.rpm│ │ └── whirr-0.9.0+cdh5.7.6+23-1.cdh5.7.6.p0.7.el7.noarch.rpm│ └── x86_64│ ├── bigtop-jsvc-0.6.0+cdh5.7.6+818-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── bigtop-jsvc-debuginfo-0.6.0+cdh5.7.6+818-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hadoop-0.20-conf-pseudo-2.6.0+cdh5.7.6+1551-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hadoop-0.20-mapreduce-2.6.0+cdh5.7.6+1551-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hadoop-0.20-mapreduce-jobtracker-2.6.0+cdh5.7.6+1551-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hadoop-0.20-mapreduce-jobtrackerha-2.6.0+cdh5.7.6+1551-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hadoop-0.20-mapreduce-tasktracker-2.6.0+cdh5.7.6+1551-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hadoop-0.20-mapreduce-zkfc-2.6.0+cdh5.7.6+1551-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hadoop-2.6.0+cdh5.7.6+1551-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hadoop-client-2.6.0+cdh5.7.6+1551-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hadoop-conf-pseudo-2.6.0+cdh5.7.6+1551-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hadoop-debuginfo-2.6.0+cdh5.7.6+1551-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hadoop-doc-2.6.0+cdh5.7.6+1551-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hadoop-hdfs-2.6.0+cdh5.7.6+1551-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hadoop-hdfs-datanode-2.6.0+cdh5.7.6+1551-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hadoop-hdfs-fuse-2.6.0+cdh5.7.6+1551-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hadoop-hdfs-journalnode-2.6.0+cdh5.7.6+1551-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hadoop-hdfs-namenode-2.6.0+cdh5.7.6+1551-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hadoop-hdfs-nfs3-2.6.0+cdh5.7.6+1551-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hadoop-hdfs-secondarynamenode-2.6.0+cdh5.7.6+1551-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hadoop-hdfs-zkfc-2.6.0+cdh5.7.6+1551-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hadoop-httpfs-2.6.0+cdh5.7.6+1551-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hadoop-kms-2.6.0+cdh5.7.6+1551-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hadoop-kms-server-2.6.0+cdh5.7.6+1551-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hadoop-libhdfs-2.6.0+cdh5.7.6+1551-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hadoop-libhdfs-devel-2.6.0+cdh5.7.6+1551-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hadoop-mapreduce-2.6.0+cdh5.7.6+1551-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hadoop-mapreduce-historyserver-2.6.0+cdh5.7.6+1551-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hadoop-yarn-2.6.0+cdh5.7.6+1551-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hadoop-yarn-nodemanager-2.6.0+cdh5.7.6+1551-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hadoop-yarn-proxyserver-2.6.0+cdh5.7.6+1551-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hadoop-yarn-resourcemanager-2.6.0+cdh5.7.6+1551-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hbase-1.2.0+cdh5.7.6+208-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hbase-doc-1.2.0+cdh5.7.6+208-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hbase-master-1.2.0+cdh5.7.6+208-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hbase-regionserver-1.2.0+cdh5.7.6+208-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hbase-rest-1.2.0+cdh5.7.6+208-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hbase-thrift-1.2.0+cdh5.7.6+208-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hue-3.9.0+cdh5.7.6+1881-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hue-beeswax-3.9.0+cdh5.7.6+1881-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hue-common-3.9.0+cdh5.7.6+1881-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hue-doc-3.9.0+cdh5.7.6+1881-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hue-hbase-3.9.0+cdh5.7.6+1881-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hue-impala-3.9.0+cdh5.7.6+1881-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hue-pig-3.9.0+cdh5.7.6+1881-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hue-plugins-3.9.0+cdh5.7.6+1881-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hue-rdbms-3.9.0+cdh5.7.6+1881-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hue-search-3.9.0+cdh5.7.6+1881-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hue-security-3.9.0+cdh5.7.6+1881-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hue-server-3.9.0+cdh5.7.6+1881-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hue-spark-3.9.0+cdh5.7.6+1881-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hue-sqoop-3.9.0+cdh5.7.6+1881-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── hue-zookeeper-3.9.0+cdh5.7.6+1881-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── impala-2.5.0+cdh5.7.6+0-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── impala-catalog-2.5.0+cdh5.7.6+0-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── impala-debuginfo-2.5.0+cdh5.7.6+0-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── impala-server-2.5.0+cdh5.7.6+0-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── impala-shell-2.5.0+cdh5.7.6+0-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── impala-state-store-2.5.0+cdh5.7.6+0-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── impala-udf-devel-2.5.0+cdh5.7.6+0-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── zookeeper-3.4.5+cdh5.7.6+98-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── zookeeper-debuginfo-3.4.5+cdh5.7.6+98-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ ├── zookeeper-native-3.4.5+cdh5.7.6+98-1.cdh5.7.6.p0.7.el7.x86_64.rpm│ └── zookeeper-server-3.4.5+cdh5.7.6+98-1.cdh5.7.6.p0.7.el7.x86_64.rpm└── SRPMS├── avro-libs-1.7.6+cdh5.7.6+119-1.cdh5.7.6.p0.7.src.rpm├── bigtop-jsvc-0.6.0+cdh5.7.6+818-1.cdh5.7.6.p0.7.src.rpm├── bigtop-tomcat-0.7.0+cdh5.7.6+0-1.cdh5.7.6.p0.7.src.rpm├── bigtop-utils-0.7.0+cdh5.7.6+0-1.cdh5.7.6.p0.7.src.rpm├── crunch-0.11.0+cdh5.7.6+97-1.cdh5.7.6.p0.7.src.rpm├── flume-ng-1.6.0+cdh5.7.6+61-1.cdh5.7.6.p0.7.src.rpm├── hadoop-2.6.0+cdh5.7.6+1551-1.cdh5.7.6.p0.7.src.rpm├── hbase-1.2.0+cdh5.7.6+208-1.cdh5.7.6.p0.7.src.rpm├── hbase-solr-1.5+cdh5.7.6+70-1.cdh5.7.6.p0.7.src.rpm├── hive-1.1.0+cdh5.7.6+685-1.cdh5.7.6.p0.7.src.rpm├── hue-3.9.0+cdh5.7.6+1881-1.cdh5.7.6.p0.7.src.rpm├── impala-2.5.0+cdh5.7.6+0-1.cdh5.7.6.p0.7.src.rpm├── kite-1.0.0+cdh5.7.6+140-1.cdh5.7.6.p0.7.src.rpm├── llama-1.0.0+cdh5.7.6+0-1.cdh5.7.6.p0.7.src.rpm├── mahout-0.9+cdh5.7.6+33-1.cdh5.7.6.p0.7.src.rpm├── oozie-4.1.0+cdh5.7.6+306-1.cdh5.7.6.p0.7.src.rpm├── parquet-1.5.0+cdh5.7.6+180-1.cdh5.7.6.p0.7.src.rpm├── parquet-format-2.1.0+cdh5.7.6+18-1.cdh5.7.6.p0.7.src.rpm├── pig-0.12.0+cdh5.7.6+92-1.cdh5.7.6.p0.7.src.rpm├── pig-udf-datafu-1.1.0+cdh5.7.6+24-1.cdh5.7.6.p0.7.src.rpm├── search-1.0.0+cdh5.7.6+0-1.cdh5.7.6.p0.7.src.rpm├── sentry-1.5.1+cdh5.7.6+214-1.cdh5.7.6.p0.7.src.rpm├── solr-4.10.3+cdh5.7.6+430-1.cdh5.7.6.p0.7.src.rpm├── spark-core-1.6.0+cdh5.7.6+240-1.cdh5.7.6.p0.7.src.rpm├── sqoop-1.4.6+cdh5.7.6+87-1.cdh5.7.6.p0.7.src.rpm├── sqoop2-1.99.5+cdh5.7.6+44-1.cdh5.7.6.p0.7.src.rpm├── whirr-0.9.0+cdh5.7.6+23-1.cdh5.7.6.p0.7.src.rpm└── zookeeper-3.4.5+cdh5.7.6+98-1.cdh5.7.6.p0.7.src.rpm8 directories, 155 files[root@node01 cdh]$

可以看到,cdh目录下的5.7.6/RPMS/x86_64/目录下包含了很多Impala所需要的依赖包。

(4)使用Httpd盛放依赖包

可以直接创建软链接到/var/www/html目录下,如下:

[root@node01 html]$ ln -s /opt/software/cdh/5.7.6/ /var/www/html/cdh57[root@node01 html]$ ll -ht总用量 4.0Klrwxrwxrwx 1 root root 24 10月 9 09:06 cdh57 -> /opt/software/cdh/5.7.6/-rw-r--r-- 1 root root 90 10月 9 08:32 test.html

此时再访问http://node01/cdh57,如下:

可以看到,此时已经能够访问到RPM资源。

如果提示403 forbidden,需要vim /etc/selinux/config,将SELINUX=enforcing改为SELINUX=disabled,修改之后还要重启机器,再启动相关服务。

(5)修改Yum源配置文件

Yum源的配置文件位于/etc/yum.repos.d目录下,已经有一些默认的和之前配置过的源,如下:

[root@node01 yum.repos.d]$ ll总用量 44-rw-r--r--. 1 root root 1664 11月 23 CentOS-Base.repo-rw-r--r--. 1 root root 1309 11月 23 CentOS-CR.repo-rw-r--r--. 1 root root 649 11月 23 CentOS-Debuginfo.repo-rw-r--r--. 1 root root 314 11月 23 CentOS-fasttrack.repo-rw-r--r--. 1 root root 630 11月 23 CentOS-Media.repo-rw-r--r--. 1 root root 1331 11月 23 CentOS-Sources.repo-rw-r--r--. 1 root root 5701 11月 23 CentOS-Vault.repo-rw-r--r--. 1 root root 2076 8月 21 08:46 mysql-community.repo-rw-r--r--. 1 root root 2076 8月 21 08:09 mysql-community.repo.rpmsave-rw-r--r--. 1 root root 2108 4月 25 mysql-community-source.repo

需要创建一个新的.repo文件,vim local.repo,内容如下:

[local]name=localbaseurl=http://node01/cdh57/gpgcheck=0enabled=1

退出并保存。

其中,各参数的含义如下:

(6)分发local.repo文件到其他节点

执行rsync-script local.repo将文件发送到其他节点,以便其他节点使用该yum源。

(3)安装Impala

Impala的主要角色(进程)如下:

集群规划如下:

具体安装步骤如下:

(1)node03节点:

执行以下命令安装:

yum -y install impalayum -y install impala-serveryum -y install impala-state-storeyum -y install impala-catalogyum -y install impala-shell

(2)node01和node02节点:

执行以下命令安装:

yum -y install impala-serveryum -y install impala-shell

然后再配置Impala:

(1)修改hive-site.xml

在node03节点编辑Hive安装目录下的conf目录下的hive-site.xml,在configuration标签下添加内容如下:

<!-- 指定metastore地址 --><property><name>hive.metastore.uris</name><value>thrift://node01:9083,thrift://node03:9083</value></property><!-- 超时时间 --><property><name>hive.metastore.client.socket.timeout</name><value>3600</value></property>

退出并保存。

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

执行rsync-script hive-site.xml将修改后的配置文件分发到其他节点。

执行后再其他两个节点验证是否已经同步。

(3)node03节点启动metastore和hiveserver2服务

在node03节点上启动服务,命令分别为

nohup hive --service metastore &nohup hive --service hiveserver2 &

node01节点也执行nohup hive --service metastore &启动metastore。

还需要配置HDFS集群的短路路读取:

短路读取就是Client与DataNode属于同一节点,无需再经过网络传输数据,直接本地读取。但是,当客户端向DataNode请求读取文件时,DataNode就会从磁盘读取该文件并通过TCP Socket将数据发送到客户端。所谓“短路”是指Client客户端直接读取文件。很明显,这种情况只在客户端与数据放在同一地点(同一节点)时才有可能发生。短路读对于许多应用程序会带来重大的性能提升。

要配置短路本地读,需要验证本机Hadoop是否有libhadoop.so,前面已经验证过有该文件。

配置步骤如下:

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

所有节点创建目录,用于作为本地读取的中转站,先执行mkdir -p /var/lib/hadoop-hdfs命令,再改变所属用户chown root /var/lib/hadoop-hdfs

(2)修改hdfs-site.xml

修改Hadoop安装目录下的etc/hadoop目录下的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>

保存后分发到其他节点rsync-script hdfs-site.xml

然后需要重新启动HDFS和Yarn。

最后进行Impala的具体配置:

(1)引用HDFS和Hive配置

使用Yum方式安装Impala后,默认的Impala配置文件目录为/etc/impala/conf,Impala的使用要依赖Hadoop、Hive框架,所以需要把HDFS、Hive的配置文件告知Impala。

三个节点执行以下命令把HDFS和Hive的配置文件软链接到/etc/impala/conf下

ln -s /opt/software/hadoop-2.9.2/etc/hadoop/core-site.xml /etc/impala/conf/ln -s /opt/software/hadoop-2.9.2/etc/hadoop/hdfs-site.xml /etc/impala/conf/ln -s /opt/software/hive-2.3.7/conf/hive-site.xml /etc/impala/conf/

最后进行验证,以node01节点为例如下:

[root@node01 ~]$ cd /etc/impala/conf[root@node01 conf]$ ll -ht总用量 0lrwxrwxrwx 1 root root 43 10月 9 16:52 hive-site.xml -> /opt/software/hive-2.3.7/conf/hive-site.xmllrwxrwxrwx 1 root root 51 10月 9 16:52 hdfs-site.xml -> /opt/software/hadoop-2.9.2/etc/hadoop/hdfs-site.xmllrwxrwxrwx 1 root root 51 10月 9 16:52 core-site.xml -> /opt/software/hadoop-2.9.2/etc/hadoop/core-site.xml

(2)Impala自身配置

node01节点更改Impala默认配置文件,vim /etc/default/impala,修改其中的IMPALA_CATALOG_SERVICE_HOST和IMPALA_STATE_STORE_HOST参数,如下:

IMPALA_CATALOG_SERVICE_HOST=node03IMPALA_STATE_STORE_HOST=node03

然后将impala文件分发到其他节点rsync-script /etc/default/impala

同时从该配置文件中,可以看到MYSQL_CONNECTOR_JAR参数的默认值是/usr/share/java/mysql-connector-java.jar,可以修改这个参数值为自定义的MySQL Jar包路径,也可以选择拷贝Jar包到默认的路径下或创建软链接,这里选择后者,在所有节点执行以下命令:

mkdir -p /usr/share/javaln -s /opt/software/hive-2.3.7/lib/mysql-connector-java-5.1.46.jar /usr/share/java/mysql-connector-java.jar

(3)修改bigtop的JAVA_HOME路路径

Apache Bigtop是一个针对基础设施工程师和数据科学家的开源项目,旨在全面打包、测试和配置领先的开源⼤大数据组件/项目。Impala项目中也用到了此软件。

编辑bigtop的配置文件,vim /etc/default/bigtop-utils,指定JAVA_HOME路径,如下:

# export JAVA_HOMEexport JAVA_HOME=/opt/software/java/jdk1.8.0_231/

保存退出后再将bigtop-utils文件分发到其他节点rsync-script /etc/default/bigtop-utils

(4)Impala启动和完善

先启动Impala:

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

如果在启动impala-state-store和impala-catalog时遇到报错Failed to start impala-state-store.service: Unit not found.Failed to start impala-catalog.service: Unit not found.,可以参考

启动之后,可以通过ps -ef | grep impala命令来查看这些进程是否在各个节点都启动了。

也可以通过http://node03:25000/来访问Impalad管理界面、http://node03:25010/访问Statestore管理界面,如下:

除此之外,还可以查看日志,启动之后所有关于Impala的日志默认都在/var/log/impala路径下,如果启动和执行过程中出现了问题,也可以查看日志。

还需要消除Impala的附加影响:

由于使用Yum命令安装Impala,选择使用yum自动进行Impala依赖的安装和处理理,所以本次安装默认会把Impala依赖的所有框架都会安装,比如Hadoop、Hive、MySQL等,为了保证自己安装的Hadoop等使用正常我们需要删除掉Impala默认安装的其他框架。

举例如下:

[root@node03 ~]$ which hadoop/usr/bin/hadoop[root@node03 ~]$ which hive/usr/bin/hive

使用which命令查找hadoop、hive等会发现,命令文件是/usr/bin/xxx,而非之前自己安装的路径,需要把这些删除掉,所有节点都要执行以下命令:

rm -rf /usr/bin/hadooprm -rf /usr/bin/hdfsrm -rf /usr/bin/hiverm -rf /usr/bin/beelinerm -rf /usr/bin/hiveserver2

然后再执行source /etc/profile使环境变量重新生效。

此外,执行jps命令时出现没有名字的进程或者process information unavailable,如下:

# node01节点[root@node01 ~]$ jps49938 74056 Jps11692 NodeManager7870 NameNode# node02节点[root@node02 ~]$ jps47604 9284 NodeManager71801 Jps[root@node03 ~]$ jps8372 RunJar7530 NodeManager60394 Jps35307 7389 ResourceManager

这是由于Impala并不是完全由Java实现的,可以解决、删掉这些进程,直接执行命令rm -rf /tmp/hsperfdata_impala/删除临时目录,然后再查看:

# node01节点[root@node01 ~]$ jps79883 Jps11692 NodeManager7870 NameNode# node02节点[root@node02 ~]$ jps78051 Jps9284 NodeManager# node03节点[root@node03 ~]$ jps8372 RunJar67140 Jps7530 NodeManager7389 ResourceManager

可以看到,此时已经没有没有名字的进程。

(5)入门案例

使用Yum方式安装Impala后,impala-shell可以全局使用,用于进入impala-shell命令行.

使用如下:

# Impala[root@node03 logs]$ impala-shell Starting Impala Shell without Kerberos authenticationConnected to node03:21000Server version: impalad version 2.5.0-cdh5.7.6 RELEASE (build ecbba4f4e6d5eec6c33c1e02412621b8b9c71b6a)***********************************************************************************Welcome to the Impala shell. Copyright (c) Cloudera, Inc. All rights reserved.(Impala Shell v2.5.0-cdh5.7.6 (ecbba4f) built on Tue Feb 21 14:54:50 PST )After running a query, type SUMMARY to see a summary of where time was spent.***********************************************************************************[node03:21000] > show databases;Query: show databases+------------------+----------------------------------------------+| name | comment |+------------------+----------------------------------------------+| _impala_builtins | System database for Impala builtin functions || default| Default Hive database || homework ||| mydb ||| mydb2 ||| sale ||| tuning ||+------------------+----------------------------------------------+Fetched 7 row(s) in 0.04s# Hive[root@node03 ~]$ hiveLogging initialized using configuration in file:/opt/software/hive-2.3.7/conf/hive-log4j2.properties Async: trueHive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.hive (default)> show databases;OKdatabase_namedefaulthomeworkmydbmydb2saletuningTime taken: 1.298 seconds, Fetched: 6 row(s)

可以看到,Impala和Hive类似,也获取到了数据库信息,Impala使用的元数据信息也就是Hive的元数据;

Impala和Hive的用法也比较类似。

如果想要使用Impala,需要将数据加载到Impala中,有2种方式加载数据到Impala:

使用Impala的外部表,这种适用于已经有数据文件,只需将数据文件拷贝到HDFS上,创建一张Impala外部表,将外部表的存储位置指向数据文件的位置。这种方式类似于Hive。

通过Insert方式插入数据,适用于没有数据文件的场景。

先使用第一种方式:

(1)准备数据

在家目录下创建一个目录impala_data,用于保存数据文件mkdir impala_data,并在该目录下创建数据文件vim user.csv,内容如下:

392456197008193000,张三,20,0267456198006210000,李李四,25,1892456199007203000,王五,24,1492456198712198000,赵六,26,2392456197008193000,张三,20,0392456197008193000,张三,20,0

保存并退出。

(2)创建HDFS目录

先创建目录hdfs dfs -mkdir -p /user/impala/t1,然后再上传文件到HDFShdfs dfs -put user.csv /user/impala/t1

(3)创建表

在impala-shell中创建表并插入数据,如下:

[node03:21000] > use mydb;Query: use mydb[node03:21000] > drop table if exists t1;Query: drop table if exists t1[node03:21000] > create external table t1(> id string,> name string,> age int,> gender int)> row format delimited fields terminated by ','> location '/user/impala/t1';Query: create external table t1(id string,name string,age int,gender int)row format delimited fields terminated by ','location '/user/impala/t1'WARNINGS: Impala does not have READ_WRITE access to path 'hdfs://node01:9000/user/impala'Fetched 0 row(s) in 0.13s[node03:21000] > select * from t1;Query: select * from t1+--------------------+------+-----+--------+| id | name | age | gender |+--------------------+------+-----+--------+| 392456197008193000 | 张三 | 20 | 0|| 267456198006210000 | 李四 | 25 | 1|| 892456199007203000 | 王五 | 24 | 1|| 492456198712198000 | 赵六 | 26 | 2|| 392456197008193000 | 张三 | 20 | 0|| 392456197008193000 | 张三 | 20 | 0|+--------------------+------+-----+--------+Fetched 6 row(s) in 4.23s

可以看到,成功创建表并插入了数据,同时可以查询到数据;

但是在从HDFS文件中导入数据时,会有警告mpala does not have READ_WRITE access to path 'hdfs://node01:9000/user/impala',此时为了避免权限问题,可以选择关闭权限校验,在hdfs-site.xml中添加如下配置:

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

保存退出后分发到其他节点rsync-script hdfs-site.xml,然后再重启HDFS。

第二种方式如下:

(1)直接创建表,并查看表的信息:

[node03:21000] > drop table if exists t2;Query: drop table if exists t2[node03:21000] > drop table if exists t3;Query: drop table if exists t3[node03:21000] > create table t2(> id string,> name string,> age int,> gender int)> row format delimited fields terminated by ',';Query: create table t2(id string,name string,age int,gender int)row format delimited fields terminated by ','Fetched 0 row(s) in 0.27s[node03:21000] > create table t3(> id string,> name string,> age int,> gender int)> row format delimited fields terminated by ',';Query: create table t3(id string,name string,age int,gender int)row format delimited fields terminated by ','Fetched 0 row(s) in 0.14s[node03:21000] > desc t2;Query: describe t2+--------+--------+---------+| name | type | comment |+--------+--------+---------+| id| string | || name | string | || age | int | || gender | int | |+--------+--------+---------+Fetched 4 row(s) in 3.68s[node03:21000] > desc formatted t3;Query: describe formatted t3+------------------------------+------------------------------------------------------------+----------------------+| name| type| comment |+------------------------------+------------------------------------------------------------+----------------------+| # col_name | data_type| comment ||| NULL| NULL || id | string | NULL || name| string | NULL || age| int| NULL || gender | int| NULL ||| NULL| NULL || # Detailed Table Information | NULL| NULL || Database:| mydb| NULL || Owner: | root| NULL || CreateTime: | Sun Oct 10 21:59:43 CST | NULL || LastAccessTime: | UNKNOWN | NULL || Protect Mode:| None| NULL || Retention: | 0 | NULL || Location:| hdfs://node01:9000/user/hive/warehouse/mydb.db/t3| NULL || Table Type: | MANAGED_TABLE| NULL || Table Parameters: | NULL| NULL ||| transient_lastDdlTime | 1633874383 ||| NULL| NULL || # Storage Information | NULL| NULL || SerDe Library:| org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe | NULL || InputFormat: | org.apache.hadoop.mapred.TextInputFormat | NULL || OutputFormat:| org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat | NULL || Compressed: | No | NULL || Num Buckets: | 0 | NULL || Bucket Columns: | [] | NULL || Sort Columns:| [] | NULL || Storage Desc Params: | NULL| NULL ||| field.delim | ,||| serialization.format | ,|+------------------------------+------------------------------------------------------------+----------------------+Fetched 30 row(s) in 3.83s[node03:21000] > create external table t1(> id string,> name string,> age int,> gender int)> row format delimited fields terminated by ','> location '/user/impala/t1';Query: create external table t1(id string,name string,age int,gender int)row format delimited fields terminated by ','location '/user/impala/t1'WARNINGS: Impala does not have READ_WRITE access to path 'hdfs://node01:9000/user/impala'Fetched 0 row(s) in 0.15s[node03:21000] > desc formatted t1;Query: describe formatted t1+------------------------------+------------------------------------------------------------+----------------------+| name| type| comment |+------------------------------+------------------------------------------------------------+----------------------+| # col_name | data_type| comment ||| NULL| NULL || id | string | NULL || name| string | NULL || age| int| NULL || gender | int| NULL ||| NULL| NULL || # Detailed Table Information | NULL| NULL || Database:| mydb| NULL || Owner: | root| NULL || CreateTime: | Sun Oct 10 22:01:00 CST | NULL || LastAccessTime: | UNKNOWN | NULL || Protect Mode:| None| NULL || Retention: | 0 | NULL || Location:| hdfs://node01:9000/user/impala/t1| NULL || Table Type: | EXTERNAL_TABLE| NULL || Table Parameters: | NULL| NULL ||| EXTERNAL | TRUE ||| numFiles | 1||| totalSize| 186 ||| transient_lastDdlTime | 1633874460 ||| NULL| NULL || # Storage Information | NULL| NULL || SerDe Library:| org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe | NULL || InputFormat: | org.apache.hadoop.mapred.TextInputFormat | NULL || OutputFormat:| org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat | NULL || Compressed: | No | NULL || Num Buckets: | 0 | NULL || Bucket Columns: | [] | NULL || Sort Columns:| [] | NULL || Storage Desc Params: | NULL| NULL ||| field.delim | ,||| serialization.format | ,|+------------------------------+------------------------------------------------------------+----------------------+Fetched 33 row(s) in 3.26s

可以看到,在创建表之后,可以查看表的简略和详细信息,用法和Hive类似。

(2)插入数据

将t1表中的数据经过筛选插入t3表,如下:

[node03:21000] > insert overwrite table t3> select * from t1 where gender = 0;Query: insert overwrite table t3select * from t1 where gender = 0Inserted 3 row(s) in 1.78s[node03:21000] > select * from t3;Query: select * from t3+--------------------+------+-----+--------+| id | name | age | gender |+--------------------+------+-----+--------+| 392456197008193000 | 张三 | 20 | 0|| 392456197008193000 | 张三 | 20 | 0|| 392456197008193000 | 张三 | 20 | 0|+--------------------+------+-----+--------+Fetched 3 row(s) in 0.43s

再查看对应的HDFS数据文件,如下:

[root@node03 hadoop]$ hdfs dfs -ls /user/hive/warehouse/Found 6 itemsdrwxrwxrwx - rootsupergroup0 -10-05 20:16 /user/hive/warehouse/homework.dbdrwxrwxrwx - rootsupergroup0 -10-10 21:59 /user/hive/warehouse/mydb.dbdrwxrwxrwx - anonymous supergroup0 -09-28 20:30 /user/hive/warehouse/mydb2.dbdrwxrwxrwx - rootsupergroup0 -10-03 13:06 /user/hive/warehouse/sale.dbdrwxrwxrwx - rootsupergroup0 -09-28 21:00 /user/hive/warehouse/t2drwxrwxrwx - rootsupergroup0 -10-08 23:44 /user/hive/warehouse/tuning.db[root@node03 hadoop]$ hdfs dfs -ls /user/hive/warehouse/mydb.dbFound 23 itemsdrwxrwxrwx - rootsupergroup0 -09-23 03:36 /user/hive/warehouse/mydb.db/coursedrwxrwxrwx - rootsupergroup0 -09-24 23:50 /user/hive/warehouse/mydb.db/empdrwxrwxrwx - rootsupergroup0 -10-05 17:28 /user/hive/warehouse/mydb.db/goodtbldrwxrwxrwx - rootsupergroup0 -09-26 21:17 /user/hive/warehouse/mydb.db/line2rowdrwxrwxrwx - rootsupergroup0 -09-26 18:41 /user/hive/warehouse/mydb.db/row2linedrwxrwxrwx - rootsupergroup0 -09-26 17:12 /user/hive/warehouse/mydb.db/studrwxrwxrwx - rootsupergroup0 -09-25 21:07 /user/hive/warehouse/mydb.db/studscoredrwxrwxrwx - impala supergroup0 -10-10 21:59 /user/hive/warehouse/mydb.db/t2drwxrwxrwx - impala supergroup0 -10-10 22:05 /user/hive/warehouse/mydb.db/t3drwxrwxrwx - rootsupergroup0 -09-25 20:43 /user/hive/warehouse/mydb.db/tab1drwxrwxrwx - rootsupergroup0 -09-24 17:25 /user/hive/warehouse/mydb.db/tabadrwxrwxrwx - rootsupergroup0 -09-24 21:59 /user/hive/warehouse/mydb.db/tabcdrwxrwxrwx - rootsupergroup0 -09-24 22:01 /user/hive/warehouse/mydb.db/tabddrwxrwxrwx - rootsupergroup0 -09-24 23:12 /user/hive/warehouse/mydb.db/tabedrwxrwxrwx - rootsupergroup0 -09-27 19:50 /user/hive/warehouse/mydb.db/temp1drwxrwxrwx - rootsupergroup0 -09-25 01:38 /user/hive/warehouse/mydb.db/u1drwxrwxrwx - rootsupergroup0 -09-25 01:38 /user/hive/warehouse/mydb.db/u2drwxrwxrwx - anonymous supergroup0 -09-29 15:07 /user/hive/warehouse/mydb.db/uaction_orcdrwxrwxrwx - anonymous supergroup0 -09-29 16:04 /user/hive/warehouse/mydb.db/uaction_parquetdrwxrwxrwx - anonymous supergroup0 -09-28 21:38 /user/hive/warehouse/mydb.db/uaction_textdrwxrwxrwx - rootsupergroup0 -09-26 16:09 /user/hive/warehouse/mydb.db/ulogindrwxrwxrwx - rootsupergroup0 -09-26 15:35 /user/hive/warehouse/mydb.db/userpvdrwxrwxrwx - rootsupergroup0 -09-27 20:06 /user/hive/warehouse/mydb.db/zxz_data[root@node03 hadoop]$ hdfs dfs -ls /user/hive/warehouse/mydb.db/t3Found 2 itemsdrwxrwxrwx - impala supergroup0 -10-10 22:05 /user/hive/warehouse/mydb.db/t3/_impala_insert_staging-rw-r--r-- 3 impala supergroup 93 -10-10 22:05 /user/hive/warehouse/mydb.db/t3/f84be9cdbe85ffc9-292b24983500849f_1924616492_data.0.[root@node03 hadoop]$ hdfs dfs -cat /user/hive/warehouse/mydb.db/t3/f84be9cdbe85ffc9-292b24983500849f_1924616492_data.0.392456197008193000,张三,20,0392456197008193000,张三,20,0392456197008193000,张三,20,0

再查看Hive和Impala中元数据的同步情况,先在Hive中进行操作,以更改元数据,如下:

hive (mydb)> show tables;OKtab_namecourseempgoodtblline2rowrow2linestustudscoret1t2t3tab1tabatabbtabctabdtabetemp1u1u2uaction_orcuaction_parquetuaction_textuloginuserpvzxz_dataTime taken: 0.254 seconds, Fetched: 25 row(s)hive (mydb)> drop table temp1;OKTime taken: 0.317 secondshive (mydb)> create table temp2(id int, name string);OKTime taken: 0.401 secondshive (mydb)> show tables;OKtab_namecourseempgoodtblline2rowrow2linestustudscoret1t2t3tab1tabatabbtabctabdtabetemp2u1u2uaction_orcuaction_parquetuaction_textuloginuserpvzxz_dataTime taken: 0.028 seconds, Fetched: 25 row(s)

再查看Impala中:

[node03:21000] > show tables;Query: show tables+-----------------+| name |+-----------------+| course|| emp || goodtbl || line2row || row2line || stu || studscore || t1 || t2 || t3 || tab1 || taba || tabb || tabc || tabd || tabe || temp1 || u1 || u2 || uaction_orc|| uaction_parquet || uaction_text || ulogin|| userpv|| zxz_data |+-----------------+Fetched 25 row(s) in 0.02s

可以看到,Hive中对元数据的更改并没有同步到Impala中,但是Impala中对元数据的修改可以同步到Hive中。

Impala与Hive元数据的关系:

Hive对于元数据的更新操作不能被Impala感知到;

Impala对元数据的更新操作可以被Hive感知到。

Impala同步Hive元数据命令:

手动执行invalidate metadata,Impala是通过Hive的metastore服务来访问和操作Hive的元数据,但是Hive对表进行创建删除修改等操作,Impala是无法自动识别到Hive中元数据的变更的,如果想让Impala识别到Hive元数据的变化,需要执行invalidate metadata,将所有的Impala的元数据失效并重新从元数据库同步元数据信息。

使用如下:

[node03:21000] > invalidate metadata;Query: invalidate metadataFetched 0 row(s) in 2.97s[node03:21000] > show tables;Query: show tables+-----------------+| name |+-----------------+| course|| emp || goodtbl || line2row || row2line || stu || studscore || t1 || t2 || t3 || tab1 || taba || tabb || tabc || tabd || tabe || temp2 || u1 || u2 || uaction_orc|| uaction_parquet || uaction_text || ulogin|| userpv|| zxz_data |+-----------------+Fetched 25 row(s) in 0.01s

可以看到,在执行invalidate metadata命令后,元数据进行了同步。

上面案例中Impala的数据文件使用的是以逗号分隔的文本文件,实际上,Impala可以支持RCFile、SequenceFile、Parquet等多种文件格式。

3.Impala架构原理

(1)Impala组件

Impala与Hive类似,都不是数据库而是数据分析工具。Impala是一个分布式、大规模并行处理(MPP)数据库引擎,它包括多个进程。

查看如下:

[root@node03 hadoop]$ ps aux | grep impalaimpala 16101 0.2 0.0 348268 624 ? Sl 19:22 0:30 /usr/lib/impala/sbin/statestored -log_dir=/var/log/impala -state_store_port=24000root18646 0.0 0.0 112728 992 pts/2 S+ 23:02 0:00 grep --color=auto impalaimpala 35307 0.2 7.1 3832644 132476 ?Sl 19:40 0:32 /usr/lib/impala/sbin/impalad -log_dir=/var/log/impala -catalog_service_host=node03 -state_store_port=24000 -use_statestore -state_store_host=node03 -be_port=22000impala 120481 0.2 3.7 2139108 70332 ? Sl 21:24 0:16 /usr/lib/impala/sbin/catalogd -log_dir=/var/log/impalaroot127007 0.0 0.2 234120 4276 pts/0 S+ 21:26 0:00 python /usr/lib/impala-shell/impala_shell.py

Impala架构图如下:

其中:

impalad

    - 角色名称为Impala Daemon,是在每个节点上运行的进程,是Impala的核心组件,进程名是Impalad。

    - 作用是负责读写数据文件,接收来自Impala-shell、JDBC、ODBC等客户端的查询请求,与集群其他Impalad分布式并行完成查询任务,并将查询结果返回给中心协调者。

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

    - Impalad服务由三个模块组成:Query Planner(生成查询计划)、Query Coordinator(查询协调调度)和Query Executor(真正执行查询),前两个模块组成前端,负责接收SQL查询请求,解析SQL并转换成执行计划,交由后端执行。

statestored

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

    

    - statestore进程名为statestored。

    

catalogd

    - 集群启动时拉取元数据信息同步给Impala进程,后续只有执行invalidate metadatarefresh命令时才会再次拉取元数据;

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

    - catalog服务对应进程名称是catalogd;

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

(2)Impala单机执行计划和分布式执行计划

一个典型的Impala额查询过程如下:

具体如下:

Client提交任务

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

生成单机和分布式执⾏行行计划

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

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

    查询计划有以下两种形式:

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

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

        - Fragment:sql生成的分布式执行计划的一个子任务;

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

任务调度和分发

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

Fragment之间的数据依赖

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

结果汇总

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

获取结果

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

现在以一个SQL例子来说明查询计划:

查询语句如下:

selectt1.n1,t2.n2,count(1) as cfrom t1 join t2 on t1.id = t2.idjoin t3 on t1.id = t3.idwhere t3.n3 between 'a' and 'f'group by t1.n1, t2.n2order by c desclimit 100;

QueryPlanner生成单机的执行计划:

分析上面的单机执行计划:

第一步先去扫描t1表中需要的数据,如果数据文件存储是列式存储可以便利地扫描到所需的列id、n1;

接着需要与t2表进行Join操作,扫描t2表与t1表类似获取到所需数据列id、n2;

t1与t2表进行关联,关联之后再与t3表进行关联,这里Impala会使用谓词下推扫描t3表只取join所需数据;

对group by进行相应的aggregation操作,最终是排序取出指定数量的数据返回。

分布式并行执行计划:

分布式并行化执行计划就是在单机执行计划基础之上结合数据分布式存储的特点,按照任务的计算要求把单机执行计划拆分为多段子任务,每个子任务都是可以并行执行的。

上面的单机执行计划转为分布式并行执行计划如下图所示:

对应的分布式并行执行计划流程图:

分布式执行计划中涉及到多表的Join,Impala会根据表的大小来决定Join的方式,主要有两种分别是HashJoin与Broadcast Join。

上面分布式执行计划中可以看出T1、T2表大一些,而T3表小一些,所以对于T1与T2的Join Impala选择使用Hash Join,对于T3表选择使用Broadcast方式,直接把T3表广播到需要Join的节点上。

分布式并行计划流程:

T1和T2使用Hash join,此时需要按照id的值分别将T1和T2分散到不同的Impalad进程,但是相同的id会散列到相同的Impalad进程,这样每一个Join之后是全部数据的一部分。

T1与T2Join之后的结果数据再与T3表进行Join,此时T3表采用Broadcast方式把自己全部数据(id列)广播到需要的Impala节点上。

T1、T2、T3Join之后再根据Group by执行本地的预聚合,每一个节点的预聚合结果只是最终结果的一部分(不同的节点可能存在相同的group by的值),需要再进行一次全局的聚合。

全局的聚合同样需要并行,则根据聚合列进行Hash分散到不同的节点执行Merge运算(其实仍然是一次聚合运算),一般情况下为了较少数据的网络传输, Impala会选择之前本地聚合节点做全局聚合工作。

通过全局聚合之后,相同的key只存在于一个节点,然后对于每一个节点进行排序和TopN计算,最终将每一个全局聚合节点的结果返回给Coordinator进行合并、排序、limit计算,返回结果给用户。

总结

Impala是和Hive处于并行地位的一个数据交互式查询工具,也能提供高性能查询,与Hive相比应用的范围相对较少,但是也有其优秀的特点,应该结合实际业务情况进行选择。

大数据开发基础入门与项目实战(三)Hadoop核心及生态圈技术栈之5.即席查询Impala介绍及入门使用

如果觉得《大数据开发基础入门与项目实战(三)Hadoop核心及生态圈技术栈之5.即席查询Impala介绍》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。