我正在关注Doc,以尝试如何通过直接从IMap中查找来丰富无限流。我有两张地图:
Map<String, Product>
(以ProductId作为键)Map<String, Seller>
(以卖方ID为键) Product
和Seller
都是非常简单的类:
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}
我尝试将一个和两个实例放入群集中,并得到相同的错误消息。我不知道根本原因是什么。
答案 0 :(得分:1)
即使您在作业中添加了适当的类,您的问题似乎还是ClassNotFoundException
。您存储在IMap
中的对象独立于您的Jet作业而存在,并且当事件日志源要求它们时,Jet的IMap代码尝试对它们进行反序列化并失败,因为Jet在其类路径中没有域模型类。
要继续,请将JAR与在IMap中使用的类一起添加到Jet的类路径中。我们正在寻找一种解决方案,以消除此要求。
在日志输出中没有异常stacktrace的原因是由于没有明确添加更灵活的日志记录模块(例如Log4j)时使用的默认java.util.logging
设置。 / p>
Jet包装的下一个版本将改善此方面。在此之前,您可以按照以下步骤操作:
转到Jet分发软件包的lib
目录并将Log4j下载到其中:
$ cd lib
$ wget https://repo1.maven.org/maven2/log4j/log4j/1.2.17/log4j-1.2.17.jar
编辑bin/common.sh
以将模块添加到类路径。在文件末尾有一行
CLASSPATH="$JET_HOME/lib/hazelcast-jet-3.1.jar:$CLASSPATH"
您可以复制此行并将hazelcast-jet-3.1
替换为log4j-1.2.17
。
在commons.sh
的末尾,有一个多行命令构造了JAVA_OPTS
变量。将"-Dhazelcast.logging.type=log4j"
和"-Dlog4j.configuration=file:$JET_HOME/config/log4j.properties"
添加到列表中。
在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