
# 开源sqoop-shell工具使用指导
#### 概述
sqoop-shell是一个开源的shell工具，其所有功能都是通过执行脚本"sqoop2-shell"来实现的。
sqoop-shell工具提供了如下功能：
- 支持创建和更新连接器
- 支持创建和更新作业
- 支持删除连接器和作业
- 支持以同步或异步的方式启动作业
- 支持停止作业
- 支持查询作业状态
- 支持查询作业历史执行记录
- 支持复制连接器和作业
- 支持创建和更新转换步骤
- 支持指定行、列分隔符
sqoop-shell工具支持如下模式：
- 交互模式 通过执行不带参数的"sqoop2-shell"脚本，进入Loader特定的交互窗口，用户输入脚本后，工具会返回相应信息到交互窗口。
  
- 批量模式 通过执行"sqoop2-shell"脚本，带一个文件名作为参数，该文件中按行存储了多条命令，sqoop-shell工具将会按顺序执行文件中所有命令；或者在"sqoop2-shell"脚本后面通过"-c"参数附加一条命令，一次只执行一条命令。
  
sqoop-shell通过[表1]的命令来实现Loader各种功能。
 表1命令一览表 
| 命令      | 说明                                                                     |
|:---|:---|
| exit    | 表示退出交互模式。 该命令仅支持交互模式。 |
| history | 查看执行过的命令。 该命令仅支持交互模式。 |
| help    | 查看工具帮助信息。                                                              |
| set     | 设置服务端属性。                                                               |
| show    | 显示服务属性和Loader所有元数据信息。                                                  |
| create  | 创建连接器和作业。                                                              |
| update  | 更新连接器和作业。                                                              |
| delete  | 删除连接器和作业。                                                              |
| clone   | 复制连接器和作业。                                                              |
| start   | 启动作业。                                                                  |
| stop    | 停止作业。                                                                  |
| status  | 查询作业状态。                                                                |
   
#### 命令参考
- sqoop2-shell有两种获取登录认证信息的方式，第一种通过配置文件获取，具体配置项请参考[使用sqoop-shell工具导入数据到HDFS](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_1163.html)、[使用sqoop-shell工具导入数据到HBase](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_1164.html)；第二种方式则使用参数直接提供认证信息，这个方式有两种模式：密码模式和Kerberos认证模式。
- 进入交互模式命令 通过执行不带参数的"sqoop2-shell"脚本，进入sqoop工具窗口，逐条执行命令。
  通过读取配置文件获取认证信息：
  **./sqoop2-shell**
  通过密码模式认证：
  **./sqoop2-shell -uk false -u** *username* **-p** *encryptedPassword*
  命令中如果携带认证密码信息可能存在安全风险，在执行命令前建议关闭系统的history命令记录功能，避免信息泄露。
  通过Kerberos模式认证：
  **./sqoop2-shell -uk true -k** *user.keytab* **-s** *userPrincipal*
  系统显示如下信息：
  ```
  Welcome to sqoop client
  Use the username and password authentication mode
  Authentication success.
  Sqoop Shell: Type 'help' or '\h' for help.
  sqoop:000>
  ```
  
- 进入批量模式命令 进入批量模式有两种方式：
  - 通过执行"sqoop2-shell"脚本，带一个文本文件名作为参数，该文件中按行存储了多条命令，工具会按顺序执行该文件中的所有命令。使用这种方式有个限制条件，这个sh脚本必须放到当前用户的家目录下，如：/root/batchCommand.sh。 通过读取配置文件进行认证：
    **./sqoop2-shell** */root/batchCommand.sh*
    通过密码模式认证：
    **./sqoop2-shell -uk false -u** *username* **-p** *encryptedPassword* */root/batchCommand.sh*
    命令中如果携带认证密码信息可能存在安全风险，在执行命令前建议关闭系统的history命令记录功能，避免信息泄露。
    通过Kerberos模式认证：
    **./sqoop2-shell -uk true -k** *user.keytab* **-s** *userPrincipal* */root/batchCommand.sh*
    其中*batchCommand.sh*为用户自定义文本文件名称。
    
  
  - 通过执行"sqoop2-shell"脚本，在脚本后面通过"-c"参数附带一条命令，工具将执行该条命令。 通过取配置文件进行认证：
    **./sqoop2-shell** *-c expression*
    通过密码模式认证：
    **./sqoop2-shell -uk false -u** *username* **-p** *encryptedPassword* *-c expression*
    通过Kerberos模式认证：
    **./sqoop2-shell -uk true -k** *user.keytab* **-s** *userPrincipal* *-c expression*
    其中*expression*为附带的语句，其格式和第一种方式中的文本内语句格式一致。
    
   
- exit命令 该命令用于退出交互模式，仅在交互模式支持。
  示例：
  ```
  Welcome to sqoop client
  Use the username and password authentication mode
  Authentication success.
  Sqoop Shell: Type 'help' or '\h' for help.
  sqoop:000> exit
  10-5-211-9:/opt/hadoopclient/Loader/loader-tools-1.99.3/sqoop-shell#
  ```
  
- history命令 该命令用于查看已执行的命令，仅在交互模式支持。
  示例：
  ```
  sqoop:000> history
     0  show connector
     1  create connection -c 4
     2  show connections;
     3  show connection;
     4  show connection -a;
     5  show connections;
     6  show connection;
     7  show connection -x 53;
     8  show connection -x 52;
     9  show connection -x 2
    10  show connection -x 53;
    11  show connection
    12  show connection -x 53
    13  create job -x 53 -t import
    14  show connector
    15  create connection -c 5
    16  show connection -x 54
    17  exit
    18  show connector
    19  create connection -c 5
    20  exit
    21  show connector
    22  create connection -c 6
    23  create job -x 20 -t import
    24  start job -j 85 -s
    25  \x
    26  exit
    27  history
  sqoop:000>
  ```
  
- help命令 该命令用于查看工具帮助信息。
  示例：
  ```
  sqoop:000> help
  For information about Sqoop, visit: http://sqoop.apache.org/docs/1.99.3/index.html
  Available commands:
    exit    (\x  ) Exit the shell
    history (\H  ) Display, manage and recall edit-line history
    help    (\h  ) Display this help message
    set     (\st ) Set server or option Info
    show    (\sh ) Show server, connector, framework, connection, job, submission or option Info
    create  (\cr ) Create connection or job Info
    delete  (\d  ) Delete connection or job Info
    update  (\up ) Update connection or job Info
    clone   (\cl ) Clone connection or job Info
    start   (\sta) Start job
    stop    (\stp) Stop job
    status  (\stu) Status job
  For help on a specific command type: help command
  sqoop:000>
  ```
  
- set命令 set命令，用于设置客户端和服务端属性，支持如下属性：
  - server表示设置服务端连接属性。
    ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
    当设置了-u属性时，-h、-p、-w被会忽略。
    
  
  - option表示设置客户端属性。
    ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
    option通过键值对来赋值，例如：**set option --name verbose --value true**。
    
    | 属性类别   | 子属性          | 含义             |
    |:---|:---|:---|
    | server | -h,--host    | 服务IP地址         |
    | server | -p,--port    | 服务端口           |
    | server | -w,--webapp  | Tomcat应用名      |
    | server | -u,--url     | Sqoop服务URL     |
    | option | verbose      | 冗余模式，表示打印更多的信息 |
    | option | poll-timeout | 设置轮询超时时间       |
       
    
  
  
  示例：
  ```
  set option --name verbose --value false
  set server --host 10.0.0.1 --port 21351 --webapp loader
  ```
  
- show命令 该命令用于显示变量信息、存储元数据信息等。
  
  | 属性类别       | 子属性         | 含义            |
  |:---|:---|:---|
  | server     | -a,--all    | 显示所有server属性  |
  | server     | -p,--port   | 显示服务端口        |
  | server     | -w,--webapp | 显示Tomcat应用名   |
  | server     | -h,--host   | 显示服务的IP地址     |
  | option     | -name       | 显示指定名称的属性     |
  | connector  | -a,--all    | 显示所有连接类型信息    |
  | connector  | -c,--cid    | 显示指定ID的连接类型信息 |
  | framework  | 无           | 显示框架的元数据信息    |
  | connection | -a,--all    | 显示所有连接属性      |
  | connection | -x,--xid    | 显示指定ID的连接属性   |
  | connection | -n,--name   | 显示指定名称的连接属性   |
  | job        | -a,--all    | 显示所有作业信息      |
  | job        | -j,--jid    | 显示指定ID的作业信息   |
  | job        | -n,--name   | 显示指定名称的作业信息   |
  | submission | -j,--jid    | 显示指定作业的提交记录   |
  | submission | -d,--detail | 显示详细信息        |
     
  示例：
  ```
  show server -all
  show option --name verbose
  show connector -all
  show framework
  show connection -all
  show connection -n sftp-example
  show job -all
  show job -j 1
  show submission --jid 1
  show submission --jid 1 -d
  ```
  
- create命令
  该命令用于创建连接器或作业。
  
  | 属性类别       | 子属性         | 含义                                                                                                                                                                                                                                                                                                                                     |
  |:---|:---|:---|
  | connection | -c,--cid    | 指定连接器类型的ID                                                                                                                                                                                                                                                                                                                             |
  | connection | -cn,--cname | 指定连接器类型的名称                                                                                                                                                                                                                                                                                                                             |
  | job        | -x,--xid    | 指定连接器ID                                                                                                                                                                                                                                                                                                                                |
  | job        | -xn,--xname | 指定连接器名称                                                                                                                                                                                                                                                                                                                                |
  | job        | -t,--type   | 指定作业类型 可选值： - import  - export   |
     
  - 交互模式下，根据界面的提示逐一输入属性值。 创建连接器示例：
    ```
    create connection -c 1
    create connection -cn example
    ```
    创建作业示例：
    ```
    create job -x 1 -t import
    create job -xn job_example -t export
    ```
    
  
  - 批量模式下，需要先执行如下命令查看具体的属性，再对属性赋值。 **create job -t import -x 1 --help**
    执行该命令有两种方式：
    将命令保存到文本中，并在执行sqoop-shell脚本时将该文本作为附带参数：
    **./sqoop2-shell** *batchCommand.sh*
    使用-c参数，将需要执行的单条命令作为-c参数的输入：
    **./sqoop2-shell** *-c expression*
    可参考本节前文关于命令执行的描述。完整的命令语句可参考如下示例。
    创建连接器示例：
    ```
    create connection -c 4 --connector-connection-sftpPassword xxxxx --connector-connection-sftpServerIp 10.0.0.1 --connector-connection-sftpServerPort 22 --connector-connection-sftpUser root--name testConnection
    ```
    创建作业示例：
    ```
    create job -t import -x 1 --connector-file-inputPath /opt/tempfile --connector-file-fileFilter * --framework-output-outputDirectory /user/loader/1 --framework-output-storageType HDFS --framework-throttling-extractorSize 120 --framework-output-fileType TEXT_FILE --connector-file-splitType FILE -queue default -priority low -name newJob
    ```
    
  
  - 批量模式下，可以使用"-c"参数附带一条语句。 创建连接器示例：
    ```
    ./sqoop2-shell -c "create connection -c 4 --connector-connection-sftpPassword xxxxx --connector-connection-sftpServerIp 10.0.0.1 --connector-connection-sftpServerPort 22 --connector-connection-sftpUser root--name testConnection"
    ```
    
    
- update命令 该命令用于更新连接器或作业。
  
  | 属性类别       | 子属性      | 含义                                                                                                                            |
  |:---|:---|:---|
  | connection | -x,--xid | 指定连接器ID 说明： 更新连接器一定要带上密码属性。 |
  | job        | -j,--jid | 指定作业ID                                                                                                                        |
     
  - 交互模式 更新连接器示例：
    ```
    update connection --xid 1
    ```
    更新作业示例：
    ```
    update job --jid 1
    ```
    
  
  - 批量模式 更新连接器示例：
    ```
    update connection -x 6 --connector-connection-sftpServerPort 21 - --name sfp_130--connector-connection-sftpPassword xxxx
    ```
    更新作业示例：
    示例1：
    ```
    update job -jid 1 -name sftp2hdfs --connector-file-fileFilter *.txt
    ```
    示例2：
    ```
    ./sqoop2-shell -uk true -k /opt/loader/user.keytab -s luser /opt/loader/testupdate.txt
    ./sqoop2-shell -uk true -k /opt/loader/user.keytab -s luser -c "update job --jid 24 --name oracle-hive --connector-table-sql 'SELECT * FROM range_example WHERE replace(datadt,\'-\',\'\')='20240801' and \${CONDITIONS}'"
    ```
    ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
    更新作业可以将需要更新的命令写在文件中，例如"/opt/loader/testupdate.txt"（文件名自定义），也可以以--connector-table-sql来指定，后面跟随的sqlcmd需要用"'"单引号括起来，具体操作参考"更新作业示例-示例2"。涉及的命令还有connector-table-sql,connector-table-columns,connector-table-partitionColumn,connector-table-conditions,connector-table-queryCondition等。
    
   
- delete命令 该命令用于删除连接器或作业。
  
  | 属性类别       | 子属性       | 含义      |
  |:---|:---|:---|
  | connection | -x,--xid  | 指定连接器ID |
  | connection | -n,--name | 指定连接器名称 |
  | job        | -j,--jid  | 指定作业ID  |
  | job        | -n,--name | 指定作业名称  |
     
  示例：
  ```
  delete connection -x 1
  delete connection --name abc
  delete job -j 1
  delete job -n qwerty
  ```
  
- clone命令 该命令用于复制连接器或作业。
  
  | 属性类别       | 子属性      | 含义                                                                                                                               |
  |:---|:---|:---|
  | connection | -x,--xid | 指定连接器ID 说明： 复制连接器需要输入密码和连接器名称。 |
  | job        | -j,--jid | 指定作业ID                                                                                                                           |
     
  示例如下：
  ```
  clone job -j 1
  ```
  
- start命令 该命令用于启动作业。
  
  | 属性类别 | 子属性              | 含义     |
  |:---|:---|:---|
  | job  | -j,--jid         | 指定作业ID |
  | job  | -n,--name        | 指定作业名称 |
  | job  | -s,--synchronous | 是否同步   |
     
  异步启动作业示例：
  ```
  start job -j 1
  start job -n abc
  ```
  同步启动作业示例：
  ```
  start job -j 1 -s
  start job --name abc --synchronous
  ```
  
- stop命令 该命令用于停止作业。
  
  | 属性类别 | 子属性       | 含义     |
  |:---|:---|:---|
  | job  | -j,--jid  | 指定作业ID |
  | job  | -n,--name | 指定作业名称 |
     
  示例：
  ```
  stop job -j 1
  stop job -n abc
  ```
  
- status命令 该命令用于查询作业状态。
  
  | 属性类别 | 子属性      | 含义     |
  |:---|:---|:---|
  | job  | -j,--jid | 指定作业ID |
     
  查询状态时，可以使用"-s"参数，只查询作业的状态枚举。
  示例：
  ```
  status job -j 1
  status job -j 1 -s
  ```
  
 
#### create命令扩展属性
针对HDFS与SFTP服务器或RDB进行数据交换场景，MRS在开源sqoop-shell工具的基础上对create命令属性进行扩展，以达到在创建作业时指定行、列分隔符及转换步骤的目的。
表2create命令扩展属性 
| 属性                          | 说明                                                                               |
|:---|:---|
| fields-terminated-by        | 默认的列分隔符。                                                                         |
| lines-terminated-by         | 默认的行分隔符。                                                                         |
| input-fields-terminated-by  | 输入步骤的列分隔符，当不指定时，默认等于fields-terminated-by的值。                                      |
| input-lines-terminated-by   | 输入步骤的行分隔符，当不指定时，默认等于lines-terminated-by的值。                                       |
| output-fields-terminated-by | 输出步骤的列分隔符，当不指定时，默认等于fields-terminated-by的值。                                      |
| output-lines-terminated-by  | 输出步骤的行分隔符，当不指定时，默认等于lines-terminated-by的值。                                       |
| trans                       | 指定转换步骤，值为转换步骤文件所在的路径。当指定文件的相对路径时，默认为"sqoop2-shell"脚本所在路径下的文件。当配置了该属性，其他扩展属性都被忽略。 |
   
#### sqoop1对接MRS服务
1. 下载开源Sqoop，<https://www.apache.org/dyn/closer.lua/sqoo:p/1.4.7>。
2. 将下载好的sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz 包放入MRS集群master节点的/opt/sqoop目录下并解压。 
   **tar zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz**
   
   
3. 进入解压完成的目录，修改配置。 
   **cd /opt/sqoop/sqoop-1.4.7.bin__hadoop-2.6.0/conf**
   **cp sqoop-env-template.sh sqoop-env.sh**
   **vi sqoop-env.sh**
   添加配置：
   ```
   export HADOOP_COMMON_HOME=/opt/client/HDFS/hadoop
   export HADOOP_MAPRED_HOME=/opt/client/HDFS/hadoop
   export HIVE_HOME=/opt/Bigdata/MRS_1.9.X/install/FusionInsight-Hive-3.1.0/hive(请按照实际路径填写)
   export HIVE_CONF_DIR=/opt/client/Hive/config
   export HCAT_HOME=/opt/client/Hive/HCatalog
   ```
   
   

4. 添加系统变量，将"SQOOP_HOME"添加到PATH中。 
   **vi /etc/profile**
   添加以下信息：
   ```
   export SQOOP_HOME=/opt/sqoop/sqoop-1.4.7.bin__hadoop-2.6.0
   export PATH=$PATH:$SQOOP_HOME/bin
   ```
   
   
5. 执行以下命令复制jline-2.12.jar文件到lib文件下。 
   **cp /opt/share/jline-2.12/jline-2.12.jar /opt/sqoop/sqoop-1.4.7.bin__hadoop-2.6.0/lib**
   
   
6. 执行以下命令，在文件中添加下列配置。 
   **vim $JAVA_HOME/jre/lib/security/java.policy**
   ```
   permission javax.management.MBeanTrustPermission "register";
   ```
   
   
7. 执行以下命令，实现sqoop1对接MRS服务。 
   **source /etc/profile**
   
   
 
