Storm 實現滑動窗口計數和TopN排序 【轉】

計算top N words的topology, 用於好比trending topics or trending images on Twitter.html

  

實現了滑動窗口計數和TopN排序, 比較有意思, 具體分析一下代碼    
java

  

Topology

  

這是一個稍微複雜些的topology, 主要體如今使用不一樣的grouping方式, fieldsGrouping和globalGroupingnode

  

   

 String spoutId = "";
 String counterId = "";
 String intermediateRankerId = "";
 String totalRankerId = "";
 builder.setSpout(spoutId,  TestWordSpout(), 5);
 builder.setBolt(counterId,  RollingCountBolt(9, 3), 4).fieldsGrouping(spoutId,  Fields(""));
 builder.setBolt(intermediateRankerId,  IntermediateRankingsBolt(TOP_N), 4).fieldsGrouping(counterId,  Fields(""));
 builder.setBolt(totalRankerId,  TotalRankingsBolt TOP_N)).globalGrouping(intermediateRankerId);

 

RollingCountBolt

首先使用RollingCountBolt, 而且此處是按照word進行fieldsGrouping的, 因此相同的word會被髮送到同一個bolt, 這個field id是在上一級的declareOutputFields時指定的 mysql

RollingCountBolt, 用於基於時間窗口的counting, 因此須要兩個參數, the length of the sliding window in seconds和the emit frequency in secondslinux

  

new RollingCountBolt(9, 3), 意味着output the latest 9 minutes sliding window every 3 minutesnginx

1. 建立SlidingWindowCounter(SlidingWindowCounter和SlotBasedCounter參考下面)     
counter = new SlidingWindowCounter(this.windowLengthInSeconds / this.windowUpdateFrequencyInSeconds);   
如何定義slot數? 對於9 min的時間窗口, 每3 min emit一次數據, 那麼就須要9/3=3個slot   
那麼在3 min之內, 不停的調用countObjAndAck(tuple)來遞增全部對象該slot上的計數   
每3分鐘會觸發調用emitCurrentWindowCounts, 用於滑動窗口(經過getCountsThenAdvanceWindow), 並emit (Map<obj, 窗口內的計數和>, 實際使用時間)   
由於實際emit觸發時間, 不可能恰好是3 min, 會有偏差, 因此須要給出實際使用時間程序員

 

2. TupleHelpers.isTickTuple(tuple), TickTuplesql

前面沒有說的一點是, 如何觸發emit? 這是比較值得說明的一點, 由於其使用Storm的TickTuple特性.   
這個功能挺有用, 好比數據庫批量存儲, 或者這裏的時間窗口的統計等應用   
"__system" component會定時往task發送 "__tick" stream的tuple   
發送頻率由TOPOLOGY_TICK_TUPLE_FREQ_SECS來配置, 能夠在default.ymal裏面配置   
也能夠在代碼裏面經過getComponentConfiguration()來進行配置,shell

  

 Map<String, Object> getComponentConfiguration() {
     Map<String, Object> conf =  HashMap<String, Object>();
     conf.put(Config.TOPOLOGY_TICK_TUPLE_FREQ_SECS, emitFrequencyInSeconds);
      conf;

配置完成後, storm就會按期的往task發送ticktuple   
只須要經過isTickTuple來判斷是否爲tickTuple, 就能夠完成定時觸發的功能數據庫

  

   isTickTuple(Tuple tuple) {
     tuple.getSourceComponent().equals(Constants.SYSTEM_COMPONENT_ID) \\ SYSTEM_COMPONENT_ID == ""
        && tuple.getSourceStreamId().equals(Constants.SYSTEM_TICK_STREAM_ID); \\ SYSTEM_TICK_STREAM_ID == ""
}


最終, 這個blot的輸出爲, collector.emit(new Values(obj, count, actualWindowLengthInSeconds));   
obj, count(窗口內的計數和), 實際使用時間

 

SlotBasedCounter

基於slot的counter, 模板類, 能夠指定被計數對象的類型T   
這個類其實很簡單, 實現計數對象和一組slot(用long數組實現)的map, 並能夠對任意slot作increment或reset等操做 

關鍵結構爲Map<T, long[]> objToCounts, 爲每一個obj都對應於一個大小爲numSlots的long數組, 因此對每一個obj能夠計numSlots個數   
incrementCount, 遞增某個obj的某個slot, 若是是第一次須要建立counts數組   
getCount, getCounts, 獲取某obj的某slot值, 或某obj的全部slot值的和   
wipeSlot, resetSlotCountToZero, reset全部對象的某solt爲0, reset某obj的某slot爲0   
wipeZeros, 刪除全部total count爲0的obj, 以釋放空間

  

   SlotBasedCounter<T>  Serializable {

        serialVersionUID = 4858185737378394432L;

      Map<T, []> objToCounts =  HashMap<T, []>();
       numSlots;

     SlotBasedCounter( numSlots) {
         (numSlots <= 0) {
              IllegalArgumentException("" + numSlots
                + "");
        }
        .numSlots = numSlots;
    }

      incrementCount(T obj,  slot) {
        [] counts = objToCounts.get(obj);
         (counts == ) {
            counts =  [.numSlots];
            objToCounts.put(obj, counts);
        }
        counts[slot]++;
    }

      getCount(T obj,  slot) {
        [] counts = objToCounts.get(obj);
         (counts == ) {
             0;
        }
         {
             counts[slot];
        }
    }

     Map<T, Long> getCounts() {
        Map<T, Long> result =  HashMap<T, Long>();
         (T obj : objToCounts.keySet()) {
            result.put(obj, computeTotalCount(obj));
        }
         result;
    }

      computeTotalCount(T obj) {
        [] curr = objToCounts.get(obj);
         total = 0;
         ( l : curr) {
            total += l;
        }
         total;
    }

    
      wipeSlot( slot) {
         (T obj : objToCounts.keySet()) {
            resetSlotCountToZero(obj, slot);
        }
    }

      resetSlotCountToZero(T obj,  slot) {
        [] counts = objToCounts.get(obj);
        counts[slot] = 0;
    }

      shouldBeRemovedFromCounter(T obj) {
         computeTotalCount(obj) == 0;
    }

    
      wipeZeros() {
        Set<T> objToBeRemoved =  HashSet<T>();
         (T obj : objToCounts.keySet()) {
             (shouldBeRemovedFromCounter(obj)) {
                objToBeRemoved.add(obj);
            }
        }
         (T obj : objToBeRemoved) {
            objToCounts.remove(obj);
        }
    }
}


SlidingWindowCounter

SlidingWindowCounter只是對SlotBasedCounter作了進一步的封裝, 經過headSlot和tailSlot提供sliding window的概念

incrementCount, 只能對headSlot進行increment, 其餘slot做爲窗口中的歷史數據

核心的操做爲, getCountsThenAdvanceWindow   
1. 取出Map<T, Long> counts, 對象和窗口內全部slots求和值的map   
2. 調用wipeZeros, 刪除已經不被使用的obj, 釋放空間   
3. 最重要的一步, 清除tailSlot, 並advanceHead, 以實現滑動窗口   
    advanceHead的實現, 如何在數組實現循環的滑動窗口

  

   SlidingWindowCounter<T>  Serializable {

        serialVersionUID = -2645063988768785810L;

     SlotBasedCounter<T> objCounter;
      headSlot;
      tailSlot;
      windowLengthInSlots;

     SlidingWindowCounter( windowLengthInSlots) {
         (windowLengthInSlots < 2) {
              IllegalArgumentException(""
                + windowLengthInSlots + "");
        }
        .windowLengthInSlots = windowLengthInSlots;
        .objCounter =  SlotBasedCounter<T>(.windowLengthInSlots);

        .headSlot = 0;
        .tailSlot = slotAfter(headSlot);
    }

      incrementCount(T obj) {
        objCounter.incrementCount(obj, headSlot);
    }

    
     Map<T, Long> getCountsThenAdvanceWindow() {
        Map<T, Long> counts = objCounter.getCounts();
        objCounter.wipeZeros();
        objCounter.wipeSlot(tailSlot);
        advanceHead();
         counts;
    }

      advanceHead() {
        headSlot = tailSlot;
        tailSlot = slotAfter(tailSlot);
    }

      slotAfter( slot) {
         (slot + 1) % windowLengthInSlots;
    }
}

  

 

IntermediateRankingsBolt

這個bolt做用就是對於中間結果的排序, 爲何要增長這步, 應爲數據量比較大, 若是直接全放到一個節點上排序, 會負載過重   
因此先經過IntermediateRankingsBolt, 過濾掉一些   
這裏仍然使用, 對於obj進行fieldsGrouping, 保證對於同一個obj, 不一樣時間段emit的統計數據會被髮送到同一個task

IntermediateRankingsBolt繼承自AbstractRankerBolt(參考下面)   
並實現了updateRankingsWithTuple,

  

 updateRankingsWithTuple(Tuple tuple) {
    Rankable rankable = RankableObjectWithFields.from(tuple);
    .getRankings().updateWith(rankable);
}

  

邏輯很簡單, 將Tuple轉化Rankable, 並更新Rankings列表

  

參考AbstractRankerBolt, 該bolt會定時將Ranking列表emit出去


Rankable

Rankable除了繼承Comparable接口, 還增長getObject()和getCount()接口

  

  Rankable  Comparable<Rankable> {
    Object getObject();
     getCount();
}

RankableObjectWithFields

RankableObjectWithFields實現Rankable接口   
1. 提供將Tuple轉化爲RankableObject   
Tuple由若干field組成, 第一個field做爲obj, 第二個field做爲count, 其他的都放到List<Object> otherFields中

2. 實現Rankable定義的getObject()和getCount()接口

3. 實現Comparable接口, 包含compareTo, equals

  

public class RankableObjectWithFields implements Rankable

  

  RankableObjectWithFields from(Tuple tuple) {
    List<Object> otherFields = Lists.newArrayList(tuple.getValues());
    Object obj = otherFields.remove(0);
    Long count = (Long) otherFields.remove(0);
      RankableObjectWithFields(obj, count, otherFields.toArray());
}

Rankings

Rankings維護須要排序的List, 並提供對List相應的操做

核心的數據結構以下, 用來存儲rankable對象的list   
List<Rankable> rankedItems = Lists.newArrayList();

提供一些簡單的操做, 好比設置maxsize(list size), getRankings(返回rankedItems, 排序列表)

核心的操做是, 

  

  updateWith(Rankable r) {
    addOrReplace(r);
    rerank();
    shrinkRankingsIfNeeded();
}

上一級的blot會按期的發送某個時間窗口的(obj, count), 因此obj之間的排序是在不斷變化的 
1. 替換已有的, 或新增rankable對象(包含obj, count) 
2. 重新排序(Collections.sort) 
3. 因爲只須要topN, 因此大於maxsize的須要刪除 

AbstractRankerBolt

首先以TopN爲參數, 建立Rankings對象

  

  Rankings rankings;
 AbstractRankerBolt( topN,  emitFrequencyInSeconds) {
    count = topN;
    .emitFrequencyInSeconds = emitFrequencyInSeconds;
    rankings =  Rankings(count);
}

在execute中, 也是定時觸發emit, 一樣是經過emitFrequencyInSeconds來配置tickTuple   
通常狀況, 只是使用updateRankingsWithTuple不斷更新Rankings   
這裏updateRankingsWithTuple是abstract函數, 須要子類重寫具體的update邏輯

  

   execute(Tuple tuple, BasicOutputCollector collector) {
     (TupleHelpers.isTickTuple(tuple)) {
        emitRankings(collector);
    }
     {
        updateRankingsWithTuple(tuple);
    }
}

最終將整個rankings列表emit出去 

  

  emitRankings(BasicOutputCollector collector) {
    collector.emit( Values(rankings));
    getLogger().info("" + rankings);
}


TotalRankingsBolt 

該bolt會使用globalGrouping, 意味着全部的數據都會被髮送到同一個task進行最終的排序.   
TotalRankingsBolt一樣繼承自AbstractRankerBolt

  

 updateRankingsWithTuple(Tuple tuple) {
    Rankings rankingsToBeMerged = (Rankings) tuple.getValue(0);
    .getRankings().updateWith(rankingsToBeMerged);
}

惟一的不一樣是, 這裏updateWith的參數是個rankable列表, 在Rankings裏面的實現同樣, 只是多了遍歷 

最終能夠獲得, 全局的TopN的Rankings列表

做者

晨色星空J2EE的頭像

晨色星空J2EE

已學習課程數:12

已發表筆記數:51

Ta的筆記

01       awk 實戰使用

統計訪問日誌裏面的IP數據,經過IP分類統計出每個IP最近訪問次數,並進行訪問次數排序,日誌文件格式以下,看似比較混亂的結構:{"referer":"http://www.52ipr.com/index.html","headers":{"X-Proxy":"nginx","Accept":"*/*"},"scheme":"http

02       Linux 學習筆記 Sed命令詳解

簡介sed 是一種在線編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩衝區中,稱爲「模式空間」(pattern space),接着用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。接着處理下一行,這樣不斷重複,直到文件末尾。文件內容並無 改變,除非你使用重定向存儲輸出。Sed主要用來自動編輯一個或多個文件;簡化對文件的反覆操做;編寫轉換程序等。 sed使用參數 # sed   選項與參數: -n :使用安靜(silent)模式。在通常 sed 的用法中,全部

03       Linux 學習筆記 Grep篇

grep 是一個很常見也很經常使用的命令,他最重要的功能就是進行字串數據的比對,而後將符合使用者需求的字串列印出來。須要說明的是『grep 在數據中查尋一個字串時,是以 "整行" 爲單位來進行數據的擷取的!』也就是說,假如一個文件內有 10 行,其中有兩行具備你所搜尋的字串,則將那兩行顯示在螢幕上,其餘的就丟棄了!在關鍵字的顯示方面,grep 可使用 --color=auto 來將關鍵字部分使用顏色顯示。這但是個很不錯的功能啊!可是若是每次使用 grep 都得要自行加上 --color=

04       Spark中文手冊 編程指南-3

共享變量通常狀況下,當一個傳遞給Spark操做(例如map和reduce)的函數在遠程節點上面運行時,Spark操做實際上操做的是這個函數所用變量的一個獨立副本。這些變量被複制到每臺機器上,而且這些變量在遠程機器上 的全部更新都不會傳遞迴驅動程序。一般跨任務的讀寫變量是低效的,可是,Spark仍是爲兩種常見的使用模式提供了兩種有限的共享變量:廣播變量(broadcast variable)和累加器(accumulator)廣播變量廣播變量容許程序員緩存一個只讀的變量在每臺機器上面,而不是每一個任務保存一份拷

05       Spark中文手冊 編程指南-2 彈性分佈式數據集 (RDDs)

彈性分佈式數據集 (RDDs)Spark 核心的概念是 Resilient Distributed Dataset (RDD):一個可並行操做的有容錯機制的數據集合。有 2 種方式建立 RDDs:第一種是在你的驅動程序中並行化一個已經存在的集合;另一種是引用一個外部存儲系統的數據集,例如共享的文件系統,HDFS,HBase或其餘 Hadoop 數據格式的數據源。並行集合外部數據集RDD 操做傳遞函數到 Spark使用鍵值對TransformationsActionsRDD持久化並行集合並行集合

06       Spark中文手冊 編程指南-1

概論在高層中,每一個 Spark 應用程序都由一個驅動程序(driver programe)構成,驅動程序在集羣上運行用戶的mian 函數來執行各類各樣的並行操做(parallel operations)。Spark 的主要抽象是提供一個彈性分佈式數據集(RDD),RDD 是指能橫跨集羣全部節點進行並行計算的分區元素集合。RDDs 從 Hadoop 的文件系統中的一個文件中建立而來(或其餘 Hadoop 支持的文件系統),或者從一個已有的 Scala 集合轉換獲得。用戶能夠要求 Spark 將 R

07       Spark中文手冊-快速上手

快速上手本節課程提供一個使用 Spark 的快速介紹,首先咱們使用 Spark 的交互式 shell(用 Python 或 Scala) 介紹它的 API。當演示如何在 Java, Scala 和 Python 寫獨立的程序時,看編程指南里完整的參考。依照這個指南,首先從 Spark 網站下載一個 Spark 發行包。由於咱們不會使用 HDFS,你能夠下載任何 Hadoop 版本的包。Spark Shell獨立應用程序開始翻滾吧!使用 Spark Shell基礎Spark 的 shell 做爲一

08       Spark 中文手冊 總覽

Spark 編程指南簡體中文版Introduction快速上手Spark Shell獨立應用程序開始翻滾吧!編程指南引入 Spark初始化 SparkSpark RDDs並行集合外部數據集RDD 操做傳遞函數到 Spark使用鍵值對TransformationsActionsRDD持久化共享變量從這裏開始Spark Streaming一個快速的例子基本概念關聯初始化StreamingContext離散流輸入DStreamsDStream中的轉換DStream的輸出操做緩存或持久化Checkpointing

09       linux awk命令詳解

簡介awk是一個強大的文本分析工具,相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤其強大。簡單來講awk就是把文件逐行的讀入,以空格爲默認分隔符將每行切片,切開的部分再進行各類分析處理。awk有3個不一樣版本: awk、nawk和gawk,未做特別說明,通常指gawk,gawk 是 AWK 的 GNU 版本。awk其名稱得自於它的創始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首個字母。實際上 AWK 的確擁有本身的語

10       linux sort,uniq,cut,wc命令詳解

sortsort 命令對 File 參數指定的文件中的行排序,並將結果寫到標準輸出。若是 File 參數指定多個文件,那麼 sort 命令將這些文件鏈接起來,並看成一個文件進行排序。sort語法# sort   選項與參數: -f  :忽略大小寫的差別,例如 A 與 a 視爲編碼相同; -b  :忽略最前面的空格符部分; -M  :以月份的名字來排序,例如 JAN, DEC 等等的排序方法; -n  :使用『純數字』進行排序(默認是以文字型態來排序的); -r  :反向排序; -u  :就是

相關筆記

[無]

最新筆記

01       TaoKeeper監控ZK集羣

ZK  Web界面, node-zk-browserWeb展現每一個path的屬性和數據。須要安裝Node.js 和 node-zookeeper  taokeeper爲zookeeper作了什麼?1.CPU/MEM/LOAD的監控//load2. ZK日誌目錄所在磁盤剩餘空間監控3. 單機鏈接數的峯值報警4. 單機 Watcher數的峯值報警5. 節點自檢:是指對集羣中每一個IP所在ZK節點上的PATH:

02       java高手養成地:116804208,Java零基礎到項目實戰在線直播公開課

學習編程並無那麼困難,你只是須要一位大神來手把手來帶領,專業的Java老師在線講課,幫助你有效快速的掌握Java,真心想要學習java的夥伴能夠加咱們,想學習編程不要看網上的這些視頻教程,沒有任何意義,你操做過程當中會遇到大量的問題,學習編程能夠加羣【116,804,208】這裏有不少人指導你一塊兒學習,Java零基礎到項目實戰公開課,咱們的課程偏向實戰性,想要學習Java的夥伴歡迎到咱們的課堂來一塊兒學習。

03       awk

相似的數據結構使用awk進行分析。第一種方式假定 ip地址在逗號分隔的第8段中,能夠進行以下操做(固然這也的假定條件自己就是有問題的) awk: cat access_log.* | awk -F ',' '{print $8}' | awk -F ':' '{if($1=="\"ip\""){print $2}}' |sort |uniq -c |sort -rn  cat 

04       awk 實戰使用

統計訪問日誌裏面的IP數據,經過IP分類統計出每個IP最近訪問次數,並進行訪問次數排序,日誌文件格式以下,看似比較混亂的結構:{"referer":"http://www.52ipr.com/index.html","headers":{"X-Proxy":"nginx","Accept":"*/*"},"scheme":"http

05       hive 表跟mysql綁定之後hive表drop不掉解決辦法

 這個問題網上給出的通常都是修改編碼集,但對有些朋友來講,貌似很差使,我本身就是受害者。 緣由也確實是編碼集,可是不少人像我都搞錯了順序呢!下面是緣由以及解決!            我安裝mysql的時候默認編碼是utf8 ,而後我啓動hive 它給我自動create了若干張表,而後我才把表的編碼集改爲latin,可是其實裏面表的編碼集仍是utf8 致使後面的問題我把mysql下的database

06       CDH 運維筆記

1Hbase平常運維   1.1       監控Hbase運行情況1.1.1操做系統1.1.1.1 IOa.羣集網絡IO,磁盤IO,HDFS IOIO越大說明文件讀寫操做越多。當IO忽然增長時,有可能:1.compact隊列較大,集羣正在進行大量壓縮操做。2.正在執行mapreduce做業能夠經過CDH前臺查看整個集羣綜合的數據或進入指定機器的前臺查看單臺機器的數據:b.Io wait磁盤IO對集羣的影響

07       • Storm優點

• Storm優點  1. 簡單的編程模型。相似於MapReduce下降了並行批處 理複雜性,Storm下降了進行實時處理的複雜性。  2. 服務化,一個服務框架,支持熱部署,即時上線或下線App.  3. 可使用各類編程語言。你能夠在Storm之上使用各類 編程語言。默認支持Clojure、Java、Ruby和Python。要 增長對其餘語言的支持,只需實現一個簡單的Storm通訊 協議便可。  4. 容錯性。Storm會管理工做進程和節點的故障。  5. 水平擴展。計算是在多個線程、進程和

08       如何在LATEX裏高亮顯示R代碼

轉自 如何在Latex中高亮顯示R語言代碼,請看下面的示例:\documentclass{beamer}   \usepackage{ctex} \usepackage{listings} %插入代碼 \usepackage{xcolor} %代碼高亮 \lstset{numbers=left, %設置行號位置        numberstyle=\tiny, %設置行號大小        keywordstyle=\color{blue}, %設置關鍵字顏色        c

09       Bash引號的那點事

促使我想寫這個系列的文章,是由於看到總有人提到相同的問題,犯相同的錯誤,曾經我也是這麼過來的,不忍心看到後面還有人常常這麼曲折的過來。先了解下,在bash腳本中,有三種引號1. 單引號 ' 2. 雙引號 " 3. 反引號 ` 單引號        兩個單引號包圍起來的字符串就是普通的字符串,它將保留原始的字面意思. 雙引號        兩個雙引號包圍起來的字符串,部分特殊字符將起到它們的做用.        這些特殊字符有: 美圓符$, 反斜槓\, 反引號,  感嘆號!

10       HDFS寫過程

Client調用DistributedFileSystem對象的create方法,建立一個文件輸出流(FSDataOutputStream)對象 Client調用DistributedFileSystem對象的create方法,建立一個文件輸出流(FSDataOutputStream)對象經過DistributedFileSystem對象與Hadoop集羣的NameNode進行一次RPC遠程調用,在HDFS的Namespace中建立一個文件條目(Entry),該條目沒有任何的Block經過FSDataOu

熱門筆記

01       Storm單機+zookeeper集羣安裝

Storm單機+zookeeper集羣安裝 一、安裝zookeeper集羣 二、準備機器 10.10.3.44 flumemaster1        zk 10.10.3.129 flumemaster2      zk 10.10.3.132 flumecollector1   zk 10.10.3.115 flumeNg1             storm 三、配置hosts文件(4臺服務器上面都須要配置)     vi /etc/hosts

02       sqoop安裝使用手冊

sqoop使用 需求:將mysql中的表b05_age的數據導入hive中 一、安裝    yum install sqoop(sqoop必須安裝在有hive client的服務器上面,若是沒有執行yum install hive)    複製mysql的驅動jar到/usr/lib/sqoop/lib下面 二、異常處理 正確命令:(將關係型數據的表結構複製到hive中) sudo -u hive sqoop create-hive-table --connect jdbc:my

03       CDH hadoop集羣安裝-1

準備機器: 192.168.1.241 192.168.1.242 192.168.1.243 一、查看ip地址是否爲靜態ip,若是不是進行配置 vim /etc/sysconfig/network-scripts/ifcfg-eth0    DEVICE=eth0    TYPE=Ethernet    ONBOOT=yes    NM_CONTROLLED=yes    BOOTPROTO=none    IPADDR=192.168.1.241    NE

04       Oracle SQL使用心得

1. 我用的Oracle 客戶端最好的工具是PL/SQL Developer, 固然,若是用免費的Toad也不錯,感受如今用Toad的人仍是挺多的。 2. Oracle SQL若是想提升速度有幾個方式 1)建立索引,儘可能創建惟一索引 2)當要建立的索引列的值取值比較小,建議建立Bitmap的索引而不是默認的Btree的。(好比性別,學歷等) 3)在where條件後儘可能採用數字類型的字段,比varchar的速度快 4)儘可能不用用IN,Not In,union這樣的條件查

05       JAVA網站靜態化方法

1. 經過freemarker靜態化 2. 經過jsp filter靜態化 主要思路:請求servlet->判斷靜態文件是否存在而且靜態文件建立時間是否在閥值以內-->若是不是,則訪問數據庫生成靜態文件->不然直接跳轉靜態文件 而後經過urlReWrite直接將訪問servlet的請求改成html,完成seo 最後經過SQUID緩存前臺數據 1、從數據庫中取相應數據並替換掉模板中的對應標籤,下面是一個簡單的示例

06       使用JAVA 6 構建本身的HTTP服務器

import  java.io.IOException; import  java.io.InputStream; import  java.io.OutputStream; import  java.io.OutputStreamWriter; import  java.io.PrintWriter; import  java.net.InetSocketAddress; import  java.util.List; import  java.util.Map; import  c

07       linux下優化tomcat服務器性能

服務器優化說明 WEB服務器優化 一、  更換tomcat5爲tomcat6 版本copy測試服務版本便可 二、  加大tomcat內存 修改bin下的catalina.sh文件,增長青綠色部分 JAVA_OPTS='-Xms768m -Xmx1648m -XX:MaxPermSize=512m' 三、  加大tomcat鏈接數 修改conf下的server.xml文件,修改青綠色部分參數值 maxThrea

08       Oracle 如何查詢鎖表的對象

select s.username, decode(l.type,'tm','table lock','tx','row lock',null) lock_level, o.owner, o.object_name, o.object_type, s.sid, s.serial#, s.terminal, s.machine, s.program, s.osuser from v$session s,v$lock l,dba_objects o where l.sid = s.s

09       【Twitter Storm系列】flume-ng+Kafka+Storm+HDFS 實時系統搭建

一直以來都想接觸Storm實時計算這塊的東西,最近在羣裏看到上海一哥們羅寶寫的Flume+Kafka+Storm的實時日誌流系統的搭建文檔,本身也跟着整了一遍,以前羅寶的文章中有一些要注意點沒提到的,之後一些寫錯的點,在這邊我會作修正;內容應該說絕大部分引用羅寶的文章的,這裏要謝謝羅寶兄弟,還有寫這篇文章@晨色星空J2EE也給了我很大幫助,這裏也謝謝@晨色星空J2EE以前在弄這個的時候,跟羣裏的一些人討論過,有的人說,直接用storm不就能夠作實時處理了,用不着那麼麻煩;其實否則,作軟件開發的都知道模塊化

10       實時流處理框架——Storm(介紹篇)

1. Storm介紹2. Storm環境配置3. Storm程序流程4. Storm總結及問題1. Storm介紹 1.1 實時流計算背景 隨着互聯網的更進一步發展,信息瀏覽、搜索、關係交互傳遞型,以及電子商務、互聯網旅遊生活產品等將生活中的流通環節在線化。對於實時性的要求進一步提高,而信息的交互和溝通正在從點對點往信息鏈甚至信息網的方向發展,這樣必然帶來數據在各個維度的交叉關聯,數據爆炸已不可避免。所以流式處理和NoSQL產品應運而生,分別解決實時框架和數據大 規模存儲計算的問題。 流式處理可

友情連接

StormGeek

hadoop中國用戶組

相關文章
相關標籤/搜索