使用rabbitmq對文字使用tf_idf演算法進行分析的專案記錄

weixin_34321977發表於2018-09-02

之前用爬蟲爬了三個源,共爬取了30w左右的部落格,爬蟲專案:itmap_spiders

接著對這些文字進行分析,要求是找出每篇文章的關鍵詞。我對TF*IDF演算法有一些瞭解,就選擇了它。專案:itmap_data_analysis

業務架構

由於資料量有點大,所以使用訊息佇列進行拆分,拆分標準是按照步驟來。具體的步驟如下圖所示。

207122-91e1fe7ef0ab31a1.png
architecture

技術棧:

使用pika來與RabbitMQ連線。
使用click來編寫命令列命令。
使用mongodb來儲存結果。

遇到的問題

logging

使用click時發現一直沒有列印日誌,解決方法是設定日誌級別:

logging.basicConfig(level=logging.INFO)

click

跟隨另一位同夥的程式碼,第一次使用click,真是好用啊!
需要能夠多次輸入collection時,需要增加引數multiple,這樣在命令列使用時,可以多次新增--collection collection_name-c collection_name

@click.command()
@click.option('--collection', '-c', type=click.Choice(collections), multiple=True, help='mongo中的collection名')
def func(collection):
    for c in collection:
        pass

pymongo

速度

計算TF的步驟,由於消費者執行速度實在太慢(rabbit的admin介面對應的queue的state大部分情況下是idle狀態),所以稍微優化了下。
目前主要是通過使用bulk-write來提速。另外,對於計算TF步驟而言,設計的時候是一次只對一篇文章進行計算,但是發現這樣做太耗費與mongodb的連線了,所以改成了一次對100篇文章進行計算。

與消費者的龜速成鮮明對比的是,生產者往佇列裡塞得極快!至於計算TF後面倆步驟是什麼情況,還得等我先跑完TF再看。。。

auth

terminal中輸入mongo

use admin
db.auth(‘username’,’password’)
備份

terminal中輸入

mongodump -u username -p password --authenticationDatabase=admin  -d data -o /data/db
-u 是username -p是password,不填會報authentication的錯, --authenticationDatabase需要指明auth在哪個db中
-d 是要備份的db,不指明就是所有
-o 是dump檔案儲存的地方,不指明就是當前目錄
還可以使用-h 來指明是哪個mongod,比如127.0.0.1:27017,埠可不填
恢復

terminal中輸入

mongorestore -h localhost:27017 -d data . -u root -p Song123654 --authenticationDatabase=admin
各個引數同上,那個點表示是當前目錄

*nix命令

*nix 使用scp傳輸檔案

scp ubuntu@111.112.113.114:~/datadir/data/article-juejin.bson article-juejin.bson

前面和ssh登入一樣,因為scp也是使用ssh,後面同cp命令

修改檔案的使用者組

chgrp [-R] group_name file_name

修改檔案所有者

chown [-R] owner_name file_name
-R表示遞迴,會將目錄下的所有檔案同時做修改

也可以這麼用:

chown group_name:owner_name file_name

docker-compose命令

docker-compose up -d service_name
docker-compose build/start/stop/restart service_name
docker-compose scale service_name=2
docker-compose logs -f service_name

defaultdict

defaultdict-of-defaultdict

想要將defaultdict的預設值也設定為defaultdict:

defaultdict(lambda: defaultdict(int))

若直接寫,會報錯,是因為defaultdict(int)並不是可呼叫物件:

In [2]: defaultdict(defaultdict(int))
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-535a33200cb5> in <module>()
----> 1 defaultdict(defaultdict(int))

TypeError: first argument must be callable or None

相關文章