我需要一个机制,能够自动知道当前Spark集群的状态在我的代码,以决定有多少资源,我的代码应该要求。
我看到这个:spark:get number of cluster cores programmably
但是:
他们的答案是错的, java.lang.Runtime.getRuntime.availableProcessors
告诉你物理机器上有多少个内核,但是你可以启动一个spark worker,它有#cores of worker<#机器上的实际内核数。这在Kubernetes甚至是一种常见的做法。
没有办法提取记忆。再说一次,你不能打电话 java.lang.Runtime
因为它同样只显示有关主机的信息。而且更常见的做法是使大小不匹配,因为当内存超过30gb时,所有这些问题都会出现在java中。
那么,有没有一种方法,我可以务实地提取准确的信息,就像他们在localhost:8080?
我不能同时移动到Yarn,我知道这会解决问题,但它太复杂了。
我知道我可以从url解析结果,但那太复杂了。
一些尝试无效: sparkContext.executorMemory()
这只返回您请求的内存。 sparkContext.defaultParallelism()
这将正确返回内核总数,但不会返回一个辅助进程上的内核数。
1条答案
按热度按时间lxkprmvk1#
显然,如果你能假设你所有的员工都是相同的——这是一个比上述所有假设好得多的假设,但有时仍然可能是错误的——你可以使用
sparkContext.defaultParallelism() / (sparkContext.statusTracker().getExecutorInfos().length - 1)
获取核心数。仍然没有找到一种方法来提取分配给每个工作者的确切内存。