我正在使用ignite计算任务从BigQuery中检索数据。下面是胖客户端和服务器端的配置:
<property name="peerClassLoadingEnabled" value="true"/>
<property name="deploymentMode" value="CONTINUOUS"/>
计算任务可以描述如下:
public class BigQueryStorageReadTask implements IgniteClosure<LoadingRequest, Long> {
@IgniteInstanceResource
private Ignite ignite;
@Override
public Long apply(LoadingRequest query) {
return loadToCache(query);
}
private void readFromBigQuery(LoadingRequest query) {
try (BigQueryReadClient client = BigQueryReadClient.create()) {
// Read data from BigQuery using storage read api
.....
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
当我使用存储读取API从BigQuery读取数据时,会出现依赖性问题,因为它需要依赖性
implementation platform('com.google.cloud:libraries-bom:26.22.0')
implementation 'com.google.cloud:google-cloud-bigquery:2.23.2'
如果我使用简单的SQL API从BigQuery读取数据,它只需要“com.google.cloud:google-cloud-bigquery:2.23.2”,那么就没有问题,计算任务工作正常,但使用bom依赖项
com.google.cloud:libraries-bom
远程计算任务将由于缺乏依赖性而给出给予各种错误。由于我的ignite服务器节点是从xml脚本而不是spring应用程序开始的,我尝试手动将库jar添加到user_libs中,但仍然缺乏一些低级依赖。
我想知道是否有任何方法可以解决远程计算任务的依赖管理问题?我认为是peerClassLoading不能正常工作。
更新:
经过进一步的调查,我发现这个问题与是否包含bom无关,因为它只是其他导入库的版本参考。
我猜根本原因是关于ignite peerClassLoading是否可以下载所有依赖,包括transitive依赖。
我通过关闭peerClassLoading并手动提供所有jar进行了本地测试,如下所示
docker run -v /local_path/to/dir_with_libs/:/opt/ignite/apache-ignite/libs/user_libs apacheignite/ignite
效果很好。
所以我想我应该问:如何正确配置peerClassLoading策略,使其了解完整的依赖关系?
1条答案
按热度按时间ssgvzors1#
AFAIU当你只指定BOM表依赖项时,你会遇到问题。
这似乎是您的Gradle使用问题。语句
platform('com.google.cloud:libraries-bom:26.22.0')
本身并不声明任何依赖项。BOM文件用于指定应该一起工作的特定版本的依赖项集,然后您不需要为这些包含的依赖项指定版本。例如如果只声明对BOM的依赖关系,或者只复制BOM文件,则不会获得所需的实际代码。
如果您想从应用程序运行任务,那么对等类加载是加载库的可行选项。在这种情况下,您的应用应该具有任务的代码+所有依赖项。服务器不应该有任何这些依赖关系。然后,当服务器尝试执行任务时,它会要求客户端共享所有必需的类。
部署Maven依赖项的另一个好选择是使用GridGain Control Center的Code Deployment特性。您可以将集群连接到控制中心,并使用其UI来操作部署的代码-您指定要部署的Maven工件或上传文件,系统会处理依赖项、版本控制等。同样,只指定BOM是行不通的--您需要应用程序使用的实际库(例如,
com.google.cloud:google-cloud-bigquery:2.23.2
)。