【问题标题】:use spark to copy data across hadoop cluster使用 spark 跨 hadoop 集群复制数据
【发布时间】:2016-12-25 17:19:19
【问题描述】:

我有一种情况,我必须将数据/文件从 PROD 复制到 UAT(hadoop 集群)。为此,我现在使用'distcp'。但它需要永远。由于 distcp 在后台使用 map-reduce,有没有办法使用 spark 来加快处理速度?就像我们可以将 hive 执行引擎设置为'TEZ'(以替换map-reduce)一样,我们可以将执行引擎设置为distcp 的火花吗?或者是否有任何其他'spark' 方法可以跨集群复制数据,甚至可能不关心 distcp?

我的第二个问题来了(假设我们可以将distcp执行引擎设置为spark而不是map-reduce,否则请不要费心回答这个问题):- 据我所知,Spark 比 map-reduce 更快,主要是因为它将数据存储在内存中,可能需要多次处理,这样它就不必从磁盘一直加载数据。在这里,我们正在跨集群复制数据,因此无需多次处理一个文件(或块或拆分),因为每个文件将进入内存然后将通过网络发送,被复制到目标集群磁盘,该文件的故事结束。那么如果不使用主要功能,Spark 怎么会加快处理速度呢?

【问题讨论】:

  • 没有尝试过,但也许您实际上可以使用 Hive 来读取和写入(创建表作为选择)数据并在 Tez 或 Spark 上运行 Hive。关于第二部分 Spark的优势不仅在于使用内存,而且执行阶段的调度更好,因此它的顺序性不如MR

标签: hadoop apache-spark hdfs distcp bigdata


【解决方案1】:

批量跨集群 IO 的瓶颈通常是

  1. 集群之间的带宽
  2. 从源集群读取带宽
  3. 目标集群的写入带宽(使用 3 倍复制,写入确实会占用磁盘和交换机带宽)
  4. 为工作分配的空间(即执行者、任务的数量)

通常在长途上传时,您的长途网络是瓶颈:您不需要那么多工人来淹没网络。

有一个著名的故事,即两个 Yahoo! 之间的 distcp 操作。确实设法对部分主干做到这一点的集群:Hadoop ops 团队很高兴 distcp 运行如此之快,而网络 ops 团队则担心他们的核心服务由于两个站点之间的流量而受到某种程度的影响。我相信这个事件是distcp现在有-bandwidth选项的原因:)

在 distcp 中可能存在限制的地方,可能是在任务设置和执行中:提前决定要复制哪些文件,如果某些文件复制速度很快但其他文件复制速度很快,则重新安排工作的智能并不多(任何?)优秀。

Distcp 只是预先建立列表并将其交给特殊的 distcp 映射器,每个映射器读取其文件列表并将其复制过来。

有人可以尝试做一个 spark 版本的 distcp;如果有人想要更好地调度,这可能是一个有趣的项目,这依赖于 spark 在向现有执行器推送新工作方面非常有效的事实:spark 版本可以动态推送工作,而不是提前列出所有内容。实际上,它仍然可以在枚举要复制的文件时启动复制操作,从而加快启动时间。即便如此:跨集群带宽通常会成为瓶颈。

【讨论】:

    【解决方案2】:

    Spark 并非真正用于 Hadoop 集群之间的数据移动。您可能希望使用"-m" 选项为您的distcp 作业查看其他映射器。

    【讨论】:

    • From: hadoop.apache.org/docs/r2.7.2/hadoop-distcp/DistCp.html 我知道它指定了最多可以同时执行的地图任务。那么有什么方法可以知道我的集群最多同时执行了多少个(假设一个作业有 25 个拆分)?在不妨碍其他进程的情况下,我可以在多大程度上增加这个数字?我有 12 个节点 PROD 和 6 个节点 UAT,它们都有大约 250 GB 的物理内存和大约 45 TB 的磁盘空间。
    • 可能需要进行一些测试才能确定最佳设置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    相关资源
    最近更新 更多