Scala Ignite TCP SPI发现和Ignite embedded中的内存管理
用例描述:我想使用ignite embedded来维护内存缓存,以加速spark作业 1) TCP SPI发现如何在ignite嵌入式模式下工作? 文档说明,在ignite embedded中,ignite节点的生命周期由spark管理,节点从spark作业本身内部启动和终止。由于ignite节点绑定到纱线容器,因此仍然需要通过SPI配置吗?或者服务发现是否自动/动态发生 2) 基于第一个问题:我们如何启动一个spark作业,比如说,4个spark执行器,但只启动2个ignite节点 3) 我提供了一个示例代码,我在下面开发了该代码,由于超出内存,我的工作被终止。我已经阅读了原始文档中指定的容量规划页面。我的数据大约是300 MB,我预计在最坏的情况下,它将消耗大约1.5 GB的内存,没有复制,并在一个整数字段上建立索引 我的群集配置:1个主机-24 GB内存,2个核心CPU和2个从机-8 GB内存,2个核心CPUScala Ignite TCP SPI发现和Ignite embedded中的内存管理,scala,apache-spark,ignite,Scala,Apache Spark,Ignite,用例描述:我想使用ignite embedded来维护内存缓存,以加速spark作业 1) TCP SPI发现如何在ignite嵌入式模式下工作? 文档说明,在ignite embedded中,ignite节点的生命周期由spark管理,节点从spark作业本身内部启动和终止。由于ignite节点绑定到纱线容器,因此仍然需要通过SPI配置吗?或者服务发现是否自动/动态发生 2) 基于第一个问题:我们如何启动一个spark作业,比如说,4个spark执行器,但只启动2个ignite节点 3) 我提
import java.io.Serialisable
import org.apache.spark._
import org.apache.ignite.spark._
import org.apache.ignite.configuration._
import org.apache.ignite.spi.discovry.tcp.ipfinder.vm.TCPDiscoveryVmIpFinder
import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi
import java.util.Arrays
import org.apache.spark.sql._
import org.apache.ignite.cache.query.annotations.QuerySqlField
import scala.annotation.meta.field
import org.apache.ignite._
val ic= new IgniteContext(sc, () => {
new discoveryspi= new TcpDiscoverySpi()
val finder= new TCPDiscoveryVmIpFinder()
finder.setAddresses(Arrays.asList("127.0.0.1:47500")) //and more ip address in my cluster
discoveryspi.setIpFinder(finder)
val dataStorage= new DataStorageConfiguration()
dataStorage.getDefaultDataRegionConfiguration().setMaxSize(16L*1024*1024*1024) //16GB
val cfg= new IgniteConfiguration()
cfg.setDiscoverySpi(discoveryspi)
cfg.setDataStorageConfiguration(dataStorage)
cfg}, false)
case class User(
@(QuerySqlField @field)(index=true) id: Int,
@(QuerySqlField @field) gender: String,
@(QuerySqlField @field) marks: Int
) extends Serialisable
val cacheCfg= new CacheConfiguration[Int, User]("sharedRDD")
cacheCfg.setIndexedTypes(classOf[Int], classOf[User])
cacheCfg.setCacheMode(CahceMode.PARTITIONED)
val df2= spark.sql("select * from db_name.User") //read data from hive table
val df2_rdd= df2.rdd
val data_rdd= df2_rdd.map(x=> User(x.getInt(0), x.getString(1), x.getInt(2)))
val tcache: IgniteRDD[Int, User]= ic.fromCache(cacheCfg)
tcache.savePairs(data_rdd.map(x=> (x.id, x)))
val result= tcache.sql("select * from User u1 left join User u2 on(u1.id=u2.id)") //test query for self join
在我进行自连接之前,此程序工作正常。像“select*from User limit 5”这样的简单查询工作得非常好
错误日志:
WARN TcpDiscoverySpi:无法连接到任何addres frim IP finder(将每隔2秒重试加入拓扑)
警告TCPCommunicationSpi:连接超时
WARN YarnSchedulerBakend$YarnSchedulerEndpoint:容器因超出内存限制而被Thread杀死。考虑提升火花.纱线.执行器.内存开销
我已经将spark.Thread.executor.memoryOverhead参数增加到2GB,executor Memory参数增加到6GB。然而,考虑到我的数据大小只有300 MB,我仍然无法找出我在这里缺少的内容
谢谢你的回复,尼古拉。2) 我没有得到你的答案。我的问题是,如果我启动了一个包含4个执行器的spark作业,但希望Ignite上下文只在2个执行器上运行,而不是全部4个执行器上运行,该怎么办。我会在嵌入式模式下再次运行它。是否有办法在嵌入式模式下为Ignite上下文配置executor核心/节点设置?3) 如果你能更具体地说我应该看什么?我在这里用默认设置运行JVM。