在Hadoop中使用BlazingCache开源会降低性能

时间:2016-06-09 12:03:28

标签: java performance hadoop

我尝试使用开源,即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示例) 为什么会发生这种情况?我该如何解决?

2 个答案:

答案 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");