SPARK:一台强大的机器比。几台较小的机器
SPARK: one powerful machine Vs. several smaller machines
我正在使用一台具有 60GB 内存和 32 个内核的机器,在 AWS EC2 上使用 Spark 1.6.1。
我的数据包含大量记录,我想处理具有以下简单模式的 DataFrame,它有 1,000,000,000(十亿)条记录:
userID: Long
phrase: String
timestamp: Timestamp
我正在做一些昂贵的操作链,比如 groupBy、sort、filter...等等
这些操作导致大量随机写入和读取,并且缓存 DataFrame 或对其重新分区并没有多大帮助。
我发现很难理解为什么会这样,因为我知道机器能够将全部数据加载到内存中。
当我单击 Spark UI 上的执行程序选项卡时,我看到以下内容:
这是当我使用一台功能强大的机器时看到的正常视图,还是我错过了配置我的 Spark 集群?
关于 EC2 上 Spark 的最佳配置有什么建议吗?
谢谢
对不起,如果这听起来居高临下,但适合内存的数据负载几乎不是一个巨大的数据集。我这样说的原因是,Spark 不是为小数据负载而构建的,您正在支付 spark 内置的开销,以使其能够处理大型数据集和分布式环境。例如group by 通常意味着数据需要传送到远程机器,因此 shuffle 阶段组织数据以进行传送,然后由处理 shuffle 后的分区的远程机器读取。在您的情况下,您会看到所有这些都发生在一台机器上。
由于一切都适合一台机器,您可能需要检查替代解决方案 - 例如阅读 this
也就是说,您似乎没有使用机器上的所有内存(内存存储为 20G,而机器上为 60G)。因为看起来你是 运行 本地模式下的 Spark 将驱动程序内存设置为更高的东西(--driver-memory 56G
或类似的东西)还要确保使用 local[32]
所以你会得到所有的核心运行
我正在使用一台具有 60GB 内存和 32 个内核的机器,在 AWS EC2 上使用 Spark 1.6.1。
我的数据包含大量记录,我想处理具有以下简单模式的 DataFrame,它有 1,000,000,000(十亿)条记录:
userID: Long
phrase: String
timestamp: Timestamp
我正在做一些昂贵的操作链,比如 groupBy、sort、filter...等等
这些操作导致大量随机写入和读取,并且缓存 DataFrame 或对其重新分区并没有多大帮助。
我发现很难理解为什么会这样,因为我知道机器能够将全部数据加载到内存中。
当我单击 Spark UI 上的执行程序选项卡时,我看到以下内容:
这是当我使用一台功能强大的机器时看到的正常视图,还是我错过了配置我的 Spark 集群?
关于 EC2 上 Spark 的最佳配置有什么建议吗?
谢谢
对不起,如果这听起来居高临下,但适合内存的数据负载几乎不是一个巨大的数据集。我这样说的原因是,Spark 不是为小数据负载而构建的,您正在支付 spark 内置的开销,以使其能够处理大型数据集和分布式环境。例如group by 通常意味着数据需要传送到远程机器,因此 shuffle 阶段组织数据以进行传送,然后由处理 shuffle 后的分区的远程机器读取。在您的情况下,您会看到所有这些都发生在一台机器上。
由于一切都适合一台机器,您可能需要检查替代解决方案 - 例如阅读 this
也就是说,您似乎没有使用机器上的所有内存(内存存储为 20G,而机器上为 60G)。因为看起来你是 运行 本地模式下的 Spark 将驱动程序内存设置为更高的东西(--driver-memory 56G
或类似的东西)还要确保使用 local[32]
所以你会得到所有的核心运行