Hadoop 执行时间随着映射作业的增加而增加

Hadoop 执行时间随着映射作业的增加而增加,hadoop,mapreduce,hbase,sqoop,Hadoop,Mapreduce,Hbase,Sqoop,我正在尝试使用sqoop导入将一些数据从MySQL迁移到HBase。下面是我正在使用的命令: sqoop import --connect jdbc:mysql://hostname/database --username username -P --query 'SELECT * FROM logs WHERE $CONDITIONS' --split-by log_id -m 4 --hbase-table logs --column-family cf --hbase-create-tab

我正在尝试使用sqoop导入将一些数据从MySQL迁移到HBase。下面是我正在使用的命令:

sqoop import --connect jdbc:mysql://hostname/database --username username -P
--query 'SELECT * FROM logs WHERE $CONDITIONS' --split-by log_id -m 4
--hbase-table logs --column-family cf --hbase-create-table
问题是,当没有任何映射增加时,执行时间会增加。由于并行处理是随着映射器的增加而完成的,因此理想情况下,执行时间实际上应该减少

这是模式

No. of Maps Time(in sec) 1 16 2 20 4 29 8 51 10 55 16 82 25 122 地图时间数(以秒为单位) 1 16 2 20 4 29 8 51 10 55 16 82 25 122

从上面可以看出,当只有一个映射器时,所需时间最少。知道原因是什么吗?我们将非常感谢您的帮助。

我的集群由一个namenode和两个datanode组成。

可能是同时运行多个查询时mySQL上的负载。另外,从总运行时间(16秒)来看,您正在导入非常小的数据,因此添加更多的映射会增加开销,但每个映射只处理一个小的数据段,因此开销不会被抵消。最后,您没有对您的集群说太多(我猜这是一个小测试),因此,如果您分配的映射器多于插槽,映射器将等待,直到有空闲插槽,这会增加更多的时间,甚至可能是同时运行多个查询时mySQL上的负载。另外,从总运行时间(16秒)来看,您正在导入非常小的数据,因此添加更多的映射会增加开销,但每个映射只处理一个小的数据段,因此开销不会被抵消。最后,你对你的集群没有说太多(我猜这是一个小测试),因此如果你分配的映射器比插槽多,映射器会等到有空闲插槽时再增加更多的时间

有多少数据?这是一个测试环境,因此只有大约25k条记录的小数据集,大小约为15MB。这基本上是零数据,因此您几乎肯定会被开销和数据库抖动所淹没。有多少数据?这是一个测试环境,因此有大约25k条记录的小数据集,大小约为15MB。这基本上是零数据,所以你几乎肯定会被开销和数据库抖动所淹没。是的,我在测试环境中使用小数据集进行测试,大约有25k条记录。我有两个数据节点,每个节点都有HBase region server,这意味着使用两个映射的过程应该比使用单个映射的过程快,但情况并非如此。两个映射并不意味着它们被发送到两个服务器,设置两个映射作业的4秒差异无关紧要。esp,因为我不确定这是否是一个仅映射的作业(即,在reducer中可能存在同步)。请注意,这里与hadoop的设计目的无关。设置多个map(和reduce)作业的开销被无法装入内存或单个服务器的大型数据集中获得的并行性所抵消。这种微不足道的延迟可能是分割作业的开销的一部分。希望这个问题在处理大数据集时会消失。是的,我正在测试环境中使用小数据集进行测试,有大约25k条记录。我有两个数据节点,每个节点都有HBase region server,这意味着使用两个映射的过程应该比使用单个映射的过程快,但情况并非如此。两个映射并不意味着它们被发送到两个服务器,设置两个映射作业的4秒差异无关紧要。esp,因为我不确定这是否是一个仅映射的作业(即,在reducer中可能存在同步)。请注意,这里与hadoop的设计目的无关。设置多个map(和reduce)作业的开销被无法装入内存或单个服务器的大型数据集中获得的并行性所抵消。这种微不足道的延迟可能是分割作业的开销的一部分。希望在处理大型数据集时,这个问题会逐渐消失。