apache 用于传递的对等点加载

oknwwptz  于 2023-10-23  发布在  Apache
关注(0)|答案(1)|浏览(160)

我正在使用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策略,使其了解完整的依赖关系?

ssgvzors

ssgvzors1#

AFAIU当你只指定BOM表依赖项时,你会遇到问题。
这似乎是您的Gradle使用问题。语句platform('com.google.cloud:libraries-bom:26.22.0')本身并不声明任何依赖项。BOM文件用于指定应该一起工作的特定版本的依赖项集,然后您不需要为这些包含的依赖项指定版本。例如

implementation platform('com.google.cloud:libraries-bom:26.22.0')
implementation 'com.google.cloud:google-cloud-bigquery'
implementation 'com.google.cloud:google-cloud-storage'

如果只声明对BOM的依赖关系,或者只复制BOM文件,则不会获得所需的实际代码。
如果您想从应用程序运行任务,那么对等类加载是加载库的可行选项。在这种情况下,您的应用应该具有任务的代码+所有依赖项。服务器不应该有任何这些依赖关系。然后,当服务器尝试执行任务时,它会要求客户端共享所有必需的类。
部署Maven依赖项的另一个好选择是使用GridGain Control CenterCode Deployment特性。您可以将集群连接到控制中心,并使用其UI来操作部署的代码-您指定要部署的Maven工件或上传文件,系统会处理依赖项、版本控制等。同样,只指定BOM是行不通的--您需要应用程序使用的实际库(例如,com.google.cloud:google-cloud-bigquery:2.23.2)。

相关问题