2016-06-09 58 views
0

我嘗試使用開源代碼,即BlazingCache http://blazingcache.org/爲我的應用程序實現協調器緩存理念。在Hadoop中使用BlazingCache開源會降低性能

所以我只是使用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

我不確定問題的原因是什麼,您可以嘗試檢查日誌並在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服務器。 沒有飼養員我得到這個錯誤循環:

16/07/08 13時26分14秒INFO zookeeper.ClientCnxn:打開套接字連接 到服務器的localhost.localdomain/127.0.0.1:1281。不會嘗試 使用SASL進行身份驗證(未知錯誤)16/07/08 13:26:14 WARN zookeeper.ClientCnxn:服務器null的會話0x0,意外錯誤, 關閉套接字連接並嘗試重新連接 java.net.ConnectException :CONNESSIONE rifiutata在 sun.nio.ch.SocketChannelImpl.checkConnect(本機方法)在 sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717) 在 org.apache.zookeeper.ClientCnxnSocketNIO.doTransport(ClientCnxnSocketNIO .java:361) at org.apache.zookeeper.ClientCnxn $ SendThread.run(ClientCnxn。java:1081) 16/07/08 13:26:15信息mapreduce.Job:Job job_local7226039_0001 以超級模式運行:false 16/07/08 13:26:15信息mapreduce.Job: map 0%reduce 0 %16/07/08 13:26:16信息zookeeper.ClientCnxn:打開 套接字連接到服務器localhost.localdomain/127.0.0.1:1281。將 不嘗試使用SASL(未知錯誤)16/07/08 13點26分16秒WARN驗證zookeeper.ClientCnxn:服務器空, 意外錯誤,關閉套接字連接,並試圖會議爲0x0重新

你應該在blazingcache支持郵件列表

+0

感謝您的回答! – nd07

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