Apache Doris通過supervisor進行進程管理


下面一段文字是摘自doris官方文檔:
注:在生產環境中,所有實例都應使用守護進程啟動,以保證進程退出后,會被自動拉起,如 Supervisor。如需使用守護進程啟動,需要修改各個 start_xx.sh 腳本,去掉最后的 & 符號

首先安裝supervisor,具體請參照本人的另一篇博客CentOS7 安裝supervisor守護進程管理器

 

1 配置palo be 進程管理

1.1 修改各個 start_be.sh 腳本,去掉最后的 & 符號

/home/workspace/palo-0.8.2/be/bin/start_be.sh

:wq保存退出

1.2 創建be supervisor進程管理配置文件

輸入命令:

vim /etc/supervisord.d/palo_be-0.8.2.ini

填寫以下內容

[program:palo_be]      
process_name=%(program_name)s                 ;進程名稱        
directory=/opt/palo-0.8.2/be                  ;工作目錄
command=sh /opt/palo-0.8.2/be/bin/start_be.sh ;運行的命令
autostart=true                                ;自動開啟
autorestart=true                              ;自動重啟 
user=root                                     ;用戶
numprocs=1                                    ;進程數
startretries=3                                ;啟動重試次數
stopasgroup=true                              ;是否停止子進程
killasgroup=true                              ;是否殺死子進程
startsecs=5                                   ;啟動5秒后,如果還是運行狀態才認為進程已經啟動
//redirect_stderr = true
//stdout_logfile_maxbytes = 20MB
//stdout_logfile_backups = 10
//stdout_logfile=/var/log/supervisor-palo_be-0.8.2.log 

 

 

2 配置broker進程管理

2.1 修改各個 start_broker.sh 腳本,去掉最后的 & 符號

vim /opt/palo-0.8.2/apache_hdfs_broker/bin/start_broker.sh

:wq保存退出

 2.2 創建broker supervisor進程管理配置文件

輸入命令

vim /etc/supervisord.d/palo_broker-0.8.2.ini

輸入以下內容

[program:BrokerBootstrap]
environment = JAVA_HOME="/usr/java/jdk1.8.0_172-amd64"
process_name=%(program_name)s                                       ;進程名稱
directory=/opt/palo-0.8.2/apache_hdfs_broker                        ;工作目錄
command=sh /opt/palo-0.8.2/apache_hdfs_broker/bin/start_broker.sh   ;運行的命令
autostart=true                                                      ;自動開啟
autorestart=true                                                    ;自動重啟
user=root                                                           ;用戶
numprocs=1                                                          ;進程數
startretries=3                                                      ;啟動重試次數
stopasgroup=true                                                    ;是否停止子進程
killasgroup=true                                                    ;是否殺死子進程
startsecs=5                                                         ;啟動5秒后,如果還是運行狀態才認為進程已經啟動
//redirect_stderr=true
//stdout_logfile_maxbytes=20MB
//stdout_logfile_backups=10
//stdout_logfile=/var/log/supervisor-BrokerBootstrap-0.8.2.log

 

3 配置fe進程管理

3.1 修改各個 start_fe.sh 腳本,去掉最后的 & 符號

vim /opt/palo-0.8.2fe/bin/start_fe.sh

:wq保存退出

 3.2 創建fe supervisor進程管理配置文件

輸入命令

vim /etc/supervisord.d/palo_fe-0.8.2.ini

輸入內容如下:

[program:PaloFe]
environment = JAVA_HOME="/usr/java/jdk1.8.0_172-amd64"
process_name=PaloFe                                 ;進程名稱
directory=/opt/palo-0.8.2/fe                        ;工作目錄
command=sh /opt/palo-0.8.2/fe/bin/start_fe.sh       ;運行的命令
autostart=true                                      ;自動開啟
autorestart=true                                    ;自動重啟
user=root                                           ;用戶
numprocs=1                                          ;進程數
startretries=3                                      ;啟動重試次數
stopasgroup=true                                    ;是否停止子進程
killasgroup=true                                    ;是否殺死子進程
;startsecs=10                                        ;啟動5秒后,如果還是運行狀態才認為進程已經啟動
//redirect_stderr=true
//stdout_logfile_maxbytes=20MB
//stdout_logfile_backups=10
//stdout_logfile=/var/log/supervisor-PaloFe-0.8.2.log

 

4. 驗證

4.1 先確保沒有palo fe,be,broker進程在運行,如果有則使用kill -9  [processid]殺死掉

停止掉fe,broker

[root@palo252 palo-0.8.2]# jps
50258 DataNode
60387 Jps
59908 PaloFe
50109 NameNode
40318 BrokerBootstrap
[root@palo252 palo-0.8.2]# kill -9 59908
[root@palo252 palo-0.8.2]# kill -9 40318

說明: BrokerBootstrap為broker的進程名稱,PaloFe為fe的進程名稱

停止掉be

[root@palo252 palo-0.8.2]# ps -e | grep palo
59362 ?        00:00:07 palo_be
[root@palo252 palo-0.8.2]# kill -9 59362

 

4.2 啟動supervisor,驗證fe,be,broker是否啟動

啟動supervisor

supervisord -c /etc/supervisord.conf 

 

查看狀態:

[root@palo252 palo-0.8.2]# supervisorctl status
BrokerBootstrap                  RUNNING   pid 64312, uptime 0:00:16
PaloFe                           RUNNING   pid 64314, uptime 0:00:16
palo_be                          RUNNING   pid 64313, uptime 0:00:16

 

驗證fe,be,broker進程是否啟動

[root@palo252 palo-0.8.2]# jps 50258 DataNode
63846 Jps
61548 BrokerBootstrap
50109 NameNode
60734 PaloFe
[root@palo252 palo-0.8.2]# ps -e | grep palo 61118 ?        00:00:01 palo_be

我們發現進程確實已經啟動了

 

4.3 通過supervisorctl stop后,進程是否停止

be:

[root@palo252 palo-0.8.2]# supervisorctl stop palo_be
palo_be: stopped
[root@palo252 palo-0.8.2]# ps -e | grep palo

be停止成功

 

fe:

[root@palo252 palo-0.8.2]# supervisorctl stop PaloFe
PaloFe: stopped
[root@palo252 palo-0.8.2]# jps
50258 DataNode
64411 BrokerBootstrap
50109 NameNode
65295 Jps

fe停止成功

 

broker:

[root@palo252 palo-0.8.2]# jps
50258 DataNode
64411 BrokerBootstrap
50109 NameNode
65295 Jps
[root@palo252 palo-0.8.2]# supervisorctl stop BrokerBootstrap
BrokerBootstrap: stopped
[root@palo252 palo-0.8.2]# jps
65328 Jps
50258 DataNode
50109 NameNode

broker停止成功

 

4.4 通過supervisorctl start可以開啟進程

[root@palo252 palo-0.8.2]# jps
50258 DataNode
65400 Jps
50109 NameNode
[root@palo252 palo-0.8.2]# ps -e | grep palo
[root@palo252 palo-0.8.2]# supervisorctl start all
palo_be: started
PaloFe: started
BrokerBootstrap: started
[root@palo252 palo-0.8.2]# supervisorctl status
BrokerBootstrap                  RUNNING   pid 65421, uptime 0:00:21
PaloFe                           RUNNING   pid 498, uptime 0:00:21
palo_be                          RUNNING   pid 65422, uptime 0:00:21
[root@palo252 palo-0.8.2]# jps
50258 DataNode
65480 BrokerBootstrap
1212 Jps
50109 NameNode
1101 PaloFe
[root@palo252 palo-0.8.2]# ps -e | grep palo
  500 ?        00:00:00 palo_be

結果顯示啟動控制成功。

 

4.5 驗證在fe,be,broker崩潰后supervisor能夠自動重啟進程

 輸入命令ps xuf 查看進程間的父子關系

ps xuf
root     64311  0.0  0.0 221680 12884 ?        Ss   16:48   0:00 /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf
root     65421  0.0  0.0 113124  1528 ?        S    16:55   0:00  \_ sh /opt/palo-0.8.2/apache_hdfs_broker/bin/start_broker.sh
root     65480  0.2  0.1 24345924 44188 ?      Sl   16:55   0:00  |   \_ /usr/java/jdk1.8.0_172-amd64/bin/java -Xmx20480m -Dfile.encoding=UTF-8 com.baidu.palo.broker.hdfs.BrokerBootstrap
root     65422  0.0  0.0 113128  1540 ?        S    16:55   0:00  \_ sh /opt/palo-0.8.2/be/bin/start_be.sh
root       500  0.5  0.3 1787780 91400 ?       Sl   16:55   0:00  |   \_ /opt/palo-0.8.2/be/lib/palo_be
root       498  0.0  0.0 113120  1492 ?        S    16:55   0:00  \_ sh /opt/palo-0.8.2/fe/bin/start_fe.sh
root      1101  6.1  1.3 9002228 342412 ?      Sl   16:55   0:10      \_ /usr/java/jdk1.8.0_172-amd64/bin/java -Xmx5120m -XX:+UseMembar -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:+PrintGCDateStamps -XX:+PrintGCDetails 

我們發現在該列表中 fe的pid為1101,be的pid為500,broker的pid為65480

執行下面命令殺死這三個進程

kill -9 1101
kill -9 500 
kill -9 65480

再次輸入ps xuf 查看進程父子關系

ps xuf
root     64311  0.0  0.0 221680 12892 ?        Ss   16:48   0:00 /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf
root      1375  0.0  0.0 113124  1548 ?        S    17:03   0:00  \_ sh /opt/palo-0.8.2/fe/bin/start_fe.sh
root      1709 14.0  1.3 9004284 330748 ?      Sl   17:03   0:09  |   \_ /usr/java/jdk1.8.0_172-amd64/bin/java -Xmx5120m -XX:+UseMembar -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+Us
root      1791  0.0  0.0 113128  1540 ?        S    17:03   0:00  \_ sh /opt/palo-0.8.2/be/bin/start_be.sh
root      2054  0.7  0.3 1774784 92008 ?       Sl   17:03   0:00  |   \_ /opt/palo-0.8.2/be/lib/palo_be
root      2265  0.0  0.0 113124  1528 ?        S    17:03   0:00  \_ sh /opt/palo-0.8.2/apache_hdfs_broker/bin/start_broker.sh
root      2295  0.6  0.1 24345924 42224 ?      Sl   17:03   0:00      \_ /usr/java/jdk1.8.0_172-amd64/bin/java -Xmx20480m -Dfile.encoding=UTF-8 com.baidu.palo.broker.hdfs.BrokerBootstrap

發現supervisor確實將進程重新啟動起來了。

 

說明一下:

通過supervisorctl status查詢出來的進程id其實不是fe,be,broker的進程id,而是啟動他們的shell進程id,start_xxx.sh里面會啟動真正的doris進程,所以才有了進程樹之說,所以我們在配置的時候需要配置

stopasgroup=true ;是否停止子進程

killasgroup=true ;是否殺死子進程


這兩個參數為true,否則通過supervisorctl控制doris的后台進程是無效的,這個是通過supervisor做doris守護進程的關鍵。

 

5. FAQ

5.1. 如果在使用過程中出現類似:Exited too quickly (process log may have details)的錯誤,則應該是由於找不到JAVA_HOME造成的,在ini文件中添加相應的環境變量即可。盡管系統中已經配置了JAVA_HOME環境變量,但是supervisor啟動時並不會加載/etc/profile 文件

以加載環境變量,supervisor 提供了一個配置參數enviroment。配置格式為:

environment = JAVA_HOME="jdk具體路徑"   

如果有多個環境變量,中間以逗號分隔.如果應用程序依賴其他環境變量亦同理.

 

5.2 還有一個原因會導致出現Exited too quickly (process log may have details),就是sh腳本中的&沒有去掉,本人在使用supervisor管理hdfs的啟動的時候,就遇到了這個問題,默認start-dfs.sh,hadoop-daemon.sh start|stop namenode|datanode|secondarynamenode,

時,就遇到&沒有去掉的問題。

 

5.3 使用supervisor管理后,doris數據丟失厲害,尤其是頻繁創建表的時候

通過下面命令查看supervisor進程的文件描述符數目

cat /proc/{supervisor_proc_id}/limits

結果如下:

[edw@palo101 ~]$ ps -e | grep supervisor
 1034 ?        00:02:51 supervisord
[edw@palo101 ~]$ cat /proc/1034/limits
Limit                     Soft Limit           Hard Limit           Units     
Max cpu time              unlimited            unlimited            seconds   
Max file size             unlimited            unlimited            bytes     
Max data size             unlimited            unlimited            bytes     
Max stack size            8388608              unlimited            bytes     
Max core file size        unlimited            unlimited            bytes     
Max resident set          unlimited            unlimited            bytes     
Max processes             100000               100000               processes 
Max open files            1024                 1024                 files     
Max locked memory         65536                65536                bytes     
Max address space         unlimited            unlimited            bytes     
Max file locks            unlimited            unlimited            locks     
Max pending signals       256980               256980               signals   
Max msgqueue size         819200               819200               bytes     
Max nice priority         0                    0                    
Max realtime priority     0                    0                    
Max realtime timeout      unlimited            unlimited            us  

發現supervisor的最大文件描述符數量為1024,doris的be操作很多都是文件操作,被supervisor管理的子進程會繼承父進程的文件描述數量限制,所以這個有可能會導致be數據丟失,設置crash。

解決辦法為修改supervisor的最大文件描述符數目

sudo vim /usr/lib/systemd/system/supervisord.service

在service下添加內容:

LimitCORE=infinity
LimitNOFILE=100000
LimitNPROC=100000

修改后的完整文件內容為:

[Unit]
Description=Process Monitoring and Control Daemon
After=rc-local.service nss-user-lookup.target


[Service]
LimitCORE=infinity
LimitNOFILE=100000
LimitNPROC=100000

Type=forking
ExecStart=/usr/bin/supervisord -c /etc/supervisord.conf

[Install]
WantedBy=multi-user.target

 

if you wana to see the file descriptor number of your current process, you can use the command as follows:

 ls -lR /proc/{process_id}/fd | grep "^l" | wc -l

show an example:

[lenmom@192.168.1.101 log]$ ps -ef | grep palo
lenmom      6189  5966 13 15:32 ?        00:02:23 /opt/user/lenmom/doris-0.11.5/be/lib/palo_be
lenmom     14976 31169  0 15:50 pts/0    00:00:00 grep --color=auto palo
[lenmom@192.168.1.102 log]$  ls -lR /proc/6189/fd | grep "^l" | wc -l
531

 

使用supervisor配置palo守護進程的完畢,使用supervisor后,確實能夠提高應用的健壯性!


免責聲明!

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



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