hadoop集群spark作業執行較慢、入庫較慢相關問題排查及調優


1、反饋

業務側反饋日常進行spark作業跑不動,執行速度特別慢,影響當天任務生成,后續活動執行;

主要現象及影響:
1、regionserver頻繁掛,日志出現大量gc信息
2、spark類型的作業跑得慢,跟業務一起做測試定位原因,發現主要是hbase get比較耗時
3、標簽入庫較慢(將數據put到hdfs,從hdfs入到hbase中)
 
參數調整及優化:
1、發現regionserver日志有頻繁gc延遲的信息,主機CPU高的時候延遲就高,09.29修改hbase-env.sh的如下相關相關參數,重啟hbase,將延遲控制到3s以內   
修改前:
export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS $HBASE_JMX_BASE -server -Xmx32768m -Xms32768m -Xmn1024m -XX:SurvivorRatio=1 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+CMSParallelRemarkEnabled  -XX:+UseCMSCompactAtFullCollection  -XX:+UseCMSInitiatingOccupancyOnly -XX:-DisableExplicitGC"
 
第一次修改:
export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS $HBASE_JMX_BASE -server -Xmx32768m -Xms32768m -Xmn4096m -XX:SurvivorRatio=1 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+CMSParallelRemarkEnabled  -XX:+UseCMSCompactAtFullCollection  -XX:+UseCMSInitiatingOccupancyOnly -XX:-DisableExplicitGC"
 
第二次修改:
export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS $HBASE_JMX_BASE -XX:SurvivorRatio=2 -server -Xmx32768m -Xms32768m -Xmn4096m -Xss256k -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+UseParNewGC -XX:MaxTenuringThreshold=15  -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:+CMSClassUnloadingEnabled -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=75 -XX:-DisableExplicitGC"
 
2、觀察hbase master及hdfs namenode監控頁面,發現hdfs小文件數比較多,hbase表比較多,且很多表已經不用,對集群性能有一定影響,用distcp將hbase相關數據備份到測試環境,告知業務側將不再使用的五千張表刪除。09.29刪除五千多張hbase表后,hbase get速度有所提升,但還是有get一條數據耗時3~4s的情況。
后續規划:建議業務側進行數據清理,減少hdfs小文件,主要是hive數據
 
3、0930凌晨,通過yarn監控頁面,發現sparksumit占用資源較多,而業務測spark作業以及mapreduce作業同時並發時 ,集群300cpu占滿,調整spark啟動參數,減少sparksumint資源占用,騰出相應的CPU,供spark作業使用
調整前:
/e3base/spark/sbin/start-thriftserver.sh --master yarn --deploy-mode client --driver-memory 8G --driver-cores 8 --num-executors 16 --executor-memory 8G  --executor-cores 6 --queue straapp &
 
調整后:
/e3base/spark/sbin/start-thriftserver.sh --master yarn --deploy-mode client --driver-memory 8G --driver-cores 2 --num-executors 16 --executor-memory 8G  --executor-cores 2 --queue straapp &
 
分隊列后:
/e3base/spark/sbin/start-thriftserver.sh --master yarn --deploy-mode client --driver-memory 8G --driver-cores 2 --num-executors 16 --executor-memory 8G  --executor-cores 2 --queue e3base &
 
 4、0930凌晨,通過調整spark啟動參數,騰出cpu,繼而修改業務側spark作業啟動參數,按1:4配置cpu和內存參數,提高各作業執行效率
調整前:
spark-submit --master yarn-cluster \
--driver-memory 4g --driver-cores 2 --num-executors 8 --executor-memory 4g  --executor-cores 2 \
--conf "spark.driver.extraJavaOptions=-XX:PermSize=1g -XX:MaxPermSize=1g" \
--queue generate \
 
增大executor-memory參數:
spark-submit --master yarn-cluster \
--driver-memory 4g --driver-cores 2 --num-executors 8 --executor-memory 8g  --executor-cores 2 \
--conf "spark.driver.extraJavaOptions=-XX:PermSize=1g -XX:MaxPermSize=1g" \
--queue straapp \
 
將原來每個作業8*2的並發數調整到10*3個並發,但發現效率沒有得到提升:
spark-submit --master yarn-cluster \
--driver-memory 4g --driver-cores 1 --num-executors 10 --executor-memory 12g  --executor-cores 3 \
--conf "spark.driver.extraJavaOptions=-XX:PermSize=1g -XX:MaxPermSize=1g" \
--queue straapp \
 
最終將作業啟動參數調整如下:
spark-submit --master yarn-cluster \
--driver-memory 4g --driver-cores 1 --num-executors 8 --executor-memory 8g  --executor-cores 2 \
--conf "spark.driver.extraJavaOptions=-XX:PermSize=1g -XX:MaxPermSize=1g" \
--queue generate \
 
5、為避免業務測比較重要的spark作業資源不夠用,09.30晚上,增加generate隊列,只跑sparksumit作業,通過隊列的內存、cpu、權重配置,盡量避免資源爭搶
調整前:只有straapp和e3base兩個隊列,業務側有mapreduce作業和spark作業,以及sparksubmit全部跑在straapp隊列上,有資源搶占,prom部門每天晚上會跑幾個特別小的作業在e3base隊列上
 
調整后:
新加了generate隊列,只跑spark類型的作業,mapreduce跑在straapp隊列上 ,sparksubmit提交到到e3base隊列上
 
 
6、10.1凌晨,觀察業務側標簽入庫作業,沒有發現相關報錯,但正常情況入庫只需要兩個小時多,而這幾天入庫需要六個小時,甚至八個小時。調整mapred-site.xml文件中,原注釋的mapreduce.input.fileinputformat.split.minsize,mapreduce.input.fileinputformat.split.maxsize兩個參數,開啟,並將值改成128M,默認block size=256M。由於入庫期間集群資源充足,增加並發寫hbase
 
結論:調整參數后,入庫效率明顯提升30~40%
 
7、10.01白天,修改hbase的flush size大小,參數:hbase.hregion.memstore.flush.size,目前默認配置128M,配置為256M,block size是256M, 每次update之后會檢查此region memstore是否達到這個大小,達到之后就會請求flush, 調大此參數,減少flush次數
 
8、10.01白天,協助業務側相關建表語句預分區調整
create 'stra_opr:RM_USERLABEL_INFO_TEMP',{ NAME => 'a', COMPRESSION => 'snappy'},{SPLITS => ['03','06','09','12','15','18','21','24','27','30','33','36','39','42','45','48','51','54','57','60','63','66','69','72','75','78','82','86','90']}
 
create 'stra_opr:RM_USERLABEL_INFO',{ NAME => 'a', COMPRESSION => 'snappy'},{SPLITS => ['025','050','075','100','125','150','175','200','225','250','275','300','325','350','375','400','425','450','475','500','525','550','575','600','625','650','675','700','725','750','775','800','825','850','875','900','925','950','975']}
 
9、調整hbase參數,hbase.hstore.compaction.min.sizehbase.regionserver.thread.compaction.small,減少compact的壓力
 
10、每天晚上10點~11點,HBASE腳本動執行
flush 'stra_opr:RM_USERLABEL_INFO'
major_compact 'stra_opr:RM_USERLABEL_INFO' 
 
20191003晚修改參數
 
11、修改hbase regionserver堆內存配置
修改如下:
export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS $HBASE_JMX_BASE -XX:SurvivorRatio=2 -server -Xmx32768m -Xms32768m -Xmn4096m -Xss256k -XX:PermSize=1g -XX:MaxPermSize=1g -XX:+UseParNewGC -XX:MaxTenuringThreshold=15  -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:+CMSClassUnloadingEnabled -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=75 -XX:-DisableExplicitGC"
 
12、修改hbase master的堆內存配置
修改前:
export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS $HBASE_JMX_BASE -Xmx16384m -Xms16384m -Xmn1500m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70"
 
修改后:
export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS $HBASE_JMX_BASE -Xmx32g -Xms32g -Xmn1500m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70"
 
13、修改yarn nodemanager並發
將cpu30改成15,內存不變,比例變成1:8
修改前:
 
修改后:
 
14、修改各隊列資源
將cpu內存1:4改成1:8
修改前:
 
修改后:
 
15、修改業務側spark作業內存,將cpu與內存改成1:8
修改前:
spark-submit --master yarn-cluster \
--driver-memory 4g --driver-cores 1 --num-executors 8 --executor-memory 8g  --executor-cores 2 \
--conf "spark.driver.extraJavaOptions=-XX:PermSize=1g -XX:MaxPermSize=1g" \
--queue generate \
 
修改后:
spark-submit --master yarn-cluster \
--driver-memory 4g --driver-cores 1 --num-executors 8 --executor-memory 16g  --executor-cores 2 \
--conf "spark.driver.extraJavaOptions=-XX:PermSize=1g -XX:MaxPermSize=1g" \
--queue generate \ 
 
 
后續待辦
(1)集群規模擴容,目前yarn作業數量較多時,每台主機30個並發,跑起來集群資源占用率很高,尤其CPU,懷疑就是因為CPU導致hbase集群出現異常,已經將每台主機的並發改成15,目前運行穩定,已經跟局方申請主機
(2)建議業務側修改入庫代碼,減少重復部分,或改用mapreduce方式
 
 
調優后遺留問題:
1、業務側標簽入庫耗時2~2.5小時,可以整改入庫方式,縮短時間
2、仍然不定時出現regionserver異常
3、每天有標簽入庫、spark作業、spark thriftserver2、kafka、mapreduce這幾種作業,目前集群共150c,spark thriftserver2和kafka是常駐進程,共占用67c,目前spark作業並沒有全部啟動,每天只跑十幾個作業,后續局方通知跑全部活動的話,資源可能不夠用,有可能還是不能當天跑完所有作業,擴容后能否完成要到時候觀察


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM