优化阅读格式

This commit is contained in:
heibaiying
2019-07-31 17:18:07 +08:00
parent ceb868fe13
commit ca7c99802b
91 changed files with 4059 additions and 4058 deletions

View File

@ -41,7 +41,7 @@
### 1. 查询MySQL所有数据库
通常用于SqoopMySQL连通测试
通常用于 SqoopMySQL 连通测试:
```shell
sqoop list-databases \
@ -71,9 +71,9 @@ sqoop list-tables \
#### 1. 导入命令
示例导出MySQL数据库中的`help_keyword`表到HDFS`/sqoop`目录下,如果导入目录存在则先删除再导入,使用3个`map tasks`并行导入。
示例:导出 MySQL 数据库中的 `help_keyword` 表到 HDFS`/sqoop` 目录下,如果导入目录存在则先删除再导入,使用 3 个 `map tasks` 并行导入。
> help_keywordMySQL内置的一张字典表之后的示例均使用这张表。
> help_keywordMySQL 内置的一张字典表,之后的示例均使用这张表。
```shell
sqoop import \
@ -84,13 +84,13 @@ sqoop import \
--delete-target-dir \ # 目标目录存在则先删除
--target-dir /sqoop \ # 导入的目标目录
--fields-terminated-by '\t' \ # 指定导出数据的分隔符
-m 3 # 指定并行执行的map tasks数量
-m 3 # 指定并行执行的 map tasks 数量
```
日志输出如下,可以看到输入数据被平均`split`为三份,分别由三个`map task`进行处理。数据默认以表的主键列作为拆分依据,如果你的表没有主键,有以下两种方案:
日志输出如下,可以看到输入数据被平均 `split` 为三份,分别由三个 `map task` 进行处理。数据默认以表的主键列作为拆分依据,如果你的表没有主键,有以下两种方案:
+ 添加`-- autoreset-to-one-mapper`参数,代表只启动一个`map task`,即不并行执行;
+ 若仍希望并行执行,则可以使用`--split-by <column-name>` 指明拆分数据的参考列。
+ 添加 `-- autoreset-to-one-mapper` 参数,代表只启动一个 `map task`,即不并行执行;
+ 若仍希望并行执行,则可以使用 `--split-by <column-name>` 指明拆分数据的参考列。
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/sqoop-map-task.png"/> </div>
@ -103,7 +103,7 @@ hadoop fs -ls -R /sqoop
hadoop fs -text /sqoop/part-m-00000
```
查看HDFS导入目录,可以看到表中数据被分为3部分进行存储,这是由指定的并行度决定的。
查看 HDFS 导入目录,可以看到表中数据被分为 3 部分进行存储,这是由指定的并行度决定的。
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/sqoop_hdfs_ls.png"/> </div>
@ -116,7 +116,7 @@ sqoop export \
--connect jdbc:mysql://hadoop001:3306/mysql \
--username root \
--password root \
--table help_keyword_from_hdfs \ # 导出数据存储在MySQLhelp_keyword_from_hdf的表中
--table help_keyword_from_hdfs \ # 导出数据存储在 MySQLhelp_keyword_from_hdf 的表中
--export-dir /sqoop \
--input-fields-terminated-by '\t'\
--m 3
@ -134,7 +134,7 @@ CREATE TABLE help_keyword_from_hdfs LIKE help_keyword ;
### 4.1 MySQL数据导入到Hive
Sqoop导入数据到Hive是通过先将数据导入到HDFS上的临时目录然后再将数据从HDFS`Load`Hive中最后将临时目录删除。可以使用`target-dir`来指定临时目录。
Sqoop 导入数据到 Hive 是通过先将数据导入到 HDFS 上的临时目录,然后再将数据从 HDFS`Load`Hive 中,最后将临时目录删除。可以使用 `target-dir` 来指定临时目录。
#### 1. 导入命令
@ -146,18 +146,18 @@ sqoop import \
--table help_keyword \ # 待导入的表
--delete-target-dir \ # 如果临时目录存在删除
--target-dir /sqoop_hive \ # 临时目录位置
--hive-database sqoop_test \ # 导入到Hivesqoop_test数据库数据库需要预先创建。不指定则默认为default库
--hive-import \ # 导入到Hive
--hive-overwrite \ # 如果Hive表中有数据则覆盖这会清除表中原有的数据然后再写入
--hive-database sqoop_test \ # 导入到 Hivesqoop_test 数据库,数据库需要预先创建。不指定则默认为 default
--hive-import \ # 导入到 Hive
--hive-overwrite \ # 如果 Hive 表中有数据则覆盖,这会清除表中原有的数据,然后再写入
-m 3 # 并行度
```
导入到Hive中的`sqoop_test`数据库需要预先创建不指定则默认使用Hive中的`default`库。
导入到 Hive 中的 `sqoop_test` 数据库需要预先创建,不指定则默认使用 Hive 中的 `default` 库。
```shell
# 查看hive中的所有数据库
# 查看 hive 中的所有数据库
hive> SHOW DATABASES;
# 创建sqoop_test数据库
# 创建 sqoop_test 数据库
hive> CREATE DATABASE sqoop_test;
```
@ -178,11 +178,11 @@ sqoop import \
<br/>
如果执行报错`java.io.IOException: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf`则需将Hive安装目录下`lib`下的`hive-exec-**.jar`放到sqoop 的`lib`
如果执行报错 `java.io.IOException: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf`,则需将 Hive 安装目录下 `lib` 下的 `hive-exec-**.jar` 放到 sqoop 的 `lib`
```shell
[root@hadoop001 lib]# ll hive-exec-*
-rw-r--r--. 1 1106 4001 19632031 11月 13 21:45 hive-exec-1.1.0-cdh5.15.2.jar
-rw-r--r--. 1 1106 4001 19632031 11 13 21:45 hive-exec-1.1.0-cdh5.15.2.jar
[root@hadoop001 lib]# cp hive-exec-1.1.0-cdh5.15.2.jar ${SQOOP_HOME}/lib
```
@ -190,7 +190,7 @@ sqoop import \
### 4.2 Hive 导出数据到MySQL
由于Hive的数据是存储在HDFS上的所以Hive导入数据到MySQL实际上就是HDFS导入数据到MySQL。
由于 Hive 的数据是存储在 HDFS 上的,所以 Hive 导入数据到 MySQL实际上就是 HDFS 导入数据到 MySQL。
#### 1. 查看Hive表在HDFS的存储位置
@ -201,7 +201,7 @@ hive> use sqoop_test;
hive> desc formatted help_keyword;
```
`Location`属性为其存储位置:
`Location` 属性为其存储位置:
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/sqoop-hive-location.png"/> </div>
@ -221,7 +221,7 @@ sqoop export \
-input-fields-terminated-by '\001' \ # 需要注意的是 hive 中默认的分隔符为 \001
--m 3
```
MySQL中的表需要预先创建
MySQL 中的表需要预先创建:
```sql
CREATE TABLE help_keyword_from_hive LIKE help_keyword ;
@ -231,13 +231,13 @@ CREATE TABLE help_keyword_from_hive LIKE help_keyword ;
## 五、Sqoop 与 HBase
> 本小节只讲解从RDBMS导入数据到HBase因为暂时没有命令能够从HBase直接导出数据到RDBMS。
> 本小节只讲解从 RDBMS 导入数据到 HBase因为暂时没有命令能够从 HBase 直接导出数据到 RDBMS。
### 5.1 MySQL导入数据到HBase
#### 1. 导入数据
`help_keyword`表中数据导入到HBase上的 `help_keyword_hbase`表中,使用原表的主键`help_keyword_id`作为`RowKey`,原表的所有列都会在`keywordInfo`列族下,目前只支持全部导入到一个列族下,不支持分别指定列族。
`help_keyword` 表中数据导入到 HBase 上的 `help_keyword_hbase` 表中,使用原表的主键 `help_keyword_id` 作为 `RowKey`,原表的所有列都会在 `keywordInfo` 列族下,目前只支持全部导入到一个列族下,不支持分别指定列族。
```shell
sqoop import \
@ -247,10 +247,10 @@ sqoop import \
--table help_keyword \ # 待导入的表
--hbase-table help_keyword_hbase \ # hbase 表名称,表需要预先创建
--column-family keywordInfo \ # 所有列导入到 keywordInfo 列族下
--hbase-row-key help_keyword_id # 使用原表的help_keyword_id作为RowKey
--hbase-row-key help_keyword_id # 使用原表的 help_keyword_id 作为 RowKey
```
导入的HBase表需要预先创建
导入的 HBase 表需要预先创建:
```shell
# 查看所有表
@ -263,7 +263,7 @@ hbase> desc 'help_keyword_hbase'
#### 2. 导入验证
使用`scan`查看表数据:
使用 `scan` 查看表数据:
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/sqoop_hbase.png"/> </div>
@ -273,16 +273,16 @@ hbase> desc 'help_keyword_hbase'
## 六、全库导出
Sqoop支持通过`import-all-tables`命令进行全库导出到HDFS/Hive但需要注意有以下两个限制
Sqoop 支持通过 `import-all-tables` 命令进行全库导出到 HDFS/Hive但需要注意有以下两个限制
+ 所有表必须有主键;或者使用`--autoreset-to-one-mapper`,代表只启动一个`map task`;
+ 你不能使用非默认的分割列也不能通过WHERE子句添加任何限制。
+ 所有表必须有主键;或者使用 `--autoreset-to-one-mapper`,代表只启动一个 `map task`;
+ 你不能使用非默认的分割列,也不能通过 WHERE 子句添加任何限制。
> 第二点解释得比较拗口,这里列出官方原本的说明:
>
> + You must not intend to use non-default splitting column, nor impose any conditions via a `WHERE` clause.
全库导出到HDFS
全库导出到 HDFS
```shell
sqoop import-all-tables \
@ -294,14 +294,14 @@ sqoop import-all-tables \
-m 3
```
全库导出到Hive
全库导出到 Hive
```shell
sqoop import-all-tables -Dorg.apache.sqoop.splitter.allow_text_splitter=true \
--connect jdbc:mysql://hadoop001:3306/数据库名 \
--username root \
--password root \
--hive-database sqoop_test \ # 导出到Hive对应的库
--hive-database sqoop_test \ # 导出到 Hive 对应的库
--hive-import \
--hive-overwrite \
-m 3
@ -313,7 +313,7 @@ sqoop import-all-tables -Dorg.apache.sqoop.splitter.allow_text_splitter=true \
### 7.1 query参数
Sqoop支持使用`query`参数定义查询SQL从而可以导出任何想要的结果集。使用示例如下
Sqoop 支持使用 `query` 参数定义查询 SQL从而可以导出任何想要的结果集。使用示例如下
```shell
sqoop import \
@ -323,19 +323,19 @@ sqoop import \
--query 'select * from help_keyword where $CONDITIONS and help_keyword_id < 50' \
--delete-target-dir \
--target-dir /sqoop_hive \
--hive-database sqoop_test \ # 指定导入目标数据库 不指定则默认使用Hive中的default库
--hive-database sqoop_test \ # 指定导入目标数据库 不指定则默认使用 Hive 中的 default
--hive-table filter_help_keyword \ # 指定导入目标表
--split-by help_keyword_id \ # 指定用于split的列
--hive-import \ # 导入到Hive
--split-by help_keyword_id \ # 指定用于 split 的列
--hive-import \ # 导入到 Hive
--hive-overwrite \
-m 3
```
在使用`query`进行数据过滤时,需要注意以下三点:
在使用 `query` 进行数据过滤时,需要注意以下三点:
+ 必须用`--hive-table`指明目标表;
+ 如果并行度`-m`不为1或者没有指定`--autoreset-to-one-mapper`,则需要用` --split-by `指明参考列;
+ SQL`where`字句必须包含`$CONDITIONS`,这是固定写法,作用是动态替换。
+ 必须用 `--hive-table` 指明目标表;
+ 如果并行度 `-m` 不为 1 或者没有指定 `--autoreset-to-one-mapper`,则需要用 ` --split-by ` 指明参考列;
+ SQL`where` 字句必须包含 `$CONDITIONS`,这是固定写法,作用是动态替换。
@ -356,23 +356,23 @@ sqoop import \
-m 3
```
`incremental`参数有以下两个可选的选项:
`incremental` 参数有以下两个可选的选项:
+ **append**:要求参考列的值必须是递增的,所有大于`last-value`的值都会被导入;
+ **lastmodified**:要求参考列的值必须是`timestamp`类型,且插入数据时候要在参考列插入当前时间戳,更新数据时也要更新参考列的时间戳,所有时间晚于``last-value``的数据都会被导入。
+ **append**:要求参考列的值必须是递增的,所有大于 `last-value` 的值都会被导入;
+ **lastmodified**:要求参考列的值必须是 `timestamp` 类型,且插入数据时候要在参考列插入当前时间戳,更新数据时也要更新参考列的时间戳,所有时间晚于 ``last-value`` 的数据都会被导入。
通过上面的解释我们可以看出来其实Sqoop的增量导入并没有太多神器的地方就是依靠维护的参考列来判断哪些是增量数据。当然我们也可以使用上面介绍的`query`参数来进行手动的增量导出,这样反而更加灵活。
通过上面的解释我们可以看出来,其实 Sqoop 的增量导入并没有太多神器的地方,就是依靠维护的参考列来判断哪些是增量数据。当然我们也可以使用上面介绍的 `query` 参数来进行手动的增量导出,这样反而更加灵活。
## 八、类型支持
Sqoop默认支持数据库的大多数字段类型但是某些特殊类型是不支持的。遇到不支持的类型程序会抛出异常`Hive does not support the SQL type for column xxx`异常,此时可以通过下面两个参数进行强制类型转换:
Sqoop 默认支持数据库的大多数字段类型,但是某些特殊类型是不支持的。遇到不支持的类型,程序会抛出异常 `Hive does not support the SQL type for column xxx` 异常,此时可以通过下面两个参数进行强制类型转换:
+ **--map-column-java\<mapping>** 重写SQLJava类型的映射
+ **--map-column-hive \<mapping>** 重写HiveJava类型的映射。
+ **--map-column-java\<mapping>** :重写 SQLJava 类型的映射;
+ **--map-column-hive \<mapping>** 重写 HiveJava 类型的映射。
示例如下,将原先`id`字段强制转为String类型`value`字段强制转为Integer类型
示例如下,将原先 `id` 字段强制转为 String 类型,`value` 字段强制转为 Integer 类型:
```
$ sqoop import ... --map-column-java id=String,value=Integer