原生Hadoop环境下Impala的安装和使用

1. 写在前面的话

这是博主在社区版hadoop环境下学习impala时搭建的环境,亲测是可以用的.

2. Impala的基本概念

2.1 什么是Impala

  Impala就是使用SQL语句来操作Hive中的数据库和表,它可以提供低延迟的交互式的SQL查询功能.它与Hive共用表的元数据信息,所以需要使用Impala必须要先有Hive.

2.2 Impala的优缺点以及使用场景

优点:
1.基于内存计算,不需要把中间结果写入磁盘,省掉了大量的I/O开销.
2. 无需将SQL转换为MapReduce任务,可以直接访问存储在HDFS,HBASE中的数据进行作业调度,可以提高查询速度.
3. 使用了支持数据本地化的I/O调度机制,尽可能地将数据和计算分配在同一台机器上进行,减少了网络开销.
4. 支持各种文件格式,比如textFile,SequenceFile,RCFile,Parquet.注意Impala不支持ORC格式.
5. 可以通过Hive的matestore直接访问其元数据,对Hive中的表直接做数据分析.
缺点:
1.对内存依赖较大,且完全依赖于Hive(因为它与Hive共用一套元数据)
2.当Hive中的分区表分区数太多时,性能下降明显.
3.每次在Hive中为表添加,删除等操作时,在Impala中需要手动更新元数据信息.
4.资源不能通过yarn统一资源管理调度,所以Hadoop集群无法实现Impala,Spark,Hive等组件的动态资源共享.
适用场景:
1.Hive主要用于复杂的批处理查询任务,数据转换任务,对实时性要求不高同时数据量又很大的场景.
2.Impala主要用作交互式查询,能快速响应结果.一般是与Hive配合使用,对Hive的结果数据集进行实时分析.Impala并不能完全取代Hive,Impala可以直接处理Hive表中的数据.
3.Impala的安装(原生Hadoop环境下)

3. 集群搭建

3.1 集群准备

3.1.1 安装Hadoop和Hive

  • Impala的安装需要提前安装好Hadoop和Hive,因为Impala的数据实际是存在HDFS上,且Impala是直接使用Hive元数据来管理数据.
  • Hive需要在所有的Impala安装的节点上都要有,因为Impala需要引用Hive的依赖包
  • Hadoop的框架需要支持C程序访问接口,如下图,如果该路径下有.so结尾的文件,就证明支持C接口.
[root@linux121 native]# cd /opt/servers/hadoop-2.9.2/lib/native/

3.1.2 准备Impala的所有依赖包

  由于Cloudera公司对于Impala的安装只提供了rpm包没有提供tar包,但是如果使用rpm包的方式安装,需要自己取解决rpm之间的所有依赖,非常繁琐.这里使用本地yum的方式进行安装.但默认的yum源是没有Impala的rpm安装包的,所以我们自己准备好所有的Impala安装所需的rpm包,制作Yum本地源,配置Yum命令去到我们准备的Yum源中下载Impala的rpm包进行安装.

3.1.3 本地yum源制作步骤

1.Yum源是CentOS当中下载rpm包的地址,因此通过制作本地yum源并指定Yum命令使用本地Yum源,为了使Yum命令(本地和跨网络的其它节点)可以通过网络访问到本地Yum源,这里使用httpd这种静态资源服务器来开放我们下载所有的rpm包.
2. linux121节点上安装httpd服务器

#yum方式安装httpds服务器
[root@linux121 ~]# yum install -y httpd
#启动httpd服务器
[root@linux121 ~]# systemctl start httpd
#查看httpd转态是否启动
[root@linux121 ~]# systemctl status httpd

3.测试httpd服务器是否可用
httpd默认存放页面路径/var/www/html ,在该路径下新建一个test.html

[root@linux121 html]# vim test.html
<html>
<div style="font-size:100px">
this is my page!!
</div>
</html>

访问http://linux121/test.html
说明:后续可以把下载的所有rpm包解压放置到此处便可以供后面使用.
4.下载Impala安装所需的所有rpm包

#Impala所需rpm包下载地址,可以根据自己需要的版本找对应的地址
http://archive.cloudera.com/cdh5/repo-as-tarball/5.7.6/cdh5.7.6-centos7.tar.gz

说明:该tar.gz包是包含了Cloudera公司所提供的几乎所有的rpm包,为了方便,我们不去梳理其中的依赖关系,而是将所有的rpm包全部下载下来.
5.解压第4步下载下来包含所有rpm包的tar.gz包

#解压在当前目录得到一个cdh的解压目录
[root@linux121 software]# tar -zvxf cdh5.7.6-centos7.tar.gz

6.使用httpd存放这些依赖包,创建依赖包的软连接到/var/www/html

[root@linux121 software]# ln -s /opt/software/cdh/5.7.6/ /var/www/html/cdh-5.7.6

7.验证httpd访问这些依赖包是否成功

http://linux121/cdh-5.7.6/

原生Hadoop环境下Impala的安装和使用_第1张图片
8.修改yum源配置文件

#进入该目录下
[root@linux121 software]# cd /etc/yum.repos.d/
#创建一个新的配置文件,以.repo结尾
[root@linux121 yum.repos.d]# vim local.repo
#需要与文件名保持一致
[local]
#自己随意取的名字,对于当前源的描述
name=local_yum
#访问当前源的地址信息
baseurl=http://linux121/cdh-5.7.6
#为0不做gpg校验
gpcheck=0
#当前源是否可用,为1则可用,为0则禁用
enabled=1

9.分发local.repo文件到其它节点

[root@linux121 yum.repos.d]# rsync-script ./local.repo

3.2 安装Impala

3.2.1 集群规划

节点名称 impala-catalogd impala-statestored impala-server
linux121 × ×
linux122 × ×
linux123

说明: 官方建议impala-statestored与impala-catalog安装在同一节点上.

3.2.2 Impala中各角色解释

  • Impala-server : Impala真正工作的进程,官方建议把impala-server安装在datanode所在的节点上,这样可以更靠近数据(有利于短路读取,数据本地化);进程名叫做impalad
  • Impala-statestored: 健康监控角色,主要监控impala-server,impala-server出现异常时告知给其它impala-server,进程名叫做statestored
  • Impala-catalogd : 将Impala的更新操作同步到Hive的元数据;把某个impala-server更新的元数据通知给其它的impala-server,进程名catalogd.

3.2.3 具体安装步骤

  1. 在linux123的机器上执行下面的命令
[root@linux123 ~]# yum install -y impala impala-server impala-state-store impala-catalog impala-shell
  1. 在linux121和linux122上分别执行下面的命令
[root@linux121 ~]# yum install -y impala-server impala-shell
[root@linux122 ~]# yum install -y impala-server impala-shell
  1. 修改hive-site.xml配置文件(先修改linux123节点的)
[root@linux123 ~]# vim /opt/servers/hive-2.3.7/conf/hive-site.xml
#1.修改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安装目录到集群中其它节点
[root@linux123 ~]# rsync-script /opt/servers/hive-2.3.7/
  1. 短路读取
      在HDFS通过DataNode来读取数据.但是,当客户端向DataNode请求读取文件时,DataNode就会从磁盘读取文件并通过TCP socket将数据发送到客户端.所谓"短路"是指Client客户端直接读取文件.很明显,这种情况只在客户端与数据放在同一主机时才有可能发生.短路读取对于许多应用程序会带来重大的性能提升.
      短路录取: 就是Client与DataNode属于同一节点,无需再经过传输数据,直接本地读取.
      要配置短路读取,需要验证本地Hadoop是否有libhadoop.so
    原生Hadoop环境下Impala的安装和使用_第2张图片
  2. 短路读取配置
#1.在所有节点创建一下这个目录
mkdir -p /var/lib/hadoop-hdfs
#2.修改hdfs-site.xml配置文件
[root@linux123 hadoop-hdfs]# vim /opt/servers/hadoop-2.9.2/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>
#3.将修改后的配置文件分发到其它节点
[root@linux123 hadoop-hdfs]# rsync-script /opt/servers/hadoop-2.9.2/etc/hadoop/hdfs-site.xml
  1. impala中跟Hadoop,Hive相关的配置
      使用Yum方式安装Impala时默认的Impala配置文件目录为/etc/impala/conf目录,Impala的使用要依赖Hadoop,Hive框架,所以需要把HDFS,Hive的配置文件告知Impala,执行下面的命令,把HDFS和Hive的配置文件软链接到/etc/impala/conf下(所有节点执行)
[root@linux123 ~]# ln -s /opt/servers/hadoop-2.9.2/etc/hadoop/core-site.xml /etc/impala/conf/core-site.xml
[root@linux123 ~]# ln -s /opt/servers/hadoop-2.9.2/etc/hadoop/hdfs-site.xml /etc/impala/conf/hdfs-site.xml
[root@linux123 ~]# ln -s /opt/servers/hive-2.3.7/conf/hive-site.xml /etc/impala/conf/hive-site.xml

[root@linux122 hadoop-hdfs]# ln -s /opt/servers/hadoop-2.9.2/etc/hadoop/core-site.xml /etc/impala/conf/core-site.xml
[root@linux122 hadoop-hdfs]# ln -s /opt/servers/hadoop-2.9.2/etc/hadoop/hdfs-site.xml /etc/impala/conf/hdfs-site.xml
[root@linux122 hadoop-hdfs]# ln -s /opt/servers/hive-2.3.7/conf/hive-site.xml /etc/impala/conf/hive-site.xml

[root@linux121 ~]# ln -s /opt/servers/hadoop-2.9.2/etc/hadoop/core-site.xml /etc/impala/conf/core-site.xml
[root@linux121 ~]# ln -s /opt/servers/hadoop-2.9.2/etc/hadoop/hdfs-site.xml /etc/impala/conf/hdfs-site.xml
[root@linux121 ~]# ln -s /opt/servers/hive-2.3.7/conf/hive-site.xml /etc/impala/conf/hive-site.xml
  1. impala的自身配置(所有节点)
#1.创建存储impala的日志的目录
[root@linux121 ~]# mkdir -p /file/logs/impala/
[root@linux122 ~]# mkdir -p /file/logs/impala/
[root@linux123 ~]# mkdir -p /file/logs/impala/
#2.将日志目录用户和用户组改为impala,不然有权限问题
[root@linux121 ~]# chown impala:impala /file/logs/impala/
```shell
#在所有impala所有节点修改
[root@linux123 ~]# vim /etc/default/impala 
[root@linux122 ~]# vim /etc/default/impala
[root@linux121 ~]# vim /etc/default/impala
#catalog所在的主机名,按照上面的规划是在linux123上
IMPALA_CATALOG_SERVICE_HOST=linux123
#statestore所在的主机名,按照上面的规划是在linux123上
IMPALA_STATE_STORE_HOST=linux123
#指定Impala的日志目录,放在统一的位置
IMPALA_LOG_DIR=/file/logs/impala
#打开注释,指定mysql驱动所在的位置
MYSQL_CONNECTOR_JAR=/usr/share/java/mysql-connector-java.jar
#添加mysql驱动包
[root@linux121 ~]# mkdir -p /usr/share/java
[root@linux122 ~]# mkdir -p /usr/share/java
[root@linux123 ~]# mkdir -p /usr/share/java

ln -s /opt/servers/hive-2.3.7/lib/mysql-connector-java-5.1.46.jar /usr/share/java/mysql-connector-java.jar
#修改bigtop的JAVA_HOME路径
[root@linux123 ~]# vim /etc/default/bigtop-utils
[root@linux122 ~]# vim /etc/default/bigtop-utils
[root@linux121 ~]# vim /etc/default/bigtop-utils

export JAVA_HOME=/opt/servers/jdk1.8.0_231/

说明: Apache Bigtop是一个针对基础设施工程师和数据科学家的开源项目,旨在全面打包,测试和配置领先的开源大数据组件/项目.
8. 删除因安装impala带来的影响
  由于使用yum命令安装impala,我们选择使用yum自动进行impala依赖的安装和处理,所以此次安装默认会把Impala依赖的所有框架都会安装,比如Hadoop,Hive,MySQL等,为了保证我们自己安装的框架使用正常我们需要删除掉Impala默认安装的其它框架(所有impala节点).

[root@linux123 ~]# which hadoop
/usr/bin/hadoop
[root@linux123 ~]# which hive
/usr/bin/hive
#使⽤which命令 查找hadoop,hive等会发现,命令文件是/usr/bin/hadoop ⽽⾮非我们⾃己的安装路径,需要把这些删除掉,Impala的所有节点都要执行下面的命令
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
rm -rf /usr/bin/hbase
rm -rf /usr/bin/zookeeper-client
rm -rf /usr/bin/zookeeper-server*
rm -rf /usr/bin/yarn 
#重新使各节点的环境变量生效
source /etc/profile
  1. 重启HDFS
[root@linux121 ~]# stop-dfs.sh 
[root@linux121 ~]# start-dfs.sh 

3.2.4 启动impala

  1. 根据之前的规划,在linux123上启动下面的角色
[root@linux123 ~]# service impala-state-store start
[root@linux123 ~]# service impala-catalog start
[root@linux123 ~]# service impala-server start
  1. 在linux121和linux122上再启动impala-server
[root@linux121 ~]# service impala-server start
[root@linux122 ~]# service impala-server start
  1. 验证Impala是否启动
ps -ef | grep impala
  1. 浏览器Web界面验证
#访问impalad管理界面
http://linux123:25000/

原生Hadoop环境下Impala的安装和使用_第3张图片

#访问statestored的管理界面
http://linux123:25010/

原生Hadoop环境下Impala的安装和使用_第4张图片
说明: 如果进程数启动不对,web页面打不开,去指定的日志目录.
5. jps时出现空白的进程或者process information unavailable
原生Hadoop环境下Impala的安装和使用_第5张图片

#解决办法(注意只删除后缀为impala的即可)
[root@linux121 bin]# rm -rf /tmp/hsperfdata_impala*
[root@linux122 bin]# rm -rf /tmp/hsperfdata_impala*
[root@linux123 bin]# rm -rf /tmp/hsperfdata_impala*

3.2.5 找任意一台impala-server启动

[root@linux121 ~]# impala-shell
[linux121:21000]> show databases;

3.2.6 安装过程可能遇到的问题

3.2.6.1 由于python环境启动impala-server时报错

File "/usr/lib/impala-shell/impala_shell.py", line 237
print "Query options (defaults shown in []):"
                                            ^
SyntaxError: invalid syntax

原生Hadoop环境下Impala的安装和使用_第6张图片
说明: 默认的python环境是3.x版本的,将默认版本改为python2.x的即可.

3.2.6.2 启动datanode时日志发现如下报错信息

报错信息如下:

2020-08-22 02:18:45,410 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: Exception in secureMain
java.io.IOException: The path component: '/var/lib/hadoop-hdfs' in '/var/lib/hadoop-hdfs/dn_socket' has permissions 0755 uid 991 an
d gid 990. It is not protected because it is owned by a user who is not root and not the effective user: '0'. This might help: 'cho
wn root /var/lib/hadoop-hdfs' or 'chown 0 /var/lib/hadoop-hdfs'. For more information: https://wiki.apache.org/hadoop/SocketPathSec
urity
        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)
2020-08-22 02:18:45,412 INFO org.apache.hadoop.util.ExitUtil: Exiting with status 1: java.io.IOException: The path component: '/var
/lib/hadoop-hdfs' in '/var/lib/hadoop-hdfs/dn_socket' has permissions 0755 uid 991 and gid 990. It is not protected because it is o
wned 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
2020-08-22 02:18:45,414 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: SHUTDOWN_MSG: 
/************************************************************
SHUTDOWN_MSG: Shutting down DataNode at linux122/172.26.73.98

报错截图:
原生Hadoop环境下Impala的安装和使用_第7张图片
解决办法:
由于前面的/var/lib/hadoop-hdfs的问题,需将其用户修改为root

[root@linux121 ~]# chown root /var/lib/hadoop-hdfs/
[root@linux122 ~]# chown root /var/lib/hadoop-hdfs/
[root@linux123 ~]# chown root /var/lib/hadoop-hdfs/

最后效果:
在这里插入图片描述

3.2.7 Impala的负载均衡

  Impala主要有三个组件,分别是statestore,catalog和impalad,对于Impalad节点,每一个节点都可以接收客户端的查询请求,并且对于连接到该Impalad的查询还要作为Coordinator节点(需要消耗一定的内存和CPU)存在,为了保证每一个节点的资源开销的平衡需要对于集群中的Impalad节点做一下负载均衡.
  Cloudera官方推荐的代理方案是HAProxy,这里我们也使用这种方式实现负载均衡.实际生产中建议选择一个非Impala节点作为HAProxy安装节点.

  1. 选择一台机器安装haProxy
[root@linux123 module]# yum install -y haproxy
  1. 修改haproxy.cfg配置文件,在配置文件中增加如下内容
[root@linux121 module]# vim /etc/haproxy/haproxy.cfg
##监听impala-shell
listen impalashell
bind 0.0.0.0:21000 #ha作为proxy所绑定的IP和端口(任意机器访问21000端口即可)
mode tcp #以4层⽅方式代理理,重要
option tcplog
balance roundrobin#调度算法 'leastconn' 最少连接数分配,或者 'roundrobin'轮询
#指定集群中有的所有impalad节点,然后给取个名字,后面是节点的主机名和端口,check检查是正常,正常才转发给impalad
server impalashell_2 linux122:21000 check
server impalashell_3 linux123:21000 check
#监听jdbc的请求,平常不用到jdbc连接impala就不配.通过客户端界面连接就是用的jdbc
listen impalajdbc
bind 0.0.0.0:21050#ha作为proxy所绑定的IP和端⼝口
mode tcp#以4层⽅方式代理理,重要
option tcplog
balance roundrobin #调度算法 'leastconn' 最少连接数分配,或者 'roundrobin',轮询分
server impalajdbc_2 linux122:21050 check
server impalajdbc_3 linux123:21050 check
  1. 找Impala集群中的任意一台机器启动impala-server
[root@linux122 ~]# impala-shell -i linux121:21000
  1. 如果是通过jdbc的方式连接,需要找linux121:21050

3.2.8 将Impala集成到Hue中

#打开配置文件
[root@linux122 hue]# vim /opt/servers/hue/desktop/conf/pseudo-distributed.ini
[impala](1140行左右)
#任意一台impala-server的主机名(由于使用了haproxy实现负载均衡,所以写haproxy配置的主机名和端口),hue是通过jdbc的方式连接的impalad
server_host=linux121
#使用默认端口
server_port=21050
#impala的配置文件目录,如果是yum方式安装就是下面的目录
impala_conf_dir=/etc/impala/conf

你可能感兴趣的:(随笔,大数据,impala)