点燃TCP SPI发现,并点燃内存管理嵌入式

时间:2017-11-19 19:23:04

标签: scala apache-spark ignite

用例说明:我想使用ignite嵌入式来维护内存缓存,以加快我的火花作业。

1)TCP SPI发现如何在点燃嵌入模式下工作? 文档指出,在点燃嵌入点时,点火节点的生命周期由spark管理,节点从spark作业本身内部启动和终止。因为,点燃节点绑定到YARN容器,所以仍然需要通过SPI配置吗?或者服务发现是自动/动态发生的吗?

2)建立在第一个问题上:我们如何开始发挥一个火花作业,比如4个火花执行器,但只发射2个点火节点?

3)我提供了一个我开发的示例代码,我的工作因超出内存而被杀死。我已经完成了原始文档中指定的容量规划页面。我的数据大约是300 MB,我预计在最坏的情况下它会消耗大约1.5 GB的内存,没有复制,并且在一个整数字段上有索引。

我的群集配置:1个主站 - 24 GB内存,2个核心CPU和2个从站 - 8GB内存,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:无法连接到任何地址frim IP finder(将每2秒重试一次加入拓扑)

WARN TCPCommunicationSpi:连接超时

WARN YarnSchedulerBackend $ YarnSchedulerEndpoint:由于超出内存限制而被YARN杀死的容器。考虑提升spark.yarn.executor.memoryOverhead

我已经将spark.yarn.executor.memoryOverhead参数增加到2 GB,并将执行者记忆增加到6GB。然而,考虑到我的数据大小仅为300 MB,我无法弄清楚我在这里缺少什么

1 个答案:

答案 0 :(得分:1)

  1. Discovery Spi像往常一样在嵌入式模式下运行Apache Ignite节点。所以你需要正确配置Discovery Spi(特别是Ip Finder)。有关节点发现的更多详细信息,您可以找到there并选择更适合您的情况。
  2. 如果您不需要在spark工作中使用Apache Ignite,请不要创建IgniteContext对象。
  3. 我认为你的JVM消耗了大部分内存。您需要检查JVM设置。