- 二、Impala安装和入门
- yum方式安装httpd服务器
- 启动httpd服务器
- 验证httpd工作是否正常,默认端口是80,可以省略
- 创建一个新的配置文件
- 添加如下内容
- linux123启动如下角色
- 其余节点启动如下角色
- 查看运行的hadoop、hive等软件是不是我们自己安装的,若不是,肯定是Impala自动安装的,需要删除
- (因为Impala安装的这些软件优先级高于我们配置的环境变量)
- 使用which命令 查找hadoop,hive等会发现,命令文件是/usr/bin/hadoop 而非我们自己安装的路径,需要把这些删除掉,所有节点都要执行
- 重新生效环境变量
- 上传本地文件user.csv到hdfs://user/impala/table1
- 创建一个内部表
- 查看表结构
二、Impala安装和入门
1、集群准备
安装Hadoop,Hive
- Impala 的安装需要提前装好 Hadoop,Hive 这两个框架(因为Impala依赖Hadoop的Hdfs管理文件,依赖Hive的元数据管理)
- 所有的 Impala 安装的节点上面都需要有 hive,因为 Impala 需要引用Hive的依赖包
- hadoop 的框架需要支持 C程序访问接口,如果有该路径有
.so
结尾文件,就证明支持C接口
准备Impala的所有依赖包
Cloudera公司对于Impala的安装只提供了rpm包没有提供tar包,所以我们选择使用Cloudera的rpm包进行Impala的安装,但是另外一个问题,Impala的rpm包依赖非常多的其他的rpm包,我们可以一个个的将依赖找出来,但是这种方式实在是浪费时间。
Linux系统中对于rpm包的依赖管理提供了一个非常好的管理工具叫做Yum,类似于Java工程中的包管理工具Maven,Maven可以自动搜寻指定Jar所需的其它依赖并自动下载来。Yum同理可以非常方便的让我们进行 rpm 包的安装无需关心当前rpm所需的依赖。但是与Maven下载其它依赖需要到中央仓库一样Yum下载依赖所需的源也是在放置在国外服务器并且其中没有安装Impala所需要的rpm包,所以默认的这种Yum源可能下载依赖失败。所以我们可以自己指定Yum去哪里下载所需依赖。
rpm方式安装:需要自己管理rpm包的依赖关系;非常麻烦;
- 解决依赖关系使用yum;默认Yum源是没有Impala的rpm安装包,所以我们自己准备好所有的Impala安装所需的rpm包,制作Yum本地源,配置Yum命令去到我们准备的Yun源中下载Impala的rpm包进行安装
具体制作步骤
- Yum源是Centos当中下载软件rpm包的地址,因此通过制作本地Yum源并指定Yum命令使用本地Yum源,为了使Yum命令(本机,跨网络节点)可以通过网络访问到本地源,我们使用静态资源服务器**Httpd**来开放我们下载所有的rpm包
启动httpd服务器
systemctl start httpd
验证httpd工作是否正常,默认端口是80,可以省略
![image.png](https://cdn.nlark.com/yuque/0/2020/png/2322054/1607325603700-bce87eb9-ec6e-4896-92f5-8f18c21e18ca.png#align=left&display=inline&height=172&margin=%5Bobject%20Object%5D&name=image.png&originHeight=475&originWidth=1943&size=468130&status=done&style=shadow&width=705)
2. **新建一个测试页面**
- httpd默认存放页面路径
- `/var/www/html/`
- 新建一个页面 `test.html`
```html
<html>
<div style="font-size:100px">
this is a new page!!
</div>
</html>
- 访问该页面
http://linux121/test.html
- 注:后续可以把下载的rpm包解压放置到此页面便可以以供访问
- 下载Impala安装所需rpm包
- Impala所需安装包需要去Cloudera提供的地址下载
- 注意:该tar.gz包是包含了Cloudera所提供的几乎所有rpm包,但是为了方便我们不再去梳理其中依赖关系,全部下载下来,整个文件比较大,有3.8G。选择一个磁盘空间够的节点,后续还要把压缩包解压所以磁盘空间要剩余10G以上
- 移动该安装包到
/opt/lagou/software
- 解压缩
tar -zxvf cdh5.7.6-centos7.tar.gz
- 使用Httpd存放依赖包
- 创建软链接到
/var/www/html
下ln -s /opt/lagou/software/cdh/5.7.6 /var/www/html/cdh57
-s
表示--source
- 验证
http://linux121/cdh57/
- 创建软链接到
注:如果提示 403 forbidden,解决方案如下:
vim /etc/selinux/config
,将SELINUX=enforcing
改为SELINUX=disabled
,然后重启机器!
- 修改Yum源配置文件 ```shell cd /etc/yum.repos.d
创建一个新的配置文件
vim local.repo
添加如下内容
[local] name=local baseurl=http://linux121/cdh57/ gpgcheck=0 enabled=1
- name:对于当前源的描述
- baseurl:访问当前源的地址信息
- gpgcheck: 1/0表示是否启用 **gpg校验**
- enabled:1/0 表示是否使用当前源
**
6. **分发local.repo文件到其它节点**
- `rsync-script local.repo`
---
<a name="H7llw"></a>
## 2、安装Impala
<a name="mFL2D"></a>
### 集群规划
![image.png](https://cdn.nlark.com/yuque/0/2020/png/2322054/1607326407011-c02ef72f-05fd-4a22-8d00-d511dfeb00d9.png#align=left&display=inline&height=158&margin=%5Bobject%20Object%5D&name=image.png&originHeight=503&originWidth=2089&size=58860&status=done&style=shadow&width=658)<br />**Impala角色**
- **impala-serve****r**
- 这个进程是Impala真正工作的进程,官方建议把 impala-server 安装在datanode节点(所以每个节点都安装上),更靠近数据(短路读取),进程名 `impalad`
- impala-statestored
- 健康监控角色,主要监控 impala-server,当impala-server出现异常时告知给其它 impala-server,进程名叫做 `statestored`
- impala-catalogd
- 管理和维护元数据(Hive),impala更新操作;把 impala-server 更新的元数据通知给其它 impala-server,进程名 `catalogd`
- **官方建议 statestore 与 catalog 安装在同一节点上!!!**
<a name="Ew9Ir"></a>
### 短路读取
- 在HDFS中通过DataNode来读取数据。但是,当客户端向DataNode请求读取文件时,DataNode就会从磁盘读取该文件并通过TCP socket将数据发送到客户端。**所谓“短路”是指Client客户端直接读取文件**。很明显,这种情况只在客户端与数据放在同一地点(译者注:同一主机)时才有可能发生。短路读对于许多应用程序会带来重大的性能提升。**短路读取:就是Client与DataNode属于同一节点,无需再经过网络传输数据,直接本地读取**
- 要配置短路本地读,需要验证本机Hadoop是否有libhadoop.so
- `/opt/lagou/servers/hadoop-2.9.2/lib/native`
- ![image.png](https://cdn.nlark.com/yuque/0/2020/png/2322054/1607327055465-0a760236-0a7c-4d71-b230-cf099aac1341.png#align=left&display=inline&height=84&margin=%5Bobject%20Object%5D&name=image.png&originHeight=152&originWidth=813&size=38747&status=done&style=shadow&width=448)
<a name="EeAIk"></a>
### 安装步骤
- 在 Linux123 上
```shell
# impala-shell 的安装
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
在 Linux121、Linux122 上
yum install impala-server -y
yum install impala-shell -y
配置 Impala
1. 修改hive-site.xml可以在 linux123 配置,然后分发到其他节点(利用
rsync-script
)vim 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安装包到集群节点(前提是其他节点没有Hive安装包,有的话就不用发了)
rsync -r /opt/lagou/servers/hive-2.3.7/ linux122:/opt/lagou/servers/
rsync -r /opt/lagou/servers/hive-2.3.7/ linux121:/opt/lagou/servers/
3. Linux123启动 metastore服务 和 HiveServer2服务https://www.yuque.com/raylee916/pqs5c3/zlbidy#s2tGk
nohup hive --service metastore &
nohup hive --service hiveserver2 &
检查启动情况:
ps -ef | grep RunJar
4. 修改HDFS集群hdfs-site.xml,配置短路读取
① 创建短路读取本地中转站
#所有节点创建一下目录 mkdir -p /var/lib/hadoop-hdfs
② 修改
hdfs-site.xml
```xmldfs.client.read.shortcircuit true
**注:将上面配置文件分发到集群其它节点,然后重启Hadoop集群**
```shell
#停止集群
stop-dfs.sh
stop-yarn.sh
#启动集群
start-dfs.sh
start-yarn.sh
5. Impala具体配置
引用HDFS,Hive配置 (注:所有节点都要执行此命令!)
- 使用Yum方式安装 impala 默认的Impala配置文件目录为
/etc/impala/conf
,Impala的使用要依赖Hadoop,Hive框架,所以需要把Hdfs、Hive的配置文件告知Impala- 执行以下命令把Hdfs、Hive的配置文件软链接到
/etc/impala/conf
下ln -s /opt/lagou/servers/hadoop-2.9.2/etc/hadoop/core-site.xml /etc/impala/conf/core-site.xml ln -s /opt/lagou/servers/hadoop-2.9.2/etc/hadoop/hdfs-site.xml /etc/impala/conf/hdfs-site.xml ln -s /opt/lagou/servers/hive-2.3.7/conf/hive-site.xml /etc/impala/conf/hive-site.xml
- 执行以下命令把Hdfs、Hive的配置文件软链接到
- 使用Yum方式安装 impala 默认的Impala配置文件目录为
Impala自身配置
- 所有节点更改Impala默认配置文件以及添加 mysql 的驱动包(元数据在Hive中是由Mysql存储的)
vim /etc/default/impala
<!--更新如下内容 --> IMPALA_CATALOG_SERVICE_HOST=linux123 IMPALA_STATE_STORE_HOST=linux123
所有节点创建mysql的驱动包的软链接
#创建节点 mkdir -p /usr/share/java ln -s /opt/lagou/servers/hive-2.3.7/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=/opt/lagou/servers/jdk1.8.0_231
- 注意:
Apache Bigtop
是一个针对基础设施工程师和数据科学家的开源项目,旨在全面打包、测试和配置领先的开源大数据组件/项目。Impala项目中使用到了此软件
启动Impala
其余节点启动如下角色
service impala-server start
- 验证Impala启动结果
```shell
ps -ef | grep impala
[root@linux123 conf]# ps -ef | grep impala
impala 29212 1 1 23:42 ? 00:00:00
/usr/lib/impala/sbin/statestored -log_dir=/var/log/impala -state_store_port=24000 impala 29249 1 21 23:42 ? 00:00:04
/usr/lib/impala/sbin/catalogd -log_dir=/var/log/impala impala 29341 1 30 23:42 ? 00:00:06
/usr/lib/impala/sbin/impalad -log_dir=/var/log/impala -catalog_service_host=linux123 -state_store_port=24000 -use_statestore -state_store_host=linux123 -be_port=22000
[root@linux122 conf]# ps -ef | grep impala
impala 25233 1 41 23:43 ? 00:00:04
/usr/lib/impala/sbin/impalad -log_dir=/var/log/impala -catalog_service_host=linux123 -state_store_port=24000 -use_statestore -state_store_host=linux123 -be_port=22000
[root@linux121 conf]# ps -ef | grep impala
impala 21992 1 59 23:43 ? 00:00:04
/usr/lib/impala/sbin/impalad -log_dir=/var/log/impala -catalog_service_host=linux123 -state_store_port=24000 -use_statestore -state_store_host=linux123 -be_port=22000
- 浏览器Web界面验证
- 访问 impalad 的管理界面
http://linux123:25000/
- 访问 statestored 的管理界面
http://linux123:25010/
- 访问 impalad 的管理界面
- 注意:启动之后所有关于Impala的日志默认都在
/var/log/impala
这个路径下,Linux123机器上面应该有 3 个进程,Linux121与Linux122机器上面只有 1 个进程,如果进程个数不对,去对应目录下查看报错日志
- 消除Impala影响
[root@linux122 conf]# which hadoop /usr/bin/hadoop
[root@linux122 conf]# which hive /usr/bin/hive
使用which命令 查找hadoop,hive等会发现,命令文件是/usr/bin/hadoop 而非我们自己安装的路径,需要把这些删除掉,所有节点都要执行
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
重新生效环境变量
source /etc/profile
- 执行 `jps` 命令时出现**没有名字的进程 **或者 `process information unavailable`
- 原因:jps 查看的是 java进程的pid,而Impala相关服务是基于C/C++的,因此显示不出名字,可以选择 `jps` 不显示该进程
- ![image.png](https://cdn.nlark.com/yuque/0/2020/png/2322054/1607328654824-fe50aa11-00b4-4276-bacd-90171956d475.png#align=left&display=inline&height=89&margin=%5Bobject%20Object%5D&name=image.png&originHeight=304&originWidth=683&size=81306&status=done&style=shadow&width=200)
- 解决方式
- `rm -rf /tmp/hsperfdata_impala`
<a name="TSam9"></a>
## 3、入门案例
- 使用 Yum 方式安装 Impala 后,`impala-shell` 可以全局使用;进入 `impala-shell` 命令行 impala-shell 进入到 impala 的交互窗口
- ![image.png](https://cdn.nlark.com/yuque/0/2020/png/2322054/1607329004349-78ea1a2d-3226-405f-a0f7-ca1147f8fc3c.png#align=left&display=inline&height=213&margin=%5Bobject%20Object%5D&name=image.png&originHeight=439&originWidth=997&size=53143&status=done&style=shadow&width=484)
- 查看所有数据库
- ![image.png](https://cdn.nlark.com/yuque/0/2020/png/2322054/1607329055122-05cbf7eb-90f5-4b75-8861-aca846f9f155.png#align=left&display=inline&height=186&margin=%5Bobject%20Object%5D&name=image.png&originHeight=368&originWidth=960&size=24768&status=done&style=shadow&width=486)
- 数据的加载(加载至Impala)
- 使用 Impala 的**外部表**,这种**适用于已经有数据文件**,只需将数据文件拷贝到HDFS上,创建一张Impala外部表,将外部表的存储位置指向数据文件的位置即可。(类似Hive)
- 通过** Insert **方式插入数据,适用于我们**没有数据文件**的场景
1. 准备数据文件
- user.csv
```sql
392456197008193000,张三,20,0
267456198006210000,李四,25,1
892456199007203000,王五,24,1
492456198712198000,赵六,26,2
392456197008193000,张三,20,0
392456197008193000,张三,20,0
- 创建HDFS 存放数据的路径 ```shell hadoop fs -mkdir -p /user/impala/t1
上传本地文件user.csv到hdfs://user/impala/table1
hadoop fs -put user.csv /user/impala/t1
3. 创建表
```shell
#进入impala-shell
impala-shell
#表如果存在则删除
drop table if exists t1;
#执行创建
create external table t1(
id string,
name string,
age int,
gender int
)
row format delimited fields terminated by ','
location '/user/impala/t1';
查询数据
创建t2表 ```sql
创建一个内部表
create table t2( id string, name string, age int, gender int ) row format delimited fields terminated by ‘,’;
查看表结构
desc t1; desc formatted t2;
6. 插入数据到t2
- `insert overwrite table t2 select * from t1 where gender =0;`
- 验证数据
- `select * from t2;`
- ![image.png](https://cdn.nlark.com/yuque/0/2020/png/2322054/1607329467920-0cac4803-c07e-45b6-a64d-306cdc9f744c.png#align=left&display=inline&height=142&margin=%5Bobject%20Object%5D&name=image.png&originHeight=283&originWidth=602&size=23994&status=done&style=shadow&width=301)
- 更新元数据
- 使用Beeline连接Hive查看Hive中的数据,发现**通过Impala创建的表,导入的数据都可以被Hive感知到**
**![image.png](https://cdn.nlark.com/yuque/0/2020/png/2322054/1607339826281-318742d2-acf1-4cb3-bcdd-081281f3e51f.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_10%2Ctext_TGFuY2VNYWk%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10#align=left&display=inline&height=370&margin=%5Bobject%20Object%5D&name=image.png&originHeight=534&originWidth=751&size=40948&status=done&style=shadow&width=521)**
<a name="51wnC"></a>
### 部分问题集锦
1. 上面案例中Impala的数据文件我们准备的是以逗号分隔的文本文件,实际上,Impala可以支持RCFile、SequenceFile、Parquet等多种文件格式。
2. Impala与Hive元数据的关系?
- Hive对于元数据的更新操作不能被Impala感知到
- Impala对元数据的更新操作可以被Hive感知到
- 解决方法
- Impala 同步 Hive元数据命令:
- 在 impala-shell 中手动执行 `invalidate metadata`
- Impala是通过Hive的metastore服务来访问和操作Hive的元数据,但是Hive对表进行创建删除修改等操作,Impala是无法自动识别到Hive中元数据的变更情况的,如果想让Impala识别到Hive元数据的变化,所以需要**进入 impala-shell 之后首先要做的操作就是执行 **`**invalidate metadata**`,该命令会将所有的Impala的元数据失效并重新从元数据库同步元数据信息。
3. Impala操作HDFS使用的是Impala用户,所以**为了避免权限问题,我们可以选择关闭权限校验**
- 在 `hdfs-site.xml` 中添加如下配置,然后重启 hdfs集群
```xml
<!--关闭hdfs权限校验 -->
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>