我试图理解sqoop作业中默认最大映射器背后的原因,并且我们可以在sqoop作业中设置四个以上的映射器以实现更多的并行性。
答案 0 :(得分:5)
如果在拆分中使用整数列,则默认的映射器数为4.强烈建议您始终使用整数列而不是字符串/ char / Text列。请参阅此处的代码以获取更多解释。 https://github.com/apache/sqoop/blob/660f3e8ad07758aabf0a9b6ede3accdfac5fb1be/src/java/org/apache/sqoop/mapreduce/db/TextSplitter.java#L100
是的,您可以通过指定-m来增加/减少并行度 来自Sqoop Guide的
Sqoop从大多数数据库源并行导入数据。您可以使用-m或--num-mappers参数指定要用于执行导入的映射任务(并行进程)的数量。这些参数中的每一个都采用整数值,该值对应于要使用的并行度。默认情况下,使用四个任务。某些数据库可能会通过将此值增加到8或16来提高性能。不要将并行度增加到大于MapReduce群集中可用的并行度;任务将以串行方式运行,并可能增加执行导入所需的时间。同样,不要将并行度提高到数据库可以合理支持的程度。将100个并发客户端连接到数据库可能会将数据库服务器上的负载增加到性能受损的程度。
执行并行导入时,Sqoop需要一个可以分割工作负载的标准。 Sqoop使用拆分列来分割工作负载。默认情况下,Sqoop将识别表中的主键列(如果存在)并将其用作拆分列。从数据库中检索拆分列的低值和高值,并且映射任务在总范围的大小均匀的组件上运行。例如,如果您的表的主键列id为最小值为0且最大值为1000,并且Sqoop被指示使用4个任务,则Sqoop将运行四个进程,每个进程执行SELECT *形式的SQL语句FROM sometable WHERE id> = lo AND id<嗨,(lo,hi)在不同的任务中设置为(0,250),(250,500),(500,750)和(750,1001)。
如果主键的实际值在其范围内不均匀分布,则可能导致任务不平衡。您应该使用--split-by参数明确选择不同的列。例如,--split-by employee_id。 Sqoop目前无法拆分多列索引。如果您的表没有索引列,或者有多列密钥,那么您还必须手动选择拆分列。
答案 1 :(得分:2)
我的猜测是4是一个默认数字,适用于大多数用例的练习。如果希望Sqoop使用不同数量的映射器,请使用参数--num-mappers。例如,要使用8个并发任务,您将使用以下sqoop命令:
sqoop import \
--connect jdbc:mysql://mysql.example.com/testdb \
--username abcdef \
--password 123456 \
--table test \
--num-mappers 8
使用更多映射器将导致更多的并发数据传输任务,从而可以加快作业完成速度。但是,它还会增加数据库的负载,因为Sqoop将执行更多的并发查询。您可能想要记住从生产环境中提取数据。
答案 2 :(得分:0)
当我们在将数据从 RDBMS 传输到 HDFS 文件系统时没有提到映射器的数量时,sqoop 将使用默认的映射器数量 4。Sqoop 从大多数数据库源并行导入数据。 Sqoop 仅在并行导入和导出时使用映射器。