这是博主在社区版hadoop环境下学习impala时搭建的环境,亲测是可以用的.
Impala就是使用SQL语句来操作Hive中的数据库和表,它可以提供低延迟的交互式的SQL查询功能.它与Hive共用表的元数据信息,所以需要使用Impala必须要先有Hive.
优点:
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环境下)
[root@linux121 native]# cd /opt/servers/hadoop-2.9.2/lib/native/
由于Cloudera公司对于Impala的安装只提供了rpm包没有提供tar包,但是如果使用rpm包的方式安装,需要自己取解决rpm之间的所有依赖,非常繁琐.这里使用本地yum的方式进行安装.但默认的yum源是没有Impala的rpm安装包的,所以我们自己准备好所有的Impala安装所需的rpm包,制作Yum本地源,配置Yum命令去到我们准备的Yum源中下载Impala的rpm包进行安装.
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/
#进入该目录下
[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
节点名称 | impala-catalogd | impala-statestored | impala-server |
---|---|---|---|
linux121 | × | × | √ |
linux122 | × | × | √ |
linux123 | √ | √ | √ |
说明: 官方建议impala-statestored与impala-catalog安装在同一节点上.
[root@linux123 ~]# yum install -y impala impala-server impala-state-store impala-catalog impala-shell
[root@linux121 ~]# yum install -y impala-server impala-shell
[root@linux122 ~]# yum install -y impala-server impala-shell
[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.在所有节点创建一下这个目录
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
[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的日志的目录
[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
[root@linux121 ~]# stop-dfs.sh
[root@linux121 ~]# start-dfs.sh
[root@linux123 ~]# service impala-state-store start
[root@linux123 ~]# service impala-catalog start
[root@linux123 ~]# service impala-server start
[root@linux121 ~]# service impala-server start
[root@linux122 ~]# service impala-server start
ps -ef | grep impala
#访问impalad管理界面
http://linux123:25000/
#访问statestored的管理界面
http://linux123:25010/
说明: 如果进程数启动不对,web页面打不开,去指定的日志目录.
5. jps时出现空白的进程或者process information unavailable
#解决办法(注意只删除后缀为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*
[root@linux121 ~]# impala-shell
[linux121:21000]> show databases;
File "/usr/lib/impala-shell/impala_shell.py", line 237
print "Query options (defaults shown in []):"
^
SyntaxError: invalid syntax
说明: 默认的python环境是3.x版本的,将默认版本改为python2.x的即可.
报错信息如下:
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
报错截图:
解决办法:
由于前面的/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/
最后效果:
Impala主要有三个组件,分别是statestore,catalog和impalad,对于Impalad节点,每一个节点都可以接收客户端的查询请求,并且对于连接到该Impalad的查询还要作为Coordinator节点(需要消耗一定的内存和CPU)存在,为了保证每一个节点的资源开销的平衡需要对于集群中的Impalad节点做一下负载均衡.
Cloudera官方推荐的代理方案是HAProxy,这里我们也使用这种方式实现负载均衡.实际生产中建议选择一个非Impala节点作为HAProxy安装节点.
[root@linux123 module]# yum install -y haproxy
[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
[root@linux122 ~]# impala-shell -i linux121:21000
linux121:21050
#打开配置文件
[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