运行 Sqoop 导入和导出时如何找到最佳映射器数量?
Posted
技术标签:
【中文标题】运行 Sqoop 导入和导出时如何找到最佳映射器数量?【英文标题】:How to find optimal number of mappers when running Sqoop import and export? 【发布时间】:2013-05-17 22:23:53 【问题描述】:我使用的是 Sqoop 1.4.2 版和 Oracle 数据库。
运行 Sqoop 命令时。比如这样:
./sqoop import \
--fs <name node> \
--jt <job tracker> \
--connect <JDBC string> \
--username <user> --password <password> \
--table <table> --split-by <cool column> \
--target-dir <where> \
--verbose --m 2
我们可以指定 --m - 我们希望 Sqoop 运行多少并行任务(它们也可能同时访问数据库)。 同样的选项可用于 ./sqoop export <...>
是否有一些启发式方法(可能基于数据大小)来帮助猜测要使用的最佳任务数量?
谢谢!
【问题讨论】:
不,这取决于您的数据库服务器拥有的 CPU/内核数量、每个任务需要的磁盘访问量、这些磁盘的速度、每个任务在 RAM 中执行的数量,RAM 的数量,无法存储在 RAM 中的内容占用的额外临时表空间的数量,正在使用的文件系统,分配给操作系统而不是数据库的 RAM 数量,可能是开关的大小和网络电缆以及针对数据库和/或服务器运行的其他进程的数量以及所有上述因素如何影响它们,等等。测试它。 @Ben - 我会提交这个作为答案 【参考方案1】:这摘自 O'Reilly Media 的 Apache Sqoop Cookbook,似乎是最合乎逻辑的答案。
映射器的最佳数量取决于许多变量:您需要考虑您的数据库类型、用于数据库服务器的硬件以及对数据库需要服务的其他请求的影响。没有最佳数量的映射器 适用于所有场景。相反,我们鼓励您尝试为您的环境和用例找到最佳的并行度。最好从少量映射器开始,慢慢增加,而不是从大量映射器开始,逐步降低。
【讨论】:
【参考方案2】:在“Hadoop:权威指南”中,他们解释说,在每个 Tasktracker 上设置最大 map/reduce 任务时,请考虑处理器及其内核来定义集群的任务数量,因此我会应用相同的逻辑对此并查看您可以在处理器上运行多少个进程(计算 HyperTreading、Cores)并将 --m 设置为此值 - 1(为导出期间可能弹出的其他任务保留一个打开) 但这只适用于您拥有大型数据集并希望及时完成导出的情况。
如果您没有大型数据集,请记住您的输出将是 --m 文件数的值,因此如果您要导出 100 行表,您可能需要将 --m 设置为 1将所有数据本地化到一个文件中。
【讨论】:
如果您要投反对票,请留下建设性的批评意见,以便我改进答案。 那是对不同问题的回答。我没有否决它。但是 sqoop 的问题是每个映射器都在访问数据库。因此,如果我有 30 台机器,每台机器有 2 个映射器代表,而我使用 -m 60 数据库会非常不满意 :) 您不会将其设置为 60。您可以将其设置为 2...,因为此设置将应用于集群中的每台机器。因此,每台机器将使用两个映射器,总共部署了 60 个映射器,具体取决于 sqoop api 是否将此作为建议或硬设置。 @Engineiro,您确定此设置适用于集群中的每个数据节点吗?我们刚刚在 7 节点集群上尝试了一个示例,映射器设置为 15,但我们最终得到了 15 个文件,而不是 105 个文件 (7 * 15)。 不完全是错:sqoop.apache.org/docs/1.4.5/SqoopUserGuide.html "7.2.4. 控制并行性" 我们不控制每台机器运行多少个映射器,而是我们总共部署了多少个映射器.感谢您提问@DaveMorris以上是关于运行 Sqoop 导入和导出时如何找到最佳映射器数量?的主要内容,如果未能解决你的问题,请参考以下文章