Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Ignite TCP SPI发现和Ignite embedded中的内存管理_Scala_Apache Spark_Ignite - Fatal编程技术网

Scala Ignite TCP SPI发现和Ignite embedded中的内存管理

Scala 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) 我提

用例描述:我想使用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个核心CPU

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,我仍然无法找出我在这里缺少的内容

  • Discovery Spi与Apache Ignite节点一样在嵌入式模式下工作。因此,无论如何,您都需要正确配置Discovery Spi(尤其是Ip Finder)。您可以找到更多有关节点发现的详细信息,并选择更适合您的案例
  • 如果您不需要在spark作业中实例化ApacheIgnite,只需不创建IgniteContext对象即可
  • 我认为JVM占用了大量内存。您需要检查JVM设置

  • 谢谢你的回复,尼古拉。2) 我没有得到你的答案。我的问题是,如果我启动了一个包含4个执行器的spark作业,但希望Ignite上下文只在2个执行器上运行,而不是全部4个执行器上运行,该怎么办。我会在嵌入式模式下再次运行它。是否有办法在嵌入式模式下为Ignite上下文配置executor核心/节点设置?3) 如果你能更具体地说我应该看什么?我在这里用默认设置运行JVM。