开发者学堂课程【Sqoop 企业级大数据迁移方案实战:导入 Import--全量数据导入 Hdfs--并行度设置&注意事项】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/718/detail/12835
导入 Import--全量数据导入 Hdfs--并行度设置&注意事项
内容介绍:
一、并行度设置
二、注意事项
一、并行度设置
在全量导入 mysql 的时候怎么指定并行度,比如有一个表非常大,如果只启动一个 map 读写能力是不足的,如果想提高并行度,是通过参数-m 来表示,m 表示的是 maptask,默认是1个。但是参数并是可以指定为唯一唯二唯三这么简单,当中可能会出现一些问题。
打开脚本资料,刚才的操作是以1为例的,接下来以两个并行度进行导入,路径 genggaiwe214,其他保持不变。
按照正常的思路,把命令复制过来,在服务区上进行执行。
看起来很正常,但是发现执行过程中报错了,出现代码 error during import,在导入期间发生了错误,错误原因是在表里面没有找到他的主键,请明确一下根据哪个字段进行切割,或者通过一个-m 来进行。
以当前 Navicat 表中五条数据为例,如果启动两个-m,数据涉及到一个分配问题,一个 map 里面数据放两个,另外一个里面放三个,是二三分还是四二分,通过查看底层,如果表有主键的话,它会根据主键来进行相关的分配,但是如果没有主见,就需要指明根据哪个字段来进行分配?比如说根据 ID 来分配,当指定字段以后,他会首先去查这字段的最大值和最小值,看一下中间的区间,根据指定的并行度,做一个平均的划分,这是她底层的含义,所以说要么不加-m2,默认就是-m1,如果没有主键,需要指定字段,所以现在先复制一下参数,回到 notepad。首先做一个指令,根据 ID 来进行切割,通常来说都是使用数值类型的主键,如果以人名来切割没有任何意义,\表示没有立即结束。输入以下内容
bin/sqoop import \
- - connect jdbc: mysql://node-1 ; 3306/u3erdb \
- - username root\
- -password hadoop \
--target-dir / sqoopresult214 \
--fields-terminated-by '\t' \
--split-by id \
--table emp --m 2
执行过程中没有报错
在执行过程当中,可以看一下相关日志信息,他的读数据组件,不再是默认的 taskInputFormat,而是DBInputFormat,它是专门用于读取数据库的。后面出现了 BoundingValsQuery,边界范围查询,选择 ID 查找的最小值以及最大值,查询的最小值是1201,查询的最大值是1205,然后把它分成两个切片,因为启动了两个number of splits,所以最终的输出结果也是两个。
打开浏览器来验证一下,刷新,打开214
它有了两个文件,一个是 part-m-0000,一个是 part-m-0001,相当于把表中的数据分成两份,这两份是并行执行的,加大了导入时间,下载验证一下
里面只有两条记录,不出意外的话 part-m-0001中会有三条记录,这样就加大了并行度,
接下来把全量导入 MySQL 的数据需要的注意事项来做一个简单的小结。
二、注意事项
mysql 的地址尽量不要使用 localhost 请使用 ip 或者 host
如果不指定导入到 hdfs 默认分隔符是","
可以通过--fields-terminated-by "\t 指定具体的分隔符
如果表的数据比较大可以并行启动多个 maptask 执行导入操作,如果表没有主键,请指定根据哪个字段进行切分
bin/sqoop import \
--connect jdbc:mysq1://node-1:3306/userdb \
--username root \
--password hadoop \
--target-dir /s qoopresu1t214 \
--fields-terminated-by '\t' \
--split-by id \
--table emp --m 2