二、Impala安装和入门

1、集群准备

安装Hadoop,Hive

  • Impala 的安装需要提前装好 Hadoop,Hive 这两个框架(因为Impala依赖Hadoop的Hdfs管理文件,依赖Hive的元数据管理)
  • 所有的 Impala 安装的节点上面都需要有 hive,因为 Impala 需要引用Hive的依赖包
  • hadoop 的框架需要支持 C程序访问接口,如果有该路径有 .so 结尾文件,就证明支持C接口

image.png

准备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包进行安装

image.png
image.png

具体制作步骤

  • Yum源是Centos当中下载软件rpm包的地址,因此通过制作本地Yum源并指定Yum命令使用本地Yum源,为了使Yum命令(本机,跨网络节点)可以通过网络访问到本地源,我们使用静态资源服务器**Httpd**来开放我们下载所有的rpm包
  1. Linux121** 安装Httpd服务器** ```shell

    yum方式安装httpd服务器

    yum install httpd -y

启动httpd服务器

systemctl start httpd

验证httpd工作是否正常,默认端口是80,可以省略

http://linux121

  1. ![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. 2. **新建一个测试页面**
  3. - httpd默认存放页面路径
  4. - `/var/www/html/`
  5. - 新建一个页面 `test.html`
  6. ```html
  7. <html>
  8. <div style="font-size:100px">
  9. this is a new page!!
  10. </div>
  11. </html>
  • 访问该页面
    • http://linux121/test.html
    • 注:后续可以把下载的rpm包解压放置到此页面便可以以供访问
  1. 下载Impala安装所需rpm包
    • Impala所需安装包需要去Cloudera提供的地址下载
    • 注意:该tar.gz包是包含了Cloudera所提供的几乎所有rpm包,但是为了方便我们不再去梳理其中依赖关系,全部下载下来,整个文件比较大,有3.8G。选择一个磁盘空间够的节点,后续还要把压缩包解压所以磁盘空间要剩余10G以上


  • 移动该安装包到 /opt/lagou/software
  • 解压缩
    • tar -zxvf cdh5.7.6-centos7.tar.gz
  1. 使用Httpd存放依赖包
    • 创建软链接到 /var/www/html
      • ln -s /opt/lagou/software/cdh/5.7.6 /var/www/html/cdh57
        • -s 表示 --source
    • 验证
      • http://linux121/cdh57/

image.png
注:如果提示 403 forbidden,解决方案如下:

  • vim /etc/selinux/config,将 SELINUX=enforcing 改为 SELINUX=disabled,然后重启机器!

image.png

  1. 修改Yum源配置文件 ```shell cd /etc/yum.repos.d

创建一个新的配置文件

vim local.repo

添加如下内容

[local] name=local baseurl=http://linux121/cdh57/ gpgcheck=0 enabled=1

  1. - name:对于当前源的描述
  2. - baseurl:访问当前源的地址信息
  3. - gpgcheck 1/0表示是否启用 **gpg校验**
  4. - enabled1/0 表示是否使用当前源
  5. **
  6. 6. **分发local.repo文件到其它节点**
  7. - `rsync-script local.repo`
  8. ---
  9. <a name="H7llw"></a>
  10. ## 2、安装Impala
  11. <a name="mFL2D"></a>
  12. ### 集群规划
  13. ![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角色**
  14. - **impala-serve****r**
  15. - 这个进程是Impala真正工作的进程,官方建议把 impala-server 安装在datanode节点(所以每个节点都安装上),更靠近数据(短路读取),进程名 `impalad`
  16. - impala-statestored
  17. - 健康监控角色,主要监控 impala-server,当impala-server出现异常时告知给其它 impala-server,进程名叫做 `statestored`
  18. - impala-catalogd
  19. - 管理和维护元数据(Hive),impala更新操作;把 impala-server 更新的元数据通知给其它 impala-server,进程名 `catalogd`
  20. - **官方建议 statestore catalog 安装在同一节点上!!!**
  21. <a name="Ew9Ir"></a>
  22. ### 短路读取
  23. - HDFS中通过DataNode来读取数据。但是,当客户端向DataNode请求读取文件时,DataNode就会从磁盘读取该文件并通过TCP socket将数据发送到客户端。**所谓“短路”是指Client客户端直接读取文件**。很明显,这种情况只在客户端与数据放在同一地点(译者注:同一主机)时才有可能发生。短路读对于许多应用程序会带来重大的性能提升。**短路读取:就是ClientDataNode属于同一节点,无需再经过网络传输数据,直接本地读取**
  24. - 要配置短路本地读,需要验证本机Hadoop是否有libhadoop.so
  25. - `/opt/lagou/servers/hadoop-2.9.2/lib/native`
  26. - ![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)
  27. <a name="EeAIk"></a>
  28. ### 安装步骤
  29. - Linux123
  30. ```shell
  31. # impala-shell 的安装
  32. yum install impala -y
  33. yum install impala-server -y
  34. yum install impala-state-store -y
  35. yum install impala-catalog -y
  36. yum install impala-shell -y
  • 在 Linux121、Linux122 上

    1. yum install impala-server -y
    2. yum install impala-shell -y

    配置 Impala
    1. 修改hive-site.xml

  • 可以在 linux123 配置,然后分发到其他节点(利用 rsync-script

  • vim hive-site.xml

    1. <!--指定metastore地址,之前添加过的可以不用添加 -->
    2. <property>
    3. <name>hive.metastore.uris</name>
    4. <value>thrift://linux121:9083,thrift://linux123:9083</value>
    5. </property>
    6. <property>
    7. <name>hive.metastore.client.socket.timeout</name>
    8. <value>3600</value>
    9. </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 ```xml

    dfs.client.read.shortcircuit true
dfs.domain.socket.path /var/lib/hadoop-hdfs/dn_socket

dfs.datanode.hdfs-blocks-metadata.enabled true

dfs.client.file-block-storage-locations.timeout 30000

**注:将上面配置文件分发到集群其它节点,然后重启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
        
  • 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

    • 前提:Linux123启动 metastore服务 和 HiveServer2服务
      • nohup hive --service metastore &
      • nohup hive --service hiveserver2 & ```shell

        linux123启动如下角色

        service impala-state-store start service impala-catalog start service impala-server start

其余节点启动如下角色

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/

image.png
image.png

  • 注意:启动之后所有关于Impala的日志默认都在 /var/log/impala 这个路径下,Linux123机器上面应该有 3 个进程,Linux121与Linux122机器上面只有 1 个进程,如果进程个数不对,去对应目录下查看报错日志


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

      查看运行的hadoop、hive等软件是不是我们自己安装的,若不是,肯定是Impala自动安装的,需要删除

      (因为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
  1. 创建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';
  1. 查询数据

    • image.png
  2. 创建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>