
# Impala客户端使用实践
Impala是用于处理存储在Hadoop集群中的大量数据的MPP（大规模并行处理）SQL查询引擎。 它是一个用C++和Java编写的开源软件。 与其他Hadoop的SQL引擎相比，它拥有高性能和低延迟的特点。
#### 背景信息
假定用户开发一个应用程序，用于管理企业中的使用A业务的用户信息，使用Impala客户端实现A业务操作流程如下：
**普通表的操作：**
- 创建用户信息表user_info。
- 在用户信息中新增用户的学历、职称信息。
- 根据用户编号查询用户姓名和地址。
- A业务结束后，删除用户信息表。
 表1用户信息 
| **编号**      | **姓名** | **性别** | **年龄** | **地址** |
|:---|:---|:---|:---|:---|
| 12005000201 | A      | 男      | 19     | A城市    |
| 12005000202 | B      | 女      | 23     | B城市    |
| 12005000203 | C      | 男      | 26     | C城市    |
| 12005000204 | D      | 男      | 18     | D城市    |
| 12005000205 | E      | 女      | 21     | E城市    |
| 12005000206 | F      | 男      | 32     | F城市    |
| 12005000207 | G      | 女      | 29     | G城市    |
| 12005000208 | H      | 女      | 30     | H城市    |
| 12005000209 | I      | 男      | 26     | I城市    |
| 12005000210 | J      | 女      | 25     | J城市    |
   
#### 前提条件
- 已安装客户端，例如安装目录为"/opt/hadoopclient"，以下操作的客户端目录只是举例，请根据实际安装目录修改。
- MRS 3.x之后至MRS 3.3.1-LTS之前的版本，Impala客户端节点（Euler2.9及以上操作系统）需要安装Python2版本。
 
#### 操作步骤
1. 以客户端安装用户，登录安装客户端的节点。
2. 执行以下命令，切换到客户端安装目录。 
   **cd /opt/hadoopclient**
   
   
3. 执行以下命令配置环境变量。 
   **source bigdata_env**
   
   
4. 如果集群为安全集群（开启了Kerberos认证），需要执行以下命令进行用户认证，普通模式直接跳过。 
   **kinit** *业务用户*
   
   
5. 运行Impala客户端命令，实现A业务。 
   直接执行Impala组件的客户端命令**impala-shell**
   如果需连接到其他主机，请使用**-i \<host:port\>** 选项，例如：**impala-shell -i 192.168.10.15:21000**。
   如果需要自动连接到特定的Impala数据库，请使用**-d \<database\>** 选项。例如，如果您的所有Kudu表都位于数据库"impala_kudu"中，则**-d impala_kudu**可以使用此数据库。
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
   - 默认情况下，**impala-shell**尝试连接到localhost的21000端口（MRS 3.3.1-LTS之前版本impala-shell默认连接端口为21000，MRS 3.3.1-LTS及之后版本impala-shell默认连接端口为21050）上的Impala守护程序。
   
   - MRS 3.6.0-LTS及之后版本：安全集群模式（开启了Kerberos认证），Impala默认开启SSL加密，请增加**--ssl**选项，例如：impala-shell -i xxx:21050 --ssl。
   
   - 退出Impala Shell，请使用**quit**命令。
    
   - **内部表的操作：**
     1. 根据[表1]创建用户信息表user_info并添加相关数据。
        ```
        create table user_info(id string,name string,gender string,age int,addr string);
        insert into table user_info(id,name,gender,age,addr) values("12005000201","A","男",19,"A城市");
        ```
        ......（其他语句相同）
        
     
     2. 在用户信息表user_info中新增用户的学历、职称信息。 以增加编号为12005000201的用户的学历、职称信息为例，其他用户类似。
        ```
        alter table user_info add columns(education string,technical string);
        ```
        
     
     3. 根据用户编号查询用户姓名和地址。 以查询编号为12005000201的用户姓名和地址为例，其他用户类似。
        ```
        select name,addr from user_info where id='12005000201';
        ```
        
     
     4. 删除用户信息表。
        ```
        drop table user_info;
        ```
        
      
   
   - **外部分区表的操作：**
     创建外部分区表并导入数据
     1. 创建外部表数据存储路径。 **kinit** *hive* （安全模式需要执行kinit，普通模式无需执行）
        ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
        用户hive需要具有Hive管理员权限。
        hdfs dfs -mkdir /hive
        hdfs dfs -mkdir /hive/user_info
        
     
     2. 创建外部表：
        ```
        create external table user_info(id string,name string,gender string,age int,addr string) partitioned by(year string) row format delimited fields terminated by ' ' lines terminated by '\n' stored as textfile location '/hive/user_info';
        ```
        ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
        - fields terminated指明分隔的字符,如按空格分隔，' '。
        
        - lines terminated 指明分行的字符，如按换行分隔，'\\n'。
        
        - /hive/user_info为数据文件的路径。
          
     
     3. 导入数据。
        1. 使用insert语句插入数据。
           ```
           insert into user_info partition(year="2018") values ("12005000201","A","男",19,"A城市");
           ```
           
        
        2. 使用load data命令导入文件数据。
           1. 根据[表1]数据创建文件。如，文件名为txt.log，以空格拆分字段，以换行符作为行分隔符。
           
           2. 上传文件至hdfs。 hdfs dfs -put txt.log /tmp
              
           
           3. 加载数据到表中。 load data inpath '/tmp/txt.log' into table user_info partition (year='2018');
              
            
         
     
     4. 查询导入数据。
        ```
        select * from user_info;
        ```
        
     
     5. 删除用户信息表。
        ```
        drop table user_info;
        ```
        
      
   
   
   
   
 
