我使用Sqoop将数据从Oracle导入Hadoop。在Oracle表中,我有大约2百万条记录,主键是我提供的分区字段。
我的sqoop工作已经完成,我得到了正确的数据,工作正在运行30分钟,直到现在一切都很好。
当我检查输出文件时,我看到第一个文件是圆形的1.4 GB,第二个文件是大约157.2 MB,最后一个文件(第20个文件)大约是10.4 MB而从3到19的所有其他文件都是0个字节。
我正在设置-m 20因为我想为我的工作运行20个映射器。
这是sqoop命令:
sqoop import --connect" CONNECTION_STRING" --query" SELECT * FROM WHERE AND \ $ CONDITIONS" --split-by .ID --target-dir / output_data -m 20
注意:我的群集足以处理20个映射器和数据库,同时也能够处理20个请求。
有什么想法吗?
答案 0 :(得分:5)
来自http://sqoop.apache.org/docs/1.4.5/SqoopUserGuide.html#_controlling_parallelism ...
如果主键的实际值不均匀分布 在其范围内,这可能导致不平衡的任务。
--split-by
参数可用于选择分布更好的列。通常,这会因数据类型而异。
答案 1 :(得分:1)
尝试使用不同的--split-by字段以获得更好的负载平衡。
答案 2 :(得分:0)
这是因为主键(ID)不是均匀分布的。因此,你的地图制作者没有被恰当地使用。因此,您必须使用其他字段进行均匀分布的拆分。