Hazelcast-jet:使用直接查找丰富流时出错

时间:2019-10-07 02:13:26

标签: hazelcast-jet

我正在关注Doc,以尝试如何通过直接从IMap中查找来丰富无限流。我有两张地图:

  1. 产品:Map<String, Product>(以ProductId作为键)
  2. 卖方:Map<String, Seller>(以卖方ID为键)

ProductSeller都是非常简单的类:

public class Product implements DataSerializable {
    String productId;
    String sellerId;
    int price;
...
public class Seller implements DataSerializable {
    String sellerId;
    int revenue;
...

我有两个数据生成器,将数据推入两个映射。这两个地图都启用了事件日志。我已经验证了事件日志的工作原理。

我想用Product映射丰富Seller映射的流事件。这是我的代码段:

IMap<String, Seller> sellerIMap = jetClient.getMap(SellerDataGenerator.SELLER_MAP);
StreamSource<Product> productStreamSource = Sources.mapJournal(ProductDataGenerator.PRODUCT_MAP, Util.mapPutEvents(), Util.mapEventNewValue(), START_FROM_CURRENT);
p.drawFrom(productStreamSource)
            .withoutTimestamps()
            .groupingKey(Product::getSellerId)
            .mapUsingIMap(sellerIMap, (product, seller) -> new EnrichedProduct(product, seller))
            .drainTo(getSink());
try {
        JobConfig jobConfig = new JobConfig();
        jobConfig.addClass(TaskSubmitter.class).addClass(Seller.class).addClass(Product.class).addClass(ExtendedProduct.class);
        jobConfig.setName(Constants.BASIC_TASK);
        Job job = jetClient.newJob(p, jobConfig);
    } finally {
        jetClient.shutdown();
    }

提交工作时,出现以下错误:

  

com.hazelcast.spi.impl.operationservice.impl.Invocation-[172.31.33.212]:80 [jet] [3.1]执行回调的异步执行失败:com.hazelcast.util.executor.DelegatingFuture$DelegatingExecutionCallback@77ac0407for调用Invocation {op = com.hazelcast.map.impl.operation.GetOperation {serviceName ='hz:impl:mapService',identityHash = 1939050026,partitionId = 70,plicateIndex = 0,callId = -37944,invocationTime = 1570410704479(2019- 10-07 01:11:44.479),waitTimeout = -1,callTimeout = 60000,name = sellerMap},tryCount = 250,tryPauseMillis = 500,invokeCount = 1,callTimeoutMillis = 60000,firstInvocationTimeMs = 1570410704479,firstInvocationTime ='2019-10 -07 01:11:44.479',lastHeartbeatMillis = 0,lastHeartbeatTime ='1970-01-01 00:00:00.000',target = [172.31.33.212]:80,pendingResponse = {VOID},backupsAcksExpected = 0,backupsAcksReceived = 0,connection = null}

我尝试将一个和两个实例放入群集中,并得到相同的错误消息。我不知道根本原因是什么。

1 个答案:

答案 0 :(得分:1)

即使您在作业中添加了适当的类,您的问题似乎还是ClassNotFoundException。您存储在IMap中的对象独立于您的Jet作业而存在,并且当事件日志源要求它们时,Jet的IMap代码尝试对它们进行反序列化并失败,因为Jet在其类路径中没有域模型类。

要继续,请将JAR与在IMap中使用的类一起添加到Jet的类路径中。我们正在寻找一种解决方案,以消除此要求。

在日志输出中没有异常stacktrace的原因是由于没有明确添加更灵活的日志记录模块(例如Log4j)时使用的默认java.util.logging设置。 / p>

Jet包装的下一个版本将改善此方面。在此之前,您可以按照以下步骤操作:

  1. 转到Jet分发软件包的lib目录并将Log4j下载到其中:

    $ cd lib
    $ wget https://repo1.maven.org/maven2/log4j/log4j/1.2.17/log4j-1.2.17.jar
    
  2. 编辑bin/common.sh以将模块添加到类路径。在文件末尾有一行

    CLASSPATH="$JET_HOME/lib/hazelcast-jet-3.1.jar:$CLASSPATH"
    

    您可以复制此行并将hazelcast-jet-3.1替换为log4j-1.2.17

  3. commons.sh的末尾,有一个多行命令构造了JAVA_OPTS变量。将"-Dhazelcast.logging.type=log4j""-Dlog4j.configuration=file:$JET_HOME/config/log4j.properties"添加到列表中。

  4. log4j.properties目录中创建文件config

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %5p [%c{1}] [%t] - %m%n

# Change this level to debug to diagnose failed cluster formation:
log4j.logger.com.hazelcast.internal.cluster=info

log4j.logger.com.hazelcast.jet=info
log4j.rootLogger=info, stdout