我尝试使用开源,即BlazingCache http://blazingcache.org/来为我的应用程序实现协调器缓存构思。
所以我只使用WordCount示例https://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html#Example:_WordCount_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());
在地图功能中。
将此行插入代码时,整个作业的性能会突然降低。 (我使用Eclipse在本地模式下运行WordCount示例) 为什么会发生这种情况?我该如何解决?
答案 0 :(得分:0)
我不确定问题的原因是什么,您可以尝试检查日志并查找“连接事件”和blazingcache.xxx记录器中的例外情况。
请注意,Cache.put最终必须通知托管数据副本的其他客户端,这是网络操作。在这样的MapReduce作业中,许多客户端可能持有对相同“单词”的引用。请记住关闭CacheManager,因为每个CacheManager都会创建一个CacheClient,因此它会保留资源并接收通知。
当底层CacheClient在断开连接模式下工作时,它可能会变慢,因为没有连接到缓存服务器,它无法保证缓存的一致性,因此它试图连接很长时间。
我已经复制了你的情况,你必须编辑这些行:
1)你必须只创建一次缓存
try {
cache = cacheManager.createCache("example", cacheConfiguration);
} catch (CacheException alreadyCreated) {
}
cache = cacheManager.getCache("example");
2)不要使用对缓存的静态引用 3)删除允许发现缓存服务器的行
properties.put("blazingcache.mode", "clustered");
通过这些更改,示例代码运行得非常好。
如果要在真正的群集模式下运行,则必须启动zookkeeper群集和至少一个blazingcache服务器。 没有zookeeper我得到这个错误循环:
16/07/08 13:26:14 INFO zookeeper.ClientCnxn:打开套接字连接 到服务器localhost.localdomain / 127.0.0.1:1281。不会尝试 使用SASL进行身份验证(未知错误)16/07/08 13:26:14警告 zookeeper.ClientCnxn:服务器null的会话0x0,意外错误, 关闭套接字连接并尝试重新连接 java.net.ConnectException:Connessione rifiutata at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)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_local7226039_0001 在超级模式下运行:false 16/07/08 13:26:15 INFO mapreduce.Job: 地图0%减少0%16/07/08 13:26:16 INFO zookeeper.ClientCnxn:开放 套接字连接到服务器localhost.localdomain / 127.0.0.1:1281。将 不要尝试使用SASL进行身份验证(未知错误)16/07/08 13:26:16 WARN zookeeper.ClientCnxn:服务器null的会话0x0, 意外错误,关闭套接字连接并尝试重新连接
您应该在blazingcache支持邮件列表中寻求帮助
答案 1 :(得分:0)
如果您在本地模式(单个JVM)中进行测试,则最好删除这些行并再试一次:
properties.put("blazingcache.mode","clustered");
properties.put("blazingcache.zookeeper.connectstring","localhost:1281");
properties.put("blazingcache.zookeeper.sessiontimeout","40000");
properties.put("blazingcache.zookeeper.path","/blazingcache");