7.2.4. Controlling Parallelism
Sqoop从大多数数据库源并行导入数据。
可以指定map任务的个数,这可以通过-m或者--num-mappers参数。每个参数带一个整数---并发度。默认的,4个并发度。有一些数据库可以调整到8或者16会有更好地表现。不要将这个数字超过mr集群的最大值,任务一个接一个执行,有可能增加等待时间。同样的,也不要增加数据库服务器能支持的最大并发数,100个客户端可能会严重降低数据库的性能。当执行并行导入时,sqoop需要一个标准来分区。
sqoop使用一个列来分区。默认的,sqoop将使用主键列来分区。低值和高值将从数据库里查询出来,map任务执行一个划分。比如,如果有一个表格,有一个主键列id. 最小值0,最大值1000.sqoop默认使用4个任务,sqoop将启动4个进程,每个进程执行如下所示的SQL.SELECT * FROM sometable WHERE id >= lo AND id < hi, with (lo, hi) set to (0, 250), (250, 500), (500, 750), and (750, 1001)如果值不是均匀分布,就会导致不均衡工作。此时可以考虑换一个列,通过 --split-by参数,
比如:--split-by employee_idsqoop不支持多列。如果表格没有索引列,或者有一个组合索引,需要手动选择一个列。7.2.5. Controlling the Import Process
导入过程将使用JDBC.
有一些数据库可以使用自己的高速数据移动工具。比如,mysql提供mysqldump工具,这个工具可以从mysql导出数据到其它系统。通过指定--direct参数,sqoop就会尝试直接导入。效率比直接使用jdbc快。
目前,direct模式不支持导入大对象列, 当从postgresql导入且用direct模式时,每个文件可以指定最大大小,用--direct-split-size参数指定. 默认的,sqoop将导入表格foo到foo文件夹[HDFS]。比如,如果用户名是someuser,那么数据就会导入到/user/someuser/foo/(files)你可以调整父目录,通过--warehouse-dir参数。
$ sqoop import --connnect <connect-str> --table foo --warehouse-dir /shared \
...这个命令就会导致文件写入到文件夹/shared/foo/ directory.也可以显式的选择目标目录,比如:
$ sqoop import --connnect <connect-str> --table foo --target-dir /dest \ ...这样就会导入文件到/dest文件夹, --target-dir 不能和 --warehouse-dir一起使用。当使用direct模式,可以指定额外的参数给工具。
如果参数--在命令行里指定,后面的参数就直接发给工具。
比如:下面的命令指定编码方式$ sqoop import --connect jdbc:mysql://server.foo.com/db --table bar \ --direct -- --default-character-set=latin1默认的,如果目标文件夹已经在HDFS里存在了,sqoop将拒绝导入或者拒绝覆盖。可以使用--append参数,sqoop将导入数据到一个临时的目录,然后重命名文件到正常的目标文件夹里来避免冲突。7.2.6. Controlling type mapping
Sqoop预先配置来映射大多数SQL类型到合适的java/hive对象。
尽管如此,默认的映射可能不是对所有人都合适,可以通过--map-column-java来覆盖,或者通过--map-column-hive (for changing Hive mapping).Table 4. Parameters for overriding mapping
Argument Description--map-column-java <mapping> Override mapping from SQL to Java type for configured columns.--map-column-hive <mapping> Override mapping from SQL to Hive type for configured columns.Sqoop希望是逗号隔开的映射列表<name of column>=<new type>
比如:$ sqoop import ... --map-column-java id=String,value=IntegerSqoop将报异常如果一些配置的映射没有被使用。7.2.7. Incremental Imports[增量导入]
Sqoop提供一个增量导入模式,用来检索新生成的行。
下面的参数控制增量导入:Table 5. Incremental import arguments:Argument Description--check-column (col) Specifies the column to be examined when determining which rows to import. (the column should not be of type CHAR/NCHAR/VARCHAR/VARNCHAR/ LONGVARCHAR/LONGNVARCHAR)--incremental (mode) Specifies how Sqoop determines which rows are new. Legal values for mode include append and lastmodified.--last-value (value) Specifies the maximum value of the check column from the previous import.Sqoop支持两种类型的增量导入: 追加模式,最后修改模式。
可以使用--incremental参数来指定要执行的模式。当导入表格时,这个表格不断增加行,行的id不断增加,此时应该指定append模式,
指定包含row的id的列,这是通过 --check-column参数Sqoop导入行(行的id的值大于参数--last-value)另外一个就是支持lastmodified模式,什么情况下使用这种模式?
表格的数据可能会被更新,每次修改都会更新last-modified列为当前时间戳。列的值比--last-value指定的值新的列将会被导入。增量模式导入的最后,--last-value的值会打印到屏幕上。
当执行连续的导入,需要指定--last-value来保证新数据。这个会被自动处理,也是推荐模式。7.2.8. File Formats
可以导入数据以2种模式:
1)文本文件 2)SequenceFilesDelimited text是默认的文件导入格式
可以通过参数--as-textfile来指定这个参数将写字符串到文件里,一行一个文件,列之间有分隔符,可以是逗号,\t,或者其它字符下面的是一个例子:
1,here is a message,2010-05-012,happy new year!,2010-01-013,another message,2009-11-12这种格式对大多数非二进制的数据类型适用,也可以被Hive理解。2)SequenceFiles 是一种二进制格式,存储数据为特定数据类型。
这些数据类型被java类理解,sqoop将自动生成这些数据类型,这种格式支持二进制格式,适合存储二进制数据。或者那些会被MR程序处理,(reading from SequenceFiles is higher-performance than reading from text files, as records do not need to be parsed).Avro数据文件是一种紧凑的,有效的二进制格式,
Avro支持版本号, so that when, e.g., columns are added or removed from a table, previously imported data files can be processed along with new ones.默认的,数据没有被压缩,可以使用gzip算法压缩,通过-z或者--compress参数来指定,
或者指定任何Hadoop压缩方式,这是通过--compression-codec参数,这个适用于 SequenceFile, text, and Avro files.7.2.9. Large Objects
略
7.2.10. Importing Data Into Hive
略
7.2.11. Importing Data Into HBase
略
7.2.12. Additional Import Configuration Properties
略
7.3. Example Invocations
下面的例子描述了怎样使用导入工具:
基本导入EMPLOYEES表格,数据库corp
$ sqoop import --connect jdbc:mysql://db.foo.com/corp --table EMPLOYEES加上登陆:
$ sqoop import --connect jdbc:mysql://db.foo.com/corp --table EMPLOYEES \ --username SomeUser -PEnter password: (hidden)Selecting specific columns from the EMPLOYEES table:$ sqoop import --connect jdbc:mysql://db.foo.com/corp --table EMPLOYEES \ --columns "employee_id,first_name,last_name,job_title" 控制并发map$ sqoop import --connect jdbc:mysql://db.foo.com/corp --table EMPLOYEES \ -m 8 启用msql的直接模式$ sqoop import --connect jdbc:mysql://db.foo.com/corp --table EMPLOYEES \ --direct 存储数据为SequenceFiles,指定生成类名为com.foocorp.Employee:$ sqoop import --connect jdbc:mysql://db.foo.com/corp --table EMPLOYEES \ --class-name com.foocorp.Employee --as-sequencefile 指定文本模式下的分隔符:$ sqoop import --connect jdbc:mysql://db.foo.com/corp --table EMPLOYEES \ --fields-terminated-by '\t' --lines-terminated-by '\n' \ --optionally-enclosed-by '\"' 导入数据到Hive里:$ sqoop import --connect jdbc:mysql://db.foo.com/corp --table EMPLOYEES \ --hive-import 导入新employees: $ sqoop import --connect jdbc:mysql://db.foo.com/corp --table EMPLOYEES \ --where "start_date > '2010-01-01'" 改变split列:$ sqoop import --connect jdbc:mysql://db.foo.com/corp --table EMPLOYEES \ --split-by dept_id 校验是否导入成功:$ hadoop fs -ls EMPLOYEESFound 5 itemsdrwxr-xr-x - someuser somegrp 0 2010-04-27 16:40 /user/someuser/EMPLOYEES/_logs-rw-r--r-- 1 someuser somegrp 2913511 2010-04-27 16:40 /user/someuser/EMPLOYEES/part-m-00000-rw-r--r-- 1 someuser somegrp 1683938 2010-04-27 16:40 /user/someuser/EMPLOYEES/part-m-00001-rw-r--r-- 1 someuser somegrp 7245839 2010-04-27 16:40 /user/someuser/EMPLOYEES/part-m-00002-rw-r--r-- 1 someuser somegrp 7842523 2010-04-27 16:40 /user/someuser/EMPLOYEES/part-m-00003$ hadoop fs -cat EMPLOYEES/part-m-00000 | head -n 10
0,joe,smith,engineering1,jane,doe,marketing...执行增量导入,之前已经导入了100,000行数据。
$ sqoop import --connect jdbc:mysql://db.foo.com/somedb --table sometable \ --where "id > 100000" --target-dir /incremental_dataset --append 数据库:corp,表格:EMPLOYEES,使用验证机制$ sqoop import --connect jdbc:mysql://db.foo.com/corp \ --table EMPLOYEES --validate