我正在尝试在Spark应用程序中对Ignite进行写入/读取。读写似乎都可以正常工作,但是即使应用程序完成了必须要做的工作,它也不会结束。
特别是日志继续打印相同的行:
2018-10-23 09:08:12 DEBUG GridCachePartitionExchangeManager:558 - Before waiting for exchange futures [futs[], worker=GridWorker [name=partition-exchanger, igniteInstanceName=null, finished=false, hashCode=215498915, interrupted=false, runner=exchange-worker-#35]]
2018-10-23 09:08:12 DEBUG GridTimeoutProcessor:558 - Timeout has occurred [obj=CancelableTask [id=2374d20a661-967c7da2-84ed-46d9-9ec1-fd64ab02e16a, endTime=1540285692400, period=2000, cancel=false, task=org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing$13@2e49ebc1], process=true]
2018-10-23 09:08:14 DEBUG GridTimeoutProcessor:558 - Timeout has occurred [obj=CancelableTask [id=3374d20a661-967c7da2-84ed-46d9-9ec1-fd64ab02e16a, endTime=1540285694375, period=3000, cancel=false, task=org.apache.ignite.internal.processors.query.GridQueryProcessor$2@579e2347], process=true]
2018-10-23 09:08:14 DEBUG GridTimeoutProcessor:558 - Timeout has occurred [obj=CancelableTask [id=2374d20a661-967c7da2-84ed-46d9-9ec1-fd64ab02e16a, endTime=1540285694400, period=2000, cancel=false, task=org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing$13@2e49ebc1], process=true]
2018-10-23 09:08:14 DEBUG GridTimeoutProcessor:558 - Timeout has occurred [obj=CancelableTask [id=4374d20a661-967c7da2-84ed-46d9-9ec1-fd64ab02e16a, endTime=1540285694437, period=3000, cancel=false, task=MetricsUpdater [prevGcTime=337, prevCpuTime=16515, super=org.apache.ignite.internal.managers.discovery.GridDiscoveryManager$MetricsUpdater@1fad637f]], process=true]
2018-10-23 09:08:15 DEBUG TcpCommunicationSpi:558 - Balancing data [min0=0, minIdx=0, max0=-1, maxIdx=-1]
2018-10-23 09:08:16 DEBUG GridTimeoutProcessor:558 - Timeout has occurred [obj=CancelableTask [id=1374d20a661-967c7da2-84ed-46d9-9ec1-fd64ab02e16a, endTime=1540285696182, period=10000, cancel=false, task=org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing$12@1c86b2f2], process=true]
2018-10-23 09:08:16 DEBUG ClientListenerProcessor:558 - Balancing data [min0=0, minIdx=0, max0=-1, maxIdx=-1]
2018-10-23 09:08:16 DEBUG GridTimeoutProcessor:558 - Timeout has occurred [obj=CancelableTask [id=2374d20a661-967c7da2-84ed-46d9-9ec1-fd64ab02e16a, endTime=1540285696405, period=2000, cancel=false, task=org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing$13@2e49ebc1], process=true]
2018-10-23 09:08:17 DEBUG GridCachePartitionExchangeManager:558 - Before waiting for exchange futures [futs[], worker=GridWorker [name=partition-exchanger, igniteInstanceName=null, finished=false, hashCode=215498915, interrupted=false, runner=exchange-worker-#35]]
以此类推。
有时还会打印:
2018-10-23 09:07:59 INFO IgniteKernal:566 -
Metrics for local node (to disable set 'metricsLogFrequency' to 0)
^-- Node [id=a7f30542, uptime=00:01:00.019]
^-- H/N/C [hosts=2, nodes=4, CPUs=4]
^-- CPU [cur=1.67%, avg=9.47%, GC=0%]
^-- PageMemory [pages=0]
^-- Heap [used=278MB, free=69.36%, comm=478MB]
^-- Non heap [used=129MB, free=-1%, comm=130MB]
^-- Outbound messages queue [size=0]
^-- Public thread pool [active=0, idle=0, qSize=0]
^-- System thread pool [active=0, idle=4, qSize=0]
我只是在Ignite上进行非常简单的读/写操作,并且在使用...配置读/写器时
.option(IgniteDataFrameSettings.OPTION_CONFIG_FILE, path)
path
对应于以下配置文件:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="org.apache.ignite.configuration.IgniteConfiguration">
<!-- Enabling Apache Ignite native persistence. -->
<property name="dataStorageConfiguration">
<bean class="org.apache.ignite.configuration.DataStorageConfiguration">
<property name="defaultDataRegionConfiguration">
<bean class="org.apache.ignite.configuration.DataRegionConfiguration">
<property name="persistenceEnabled" value="true"/>
</bean>
</property>
</bean>
</property>
</bean>
</beans>
更新:
设置如下。我目前正在使用Vagrant + Ansible + VirtualBox来运行三台计算机。第一个运行Spark Master,其他运行Spark Worker。在所有机器上都配置了Ignite,但仅在工作服务器上使用ignite.sh
脚本运行它。它配置为启用了持久性,因此也可以通过发出control.sh --activate
来激活集群。
一切正常,我可以使用REST API对数据进行事件查询,唯一似乎不起作用的事情是使应用程序保持运行状态。
更新2:
@StephenDarlington的建议部分起作用。在应用程序末尾关闭Spark上下文,使执行程序完成任务。另一方面,从UI上我现在可以看到0个应用程序正在运行,但是驱动程序仍处于运行状态。
这是驱动程序的标准输出:
2018-10-26 11:05:37 DEBUG G:558 - Ignite instance stopped ok: null
2018-10-26 11:05:37 INFO StandaloneSchedulerBackend:54 - Shutting down all executors
2018-10-26 11:05:37 INFO CoarseGrainedSchedulerBackend$DriverEndpoint:54 - Asking each executor to shut down
2018-10-26 11:05:37 INFO MapOutputTrackerMasterEndpoint:54 - MapOutputTrackerMasterEndpoint stopped!
2018-10-26 11:05:37 INFO MemoryStore:54 - MemoryStore cleared
2018-10-26 11:05:37 INFO BlockManager:54 - BlockManager stopped
2018-10-26 11:05:37 INFO BlockManagerMaster:54 - BlockManagerMaster stopped
2018-10-26 11:05:37 INFO OutputCommitCoordinator$OutputCommitCoordinatorEndpoint:54 - OutputCommitCoordinator stopped!
2018-10-26 11:05:37 INFO SparkContext:54 - Successfully stopped SparkContext
2018-10-26 11:05:39 DEBUG PoolThreadCache:81 - Freed 25 thread-local buffer(s) from thread: shuffle-server-7-2
2018-10-26 11:05:39 DEBUG PoolThreadCache:81 - Freed 31 thread-local buffer(s) from thread: rpc-server-5-1
2018-10-26 11:05:39 DEBUG PoolThreadCache:81 - Freed 4 thread-local buffer(s) from thread: rpc-server-5-2
答案 0 :(得分:0)
因此,您正在Standalone mode中运行与Spark的Ignite集成。
在这种模式下,Ignite节点独立于Spark运行,Spark不会控制Ignite的生命周期。将其与任何其他数据库进行比较-应用程序不会自行启动和停止MySQL,MySQL会自行运行。
为便于说明,请将其与embedded mode(请勿使用该模式,不建议使用,最终将其删除)。这样,Spark在每个工作线程中启动Ignite服务器本身,并在完成后停止它们。它在某种程度上(尽管不是完全)类似于使用SQLite运行的应用程序-没有SQLite服务器在该应用程序外部运行并单独管理。
如果要在使用Spark完成后杀死Ignite节点,则必须自己完成。有几种选择。
kill
是的,好,旧的kill <pid>
。最好不要使用kill -9
来让Ignite捕获信号并执行一些清理,尽管考虑到您的kill -9
是walMode
或{{1 }}。
您可以通过某种方式在Spark应用程序关闭期间触发FSYNC
。
LOG_ONLY
和kill
有一个技巧可以用来通过Java代码杀死远程节点。
Ignition::stop
方法停止本地Ignite节点。您可以通过IgniteCompute
在每个节点上远程执行该操作。只需记住要从正在发送的任务中生成新线程-试图从任务本身中停止Ignite是一个坏主意。
代码大致如下所示(未经测试!):
Ignition::stop