偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

剛準(zhǔn)備摸魚(狗頭),告警群炸了:記一次線上 HBase 數(shù)據(jù)壓縮異常問題的發(fā)現(xiàn)、分析與解決全過程

大數(shù)據(jù)
本文詳細(xì)記錄了我在一次生產(chǎn)環(huán)境中遇到的HBase壓縮問題,從發(fā)現(xiàn)問題的蛛絲馬跡,到分析問題的根本原因,再到最終解決問題的全過程。

作為一名HBase集群的運(yùn)維工程師,我經(jīng)常需要處理各種各樣的生產(chǎn)環(huán)境問題。在眾多問題中,與壓縮(Compression)相關(guān)的問題尤為棘手,因?yàn)樗鼈兺鶗?huì)導(dǎo)致性能下降、存儲(chǔ)空間浪費(fèi),甚至數(shù)據(jù)不可訪問。

本文詳細(xì)記錄了我在一次生產(chǎn)環(huán)境中遇到的HBase壓縮問題,從發(fā)現(xiàn)問題的蛛絲馬跡,到分析問題的根本原因,再到最終解決問題的全過程。希望這篇文章能夠幫助其他HBase運(yùn)維人員在面對(duì)類似問題時(shí),有一個(gè)清晰的思路和解決方案。

一、問題的發(fā)現(xiàn)

1. 異常現(xiàn)象的初步觀察

周二早晨,我剛剛泡好一杯咖啡,準(zhǔn)備開始一天的工作。突然,監(jiān)控系統(tǒng)發(fā)出了警報(bào),顯示我們的主要業(yè)務(wù)表user_behavior的讀取延遲突然增加,從正常的5ms飆升到了500ms以上。與此同時(shí),我們的應(yīng)用團(tuán)隊(duì)也反饋說用戶查詢變得異常緩慢。

我立即登錄到HBase Master的Web UI界面,查看集群的整體狀況。集群的整體負(fù)載看起來并不高,CPU和內(nèi)存使用率都在正常范圍內(nèi)。然而,當(dāng)我查看RegionServer的日志時(shí),發(fā)現(xiàn)了大量的警告信息:

WARN  [RS_OPEN_REGION-regionserver/node5.example.com:16020-1] regionserver.HRegion: Got brand-new compressor for LZ4

這條日志引起了我的注意。"brand-new compressor"通常意味著HBase無法重用現(xiàn)有的壓縮器實(shí)例,而是每次都創(chuàng)建新的實(shí)例,這可能會(huì)導(dǎo)致性能問題。

2. 問題的進(jìn)一步確認(rèn)

為了進(jìn)一步確認(rèn)問題,我決定檢查一下集群中的壓縮配置和實(shí)際狀態(tài)。首先,我查看了問題表的壓縮設(shè)置:

$ hbase shell  
hbase> describe 'user_behavior'

結(jié)果顯示該表的列族確實(shí)配置了LZ4壓縮:

DESCRIPTION                                          ENABLED  
'user_behavior', {NAME => 'cf', DATA_BLOCK_ENCODING => 'FAST_DIFF',   
BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0',  
VERSIONS => '1', COMPRESSION => 'LZ4', MIN_VERSIONS  
=> '0', TTL => 'FOREVER', KEEP_DELETED_CELLS => 'false',   
BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'}

接下來,我使用HBase提供的CompressionTest工具來檢查集群各節(jié)點(diǎn)的壓縮支持情況:

$ for server in $(cat /etc/hosts | grep "node" | awk '{print $2}'); do  
    echo "Testing compression on $server"  
    ssh $server "hbase org.apache.hadoop.hbase.util.CompressionTest hdfs:///hbase/data lz4"  
done

結(jié)果令人驚訝,部分RegionServer節(jié)點(diǎn)返回了錯(cuò)誤:

Testing compression on node1.example.com  
2025-05-13 09:15:38,717 WARN  [main] util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable  
Native library checking:  
hadoop: false  
zlib:   false  
snappy: false  
lz4:    false  
bzip2:  false  
2025-05-13 09:15:38,863 INFO  [main] util.ExitUtil: Exiting with status 1

而其他節(jié)點(diǎn)則顯示正常:

Testing compression on node2.example.com  
Native library checking:  
hadoop: true  
zlib:   true  
snappy: true  
lz4:    true  
bzip2:  true

這表明集群中的節(jié)點(diǎn)對(duì)LZ4壓縮的支持不一致,這很可能是導(dǎo)致性能問題的原因。

3. 問題的影響范圍評(píng)估

在確認(rèn)問題存在后,我需要評(píng)估其影響范圍。我檢查了集群中所有表的壓縮設(shè)置:

$ echo "list" | hbase shell | grep "^[a-z]" | while read table; do  
    echo "Table: $table"  
    echo "describe '$table'" | hbase shell | grep COMPRESSION  
done

結(jié)果顯示,除了user_behavior表外,還有另外5個(gè)表也使用了LZ4壓縮。這意味著問題可能影響到多個(gè)業(yè)務(wù)系統(tǒng)。

我還檢查了RegionServer的GC日志,發(fā)現(xiàn)在問題節(jié)點(diǎn)上,GC頻率明顯高于正常節(jié)點(diǎn):

[node1.example.com] GC pauses: avg=120ms, max=350ms, count=45 (last 10 minutes)  
[node2.example.com] GC pauses: avg=30ms, max=80ms, count=12 (last 10 minutes)

這進(jìn)一步證實(shí)了壓縮問題導(dǎo)致了額外的內(nèi)存壓力和GC開銷。

二、問題的分析

1. 深入理解HBase的壓縮機(jī)制

在分析問題之前,我需要先了解HBase的壓縮機(jī)制是如何工作的。HBase支持多種壓縮算法,包括GZ、SNAPPY、LZ4等,這些算法可以應(yīng)用于列族級(jí)別 。

壓縮算法的設(shè)置會(huì)影響數(shù)據(jù)的存儲(chǔ)和讀取方式。當(dāng)寫入數(shù)據(jù)時(shí),HBase會(huì)使用配置的壓縮算法對(duì)數(shù)據(jù)進(jìn)行壓縮后再存儲(chǔ)到HFile中;當(dāng)讀取數(shù)據(jù)時(shí),則需要先解壓縮才能獲取原始數(shù)據(jù)。

HBase的壓縮實(shí)現(xiàn)依賴于兩種類型的庫:

對(duì)于需要本地庫支持的壓縮算法,如果本地庫不可用,HBase會(huì)嘗試使用Java實(shí)現(xiàn)的版本,但這通常會(huì)導(dǎo)致性能下降 。

  • Java內(nèi)置的壓縮支持(如GZ)
  • 本地庫(Native Libraries)支持的壓縮(如LZ4、Snappy)

2. 問題的根本原因分析

根據(jù)前面的觀察,我懷疑問題的根本原因是部分RegionServer節(jié)點(diǎn)缺少LZ4壓縮所需的本地庫支持。為了驗(yàn)證這一猜測,我檢查了問題節(jié)點(diǎn)上的本地庫配置:

$ ssh node1.example.com "ls -la /usr/lib/hadoop/lib/native/"

結(jié)果顯示,問題節(jié)點(diǎn)上確實(shí)缺少了libhadoop.so和liblz4.so這兩個(gè)關(guān)鍵庫文件。

進(jìn)一步調(diào)查發(fā)現(xiàn),這些節(jié)點(diǎn)是最近新添加到集群的,而在部署過程中,運(yùn)維團(tuán)隊(duì)忽略了安裝和配置本地壓縮庫的步驟。

此外,我還發(fā)現(xiàn)HBase的配置中沒有設(shè)置hbase.regionserver.codecs參數(shù),這意味著即使缺少壓縮庫,RegionServer也會(huì)正常啟動(dòng),而不是在啟動(dòng)時(shí)就報(bào)錯(cuò)  。

為了更深入地理解問題,我查看了HBase的壓縮相關(guān)代碼。在Compression.java中,HBase定義了各種壓縮算法及其默認(rèn)實(shí)現(xiàn)類 。當(dāng)本地庫不可用時(shí),HBase會(huì)嘗試使用Java實(shí)現(xiàn),但這會(huì)導(dǎo)致"brand-new compressor"警告,并且性能會(huì)大幅下降。

3. 性能影響的量化分析

為了量化壓縮問題對(duì)性能的影響,我進(jìn)行了一系列測試。首先,我使用HBase的LoadTestTool工具在有問題和沒有問題的節(jié)點(diǎn)上進(jìn)行對(duì)比測試:

hbase org.apache.hadoop.hbase.util.LoadTestTool -write 1:10 -num_keys 1000000 -compression LZ4 -data_block_encoding FAST_DIFF

測試結(jié)果顯示,在缺少本地庫支持的節(jié)點(diǎn)上,寫入性能下降了約60%,讀取性能下降了約70%。

我還分析了HFile的大小差異:

$ hdfs dfs -du -h /hbase/data/user_behavior/*/cf

結(jié)果顯示,由問題節(jié)點(diǎn)生成的HFile平均比正常節(jié)點(diǎn)生成的HFile大約15%,這表明壓縮效率也受到了影響。

通過JStack和JMap分析,我還發(fā)現(xiàn)問題節(jié)點(diǎn)上的JVM堆內(nèi)存中有大量的壓縮器對(duì)象,這進(jìn)一步證實(shí)了"brand-new compressor"問題導(dǎo)致了內(nèi)存壓力增加。

三、問題的解決

1. 臨時(shí)解決方案

在找到根本解決方案之前,我需要先實(shí)施一個(gè)臨時(shí)解決方案,以緩解業(yè)務(wù)壓力。考慮到問題的本質(zhì)是LZ4壓縮庫的缺失,我決定暫時(shí)將受影響表的壓縮算法改為GZ,因?yàn)镚Z壓縮可以使用Java內(nèi)置支持,不依賴本地庫:

$ hbase shell  
hbase> disable 'user_behavior'  
hbase> alter 'user_behavior', {NAME => 'cf', COMPRESSION => 'GZ'}  
hbase> enable 'user_behavior'

對(duì)于其他使用LZ4壓縮的表,我也進(jìn)行了類似的操作。這一臨時(shí)措施立即生效,系統(tǒng)的讀取延遲從50ms降回到了10ms左右。雖然比原來的5ms還是慢一些,但已經(jīng)在可接受范圍內(nèi)。

2. 根本解決方案的實(shí)施

臨時(shí)措施實(shí)施后,我開始著手解決根本問題。首先,我需要在所有缺少本地庫的節(jié)點(diǎn)上安裝必要的庫文件:

# 在問題節(jié)點(diǎn)上安裝必要的開發(fā)包  
$ ssh node1.example.com "yum install -y snappy snappy-devel lz4 lz4-devel"  


# 確保Hadoop本地庫可用  
$ ssh node1.example.com "ln -s /usr/lib64/libsnappy.so.1 /usr/lib64/libsnappy.so"  
$ ssh node1.example.com "ln -s /usr/lib64/liblz4.so.1 /usr/lib64/liblz4.so"

接下來,我需要確保HBase能夠找到這些本地庫。我修改了HBase的環(huán)境配置文件conf/hbase-env.sh,添加了HBASE_LIBRARY_PATH設(shè)置:

export HBASE_LIBRARY_PATH=/usr/lib64:/usr/lib/hadoop/lib/native

為了防止未來再次出現(xiàn)類似問題,我還在hbase-site.xml中添加了hbase.regionserver.codecs配置,確保RegionServer在啟動(dòng)時(shí)會(huì)檢查必要的壓縮庫是否可用:

<property>  
  <name>hbase.regionserver.codecs</name>  
  <value>lz4,snappy,gz</value>  
</property>

此外,我還修改了LZ4壓縮的實(shí)現(xiàn)類配置,使用性能更好的lz4-java實(shí)現(xiàn):

<property>  
  <name>hbase.io.compress.lz4.codec</name>  
  <value>org.apache.hadoop.hbase.io.compress.lz4.Lz4Codec</value>  
</property>

完成這些配置后,我重啟了所有RegionServer:

$ for server in $(cat /etc/hosts | grep "node" | awk '{print $2}'); do  
    echo "Restarting HBase on $server"  
    ssh $server "systemctl restart hbase-regionserver"  
done

3. 驗(yàn)證解決方案的有效性

重啟完成后,我再次運(yùn)行CompressionTest工具檢查所有節(jié)點(diǎn)的壓縮支持情況:

$ for server in $(cat /etc/hosts | grep "node" | awk '{print $2}'); do  
    echo "Testing compression on $server"  
    ssh $server "hbase org.apache.hadoop.hbase.util.CompressionTest hdfs:///hbase/data lz4"  
done

這次,所有節(jié)點(diǎn)都顯示LZ4壓縮可用:

Testing compression on node1.example.com  
Native library checking:  
hadoop: true  
zlib:   true  
snappy: true  
lz4:    true  
bzip2:  true

接下來,我將之前臨時(shí)改為GZ壓縮的表改回LZ4壓縮:

$ hbase shell  
hbase> disable 'user_behavior'  
hbase> alter 'user_behavior', {NAME => 'cf', COMPRESSION => 'LZ4'}  
hbase> enable 'user_behavior'

然后,我再次進(jìn)行性能測試,結(jié)果顯示讀取延遲已經(jīng)恢復(fù)到正常水平(約5ms)。

責(zé)任編輯:趙寧寧 來源: 大數(shù)據(jù)技能圈
相關(guān)推薦

2011-08-08 13:31:44

數(shù)據(jù)分析數(shù)據(jù)倉庫

2021-12-12 18:12:13

Hbase線上問題

2021-11-23 21:21:07

線上排查服務(wù)

2021-02-11 14:06:38

Linux內(nèi)核內(nèi)存

2019-06-11 09:23:38

2019-09-10 10:31:10

JVM排查解決

2020-11-16 07:19:17

線上函數(shù)性能

2020-05-04 11:04:46

HTTP劫持寬帶

2023-05-16 14:14:00

大數(shù)據(jù)數(shù)據(jù)版本

2012-11-06 10:19:18

Java自定義加載Java類

2023-04-26 12:48:58

.NET程序類型

2024-04-25 10:06:03

內(nèi)存泄漏

2021-01-08 13:52:15

Consul微服務(wù)服務(wù)注冊(cè)中心

2023-01-04 18:32:31

線上服務(wù)代碼

2019-04-15 13:15:12

數(shù)據(jù)庫MySQL死鎖

2011-04-18 15:56:10

軟件測試

2011-02-22 10:46:02

Samba配置

2017-09-22 10:16:16

MySQL數(shù)據(jù)庫用戶數(shù)據(jù)

2024-10-15 09:27:36

2021-05-13 08:51:20

GC問題排查
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)