【问题标题】:Does Spark use data locality?Spark 是否使用数据局部性?
【发布时间】:2015-02-22 15:40:41
【问题描述】:

我正在尝试了解 Apache Spark 的内部结构。我想知道 Spark 在从 InputFormat 读取或写入 OutputFormat(或 Spark 原生支持且不是从 MapReduce 派生的其他格式)时是否使用某些机制来确保数据局部性。

在第一种情况下(阅读),我的理解是,在使用 InputFormat 时,拆分与包含数据的主机(或主机??)相关联,因此 Spark 尝试将任务分配给执行程序以减少网络尽可能转移。

在写作的情况下,这样的机制将如何运作?我知道从技术上讲,HDFS 中的文件可以保存在本地的任何节点中并复制到其他两个(因此您将网络用于 3 个副本中的两个),但是,如果您考虑写入其他系统,例如 NoSQL 数据库( Cassandra、HBase 等),这样的系统有自己的数据分发方式。有没有办法告诉 spark 根据输出接收器(目标 NoSQL 数据库,本机或通过 OutputFormat 看到的)预期数据分布优化数据局部性的方式对 RDD 进行分区?

我指的是 Spark 节点和 NoSQL 节点位于同一物理机中的环境。

【问题讨论】:

    标签: hadoop cassandra hbase apache-spark


    【解决方案1】:

    如果您在同一台物理机上使用 Spark 和 Cassandra,请查看 spark-cassandra-connector 它将确保读取和写入的数据本地性。

    例如,如果您将 Cassandra 表加载到 RDD 中,连接器将始终尝试在每个节点上本地对此 RDD 执行操作。 当您将 RDD 保存到 Cassandra 中时,连接器也会尝试在本地保存结果。

    这是假设您的数据已经在您的 Cassandra 集群中平衡。如果你的 PartitionKey 没有正确完成,你最终会得到一个不平衡的集群。

    还要注意 Spark 上的改组作业。例如,如果您对 RDD 执行 ReduceByKey,则无论如何您最终都会通过网络流式传输数据。因此,请务必仔细计划这些工作。

    【讨论】:

    • 大部分同意。但是,ReduceByKey 可以利用分区。如果您的 RDD 是成对的(即(键,值)),那么您可以执行pairedRdd.partitionBy(new HashPartitioner(100)) ,这将保留分区信息。然后,您可以执行 ReduceByKey,这将利用分区信息并进行本地缩减。这可以潜在地避免洗牌/网络成本。
    • 据我所知,spark-cassandra-connector 的写入位置意味着写入操作的协调节点将与运行给定写入任务的 spark 节点位于同一台机器上分区(LocalNodeFirst ...)。然后,协调器节点应将写入操作转发到 ONE/TWO/THREE/XX 副本。如果我正在使用一致性 ONE 进行批量写入,那么真正的优化将以协调节点仅在向连接器发送 OK 之前在本地写入数据的方式组织分区。这种情况是否可能(Cassandra 或任何其他数据库)?
    • 这是 Cassandra 批处理中的默认行为。虽然不建议使用批处理,但 WriteAsync 优化得更多(特别是在 cassandra Java 驱动程序中)。 Cassandra 中的写入策略和复制因子之间也存在差异。如果您写入 ONE 节点并使用 3 的复制因子,则协调节点将在一个节点的写入成功后回复 OK。然后复制过程将启动。您无需在写入时等待复制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-10
    • 2021-11-21
    • 1970-01-01
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多