Python 讀寫 hbase 數據的正確姿勢(四)


title: Python 讀寫 hbase 數據的正確姿勢(四)

tags:

  • hbase
  • happybase
  • python

categories:

  • ?Hbase

comments: true
date: 2017-10-08 16:00:00


問題4: 查詢異常 TApplicationException: Missing result

在上一篇文章中討論了線上測試時出現 [Errno 32] Broken pipe 錯誤,這里繼續分析另一個錯誤 TApplicationException: Missing result

問題描述

在解決了問題 3 后,又遇到了古怪的錯誤:在查詢的過程中,出現了大量的 TApplicationException: Missing result 錯誤:

  File "/usr/local/lib/python2.7/site-packages/happybase/table.py", line 402, in scan
    self.name, scan, {})
  File "/usr/local/lib/python2.7/site-packages/thriftpy/thrift.py", line 198, in _req
    return self._recv(_api)
  File "/usr/local/lib/python2.7/site-packages/thriftpy/thrift.py", line 234, in _recv
    raise TApplicationException(TApplicationException.MISSING_RESULT)
thriftpy.thrift.TApplicationException: Missing result

而且,在大量出現此類錯誤之前伴有 timeout: timed out 超時:

File "/usr/local/lib/python2.7/site-packages/happybase/table.py", line 415, in scan
scan_id, how_many)
File "/usr/local/lib/python2.7/site-packages/thriftpy/thrift.py", line 198, in _req
return self._recv(_api)
File "/usr/local/lib/python2.7/site-packages/thriftpy/thrift.py", line 210, in _recv
fname, mtype, rseqid = self._iprot.read_message_begin()
File "thriftpy/protocol/cybin/cybin.pyx", line 429, in cybin.TCyBinaryProtocol.read_message_begin (thriftpy/protocol/cybin/cybin.c:6325)
File "thriftpy/protocol/cybin/cybin.pyx", line 60, in cybin.read_i32 (thriftpy/protocol/cybin/cybin.c:1546)
File "thriftpy/transport/buffered/cybuffered.pyx", line 65, in thriftpy.transport.buffered.cybuffered.TCyBufferedTransport.c_read (thriftpy/transport/buffered/cybuffered.c:1881)
File "thriftpy/transport/buffered/cybuffered.pyx", line 69, in thriftpy.transport.buffered.cybuffered.TCyBufferedTransport.read_trans (thriftpy/transport/buffered/cybuffered.c:1948)
File "thriftpy/transport/cybase.pyx", line 61, in thriftpy.transport.cybase.TCyBuffer.read_trans (thriftpy/transport/cybase.c:1472)
File "/usr/local/lib/python2.7/site-packages/thriftpy/transport/socket.py", line 108, in read
buff = self.sock.recv(sz)
timeout: timed out

服務端沒有任何異常。

問題分析

看起來這種情況和上文問題 3 中Broken pipe + TTransportException 的錯誤組合模式比較類似,所以猜測timeout 是導致這種現象的導火索,為了驗證猜想,嘗試在測試環境手動復現錯誤場景:

conn_pool = None
TABLE = 'article'

# 本地環境 timeout 設置為1 時 超時較多
# 生產環境為 10
def get_connetion_pool(timeout=1):
    global conn_pool
    if conn_pool is None:
        conn_pool = happybase.ConnectionPool(1, timeout=timeout)
    return conn_pool

def recent_events_v3(start, end, table=None, filter_str=None, limit=2000):
    with get_connetion_pool().connection() as conn:
        if table is not None:
            t = conn.table(table)
        else:
            t = conn.table(TABLE)
        start_row = 'ARTICLE' + str(start * 1000000)
        end_row = 'ARTICLE' + str(end * 1000000)
        return t.scan(row_start=start_row, row_stop=end_row, filter=filter_str, limit=limit)

def main():
    # 問題4復現
    for i in range(100):
    # 有timeout,有 Missing result,有正常查詢
        try:
            results = recent_events_v3(start=0, end=1505646570, table="test_article_java_2")
            print len([i for i in results])
        except Exception as e:
            print e
        print '#########################################'

運行結果如下:

image.png

而當把 timeout 增加到一個較大值時則不會出現這種情況。印證了猜想 TApplicationException: Missing result 異常前一定出現過 timeout

解決問題

增大 timeout 后,可以很大程度上減少這樣的情況發生,但是 timeout 不同于問題 3 的 IllegalArgumentException 錯誤,可以主動控制,使用 scan 的查詢場景以及網絡環境本身(在穩定的場景,仍有可能出現抖動導致超時) 難以避免的會出現 timeout,所以僅僅增加 timeout 值,仍然后可能會出現這種情況。

問題 3 會出現 Broken Pipe 錯誤是因為之前發生錯誤導致連接失效,后續再使用異常連接時則會報錯。問題 4 是否也是因為 timeout 后導致連接出問題,然后出現這種情況呢?

嘗試驗證這種猜想:在發生 timeout 時,catch 住并重新初始化連接池然后重試:

def main():
    # 問題4修復
    for i in range(30):
        # 沒有 Missing result,只有 timeout 和 有正常查詢
        try:
            results = recent_events_v3(start=0, end=1505646570, table="test_article_java_2")
            print len([i for i in results])  # 期望值為2, 實際報錯
        except socket.timeout:
            conn_pool = None  # catch timeout 后, 清空連接池,下次使用時重新初始化, 僅限單線程模型 !
            print 'time out: reinit conn pool!'
            # print traceback.format_exc()
        # 不會在出現 `TApplicationException: Missing result` 錯誤
    print '#########################################'

修改后運行測試代碼只會出現 timeout,不會出現其他錯誤:

timeout re init

因為生產環境是多容器,每個容器單進程,在這種場景下連接池和一個全局變量連接的意義相差不大,整個連接池同一時刻只會被一個進程使用(所以連接池只初始化了 1 條連接),所以直接重置連接池是可以的,此時可以徹底避免 Missing results ~

繼續思考

上文文末提到一個疑惑 :為什么一條異常的連接會出現在 connect pool 中,而且總會拿到這條連接 ?

這次同樣還有另一個問題值得思考:timeout 后為什么會出現大量的 Missing results 錯誤?是否如同猜測的那樣 timeout 后連接池中的連接失效了?

下篇文章見~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,119評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,382評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,038評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,853評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,616評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,112評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,192評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,355評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,869評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,727評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,928評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,467評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,165評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,570評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,813評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,585評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,892評論 2 372

推薦閱讀更多精彩內容