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