用例说明:我想使用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,我无法弄清楚我在这里缺少什么
答案 0 :(得分:1)