我尝试使用一个开放源码,即blazingcachehttp://blazingcache.org/ 为我的应用程序实现协调缓存的想法。
所以我用wordcount作为例子https://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapreducetutorial.html#example:\u wordcount\u v2.0测试此缓存库。这是我的全部密码:
public class WordCount2 {
public static class TokenizerMapper
extends Mapper<Object, Text, Text, IntWritable>{
//...
private static Cache<String, String> cache;
@Override
public void setup(Context context) throws IOException,
InterruptedException {
//...
initCache();
}
private void initCache() {
CachingProvider provider = Caching.getCachingProvider();
Properties properties = new Properties();
properties.put("blazingcache.mode","clustered");
properties.put("blazingcache.zookeeper.connectstring","localhost:1281");
properties.put("blazingcache.zookeeper.sessiontimeout","40000");
properties.put("blazingcache.zookeeper.path","/blazingcache");
CacheManager cacheManager = provider.getCacheManager(provider.getDefaultURI(), provider.getDefaultClassLoader(), properties);
MutableConfiguration<String, String> cacheConfiguration = new MutableConfiguration<>();
cache = cacheManager.createCache("example", cacheConfiguration);
}
@Override
public void map(Object key, Text value, Context context
) throws IOException, InterruptedException {
//...
cache.put(word.toString(), one.toString());
}
}
}
//...
}
问题出在第行:
cache.put(word.toString(), one.toString());
在map函数中。
当这一行插入到代码中时,整个作业的性能会突然下降(我使用eclipse在本地模式下运行wordcount示例)。
为什么会发生这种情况?我该如何解决?
2条答案
按热度按时间8ehkhllq1#
如果您在本地模式(单个jvm)下进行测试,则最好删除这些行并重试:
6jygbczu2#
我不确定问题的原因是什么,您可以尝试检查日志并在blazingcache. loggers中查找“连接事件”和异常。
请注意,cache.put最终必须通知承载数据副本的其他客户端,这是一个网络操作。在这样的mapreduce作业中,许多客户机可能持有对同一“词”的引用。请记住关闭cachemanager,因为每个cachemanager都会创建一个cacheclient,因此它会保留资源并接收通知。
当基础cacheclient在断开连接的模式下工作时,它可能会减慢速度,因为没有与缓存服务器的连接,它无法保证缓存的一致性,因此它尝试了很长时间的连接。
我复制了你的案例,你必须编辑这些台词:
1) 只需“创建”缓存一次
2) 不要使用对缓存的静态引用3)删除允许发现缓存服务器的行
通过这些更改,示例代码运行得非常好。
如果要在真正的集群模式下运行,必须启动zookkeeper集群和至少一个blazingcache服务器。如果没有zookeeper,我会得到以下错误循环:
2008年7月16日13:26:14信息zookeeper.clientcnxn:正在打开到服务器localhost.localdomain/127.0.0.1:1281的套接字连接。不会尝试使用sasl进行身份验证(未知错误)16/07/08 13:26:14警告zookeeper.clientcnxn:服务器为空的会话0x0,意外错误,正在关闭套接字连接并尝试重新连接java.net.connectexception:connessione rifiutata at sun.nio.ch.socketchannelimpl.checkconnect(本机方法)at sun.nio.ch.socketchannelimpl.finishconnect(socketchannelimpl)。java:717)在org.apache.zookeeper.clientcnxnsocketnio.dotransport(clientcnxnsocketnio。java:361)在org.apache.zookeeper.clientcnxn$sendthread.run(clientcnxn。java:1081)16/07/08 13:26:15 info mapreduce.job:job job\u local7226039\u 0001在uber模式下运行:false 16/07/08 13:26:15 info mapreduce.job:map 0%reduce 0%16/07/08 13:26:16 info zookeeper.clientcnxn:打开到服务器localhost.localdomain/127.0.1:1281的套接字连接。不会尝试使用sasl进行身份验证(未知错误)16/07/08 13:26:16警告zookeeper.clientcnxn:会话0x0,服务器为空,出现意外错误,正在关闭套接字连接并尝试重新连接
您应该向blazingcache支持邮件列表寻求帮助