功能
1、SQL on Hadoop,是Hadoop生态官方提供的用于实现关系型数据库(Oracle,MySQL等)和Hadoop之间的离线数据传输工具。客户端命令行工具,最终会转化为MR任务来执行从关系型数据库到Hadoop的数据存储,如HDFS,HIVE,HBASE(导入),或者Hadoop到关系型数据库(导出)。
2、运行原理:通过SQL查询源数据库获取数据后,将数据按照指定的 hdfs 文件格式写入到 hdfs 文件。
核心配置参数
目标目录参数
--target-dir:指定 HDFS 上存储导入数据的目标目录。示例:--target-dir /user/hadoop/employees_data
--append:若目标目录已存在,用此参数可将新数据追加到现有数据中。
--overwrite:若目标目录已存在,使用该参数会覆盖目录中的现有数据。 |
目标目录下的文件
1、目录下的文件数量由并行 mapper 的数量决定,即 --num-mappers 参数。
2、文件命名方式
part-m-4位序列号,如2个mapper,则包含2个文件,part-m-0001,part-m-0002。
3、增量导入
如果没有使用 --append 参数,则每执行一次增量导入,则产生mapper数量个新文件,序号递增。
示例
全量为part-m-0001,part-m-0002,后面第一次执行增量,产生新文件part-m-0003,part-m-0004;第二次执行一次增量,产生新文件part-m-0005,part-m-006,依次类推。
如果使用了--append 参数(一般只有增量模式--incremental为 append 时,使用这个参数),则后续执行多次增量还是在 part-m-0001 和 part-m-0002 文件追加。
4、文件太大是否产生新文件
当全量数据过多或者当多次增量追加到同一个文件,导致一个文件超过了HDFS的文件块大小(默认128MB),则 HDFS 内部会将一个文件拆分为多个块,但是对外还是同一个文件名,如part-m-0001。 |
数据格式参数
1、文本格式,默认为文本格式
--fields-terminated-by:指定字段分隔符,默认是制表符(\t)。示例:--fields-terminated-by ','
--lines-terminated-by:指定行分隔符,默认是换行符(\n)。示例:--lines-terminated-by '\r\n'
--null-string:指定在文本文件中表示 NULL 值的字符串。示例:--null-string 'nan'
--null-non-string:指定非字符串列中表示 NULL 值的字符串。示例:--null-non-string 'nan'
字段类型
(1)内部默认转换:全部数据库类型均转为string
2、SequenceFile二进制键值格式
--as-sequencefile
字段类型
(1)内部默认转换:数据库类型转换为java数据类型
(2)--map-column-java:指定字段的java数据类型映射,sqoop内部会将java数据类型转为Parquet数据类型,示例:--map-column-java id=Integer,name=String,age=Integer
3、Parquet列式存储格式
--as-sequencefile
字段类型
(1)内部默认转换:数据库类型转换为Parquet数据类型
(2)创建hive外表指定字段类型,导入到hive来间接指定hdfs的Parquet数据类型。
(3)--map-column-java:指定字段的java数据类型映射,sqoop内部会将java数据类型转为Parquet数据类型,示例:--map-column-java id=Integer,name=String,age=Integer
4、Arvo序列化格式
--as-avrodatafile
字段类型
(1)内部默认转换:数据库类型转换为Avro数据类型
(2)--avro-schema-file:用于指定字段的arvo数据类型映射,创建一个your_schema.avsc文件,指定字段名和avro数据类型。示例,--avro-schema-file /path/to/your_schema.avsc |
增量导入参数
--check-column:指定用于增量导入的列,通常是自增主键或时间戳列。示例:--check-column id
--incremental:指定增量导入模式,有 append(追加模式,即只有新增的数据)和 lastmodified(最后修改模式,有新增和修改的数据)。示例:--incremental append
--last-value:指定上次导入的最后一个值,Sqoop 仅导入该值之后的数据。示例:--last-value 100
--append:将新增数据追加到目标目录下的已有文件中
说明
1、基于check-column指定的字段,如果incremental是append模式,则找大于last-value指定的id的数据,即新增的数据。
如果是 lastmodified 模式,这基于last-value指定的时间戳,只查找大于这个时间戳的数据,即新增或者更新的数据。
2、注意以上2种模式只是定义了如何从源数据库查找数据,而不是如何存储数据到HDFS中。如何存储到hdfs中,默认为每次执行增量都产生新文件,如果使用了–append 参数,则追加到原来的文件。 |