java—在hadoop中使用blazingcache开源会降低性能

iyfjxgzm  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(332)

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

8ehkhllq

8ehkhllq1#

如果您在本地模式(单个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");
6jygbczu

6jygbczu2#

我不确定问题的原因是什么,您可以尝试检查日志并在blazingcache. loggers中查找“连接事件”和异常。
请注意,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,我会得到以下错误循环:
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支持邮件列表寻求帮助

相关问题