mapr 介紹
December 31, 2020•343 words
mapr 是一個非同步,批次執行指令的程式。擁有以下特點:
- 非同步執行指令
- 可以指定同時執行指令的數目
- 指令執行失敗時,不在執行下一個指令
- 能夠取得過去執行程式的結果作為這個指令的輸入(過去結果儲存在檔案裡面)
- 能夠從檔案、指令執行結果、標準輸入做為指令參數
- 能夠自動產生暫時檔案或是 uuid 作為指令參數
使用情境
- 檢查特定主機的特定路徑是否有檔案,有檔案則顯示主機名稱
mapr -f '@a=hosts' 'ssh @a ls /somepath/somefile' 'echo @a' --last --no-header
上述指令執行從檔案讀取主機名稱(一行一個主機名稱),之後透過 ssh 指令檢查 /somepath/somefile
路徑是否存在,
如果存在則執行 echo
指令,印出主機名稱。如果路徑不存在,則不會執行 echo
指令。
@a
會被替換成檔案hosts裡面的每一行。檔案有 n 行,則執行 n 次。
- 刪除 OpenStack 下 project 所有的 volumes
mapr -c '@a=openstack volume list --format value --column ID' 'openstack volume delete @a'
先從 openstack volume list --format value --column ID
取得所有要刪除的 volume id。之後在一個一個傳進 openstack volume delete
做刪除動作。
上面指令與 openstack volume list --format value --column ID|xargs -L 1openstack volume delete
指令相似。但是透過 mapr 可以同時刪除多個 volume
- 刪除 OpenStack 下 project 下,放在特定主機的 volume
mapr -c '@a=openstack volume list --format value --column ID' 'openstack volume show @a' 'grep @stdout1 host1' 'openstack volume delete @a'
先從 openstack volume list --format value --column ID
取得所有要刪除的 volume id。之後透過 openstack volume show
看 volume 詳細資訊。
該指令的 stdout 會存放在 @stdout1
這個檔案裡面。方便後來的指令使用。grep @stdout1 host1
指令檢查檔案 @stdout1
(由第一個指令openstack volume show @a
產生的)
是否有包含 host1 這個字串。如果有的話,則執行下一個指令。刪除該 volume。
- 建立檔案 file1~file99
mapr -l '@a=1-100' 'touch file@a'
- 在 OpenStack 上建立 100 個 vm,vm 建立成功後立刻刪除
mapr -w 10 -l '@b=1-101' -u @a 'openstack server create --image image --network n1 --flavor f1 test-@a' 'openstack server delete test-@a'
上述指令會建; 100 個 vm ,vm 名字有 test-
這個 prefix,後面是 uuid。有 10 個 worker,指同時執行十個指令(可能是建立或是刪除)。
總共會建立100個 vm,但是至多有 10 vm 同時存在在系統。一個 worker 執行完建立與刪除 vm 後,才會在執行下一個建立與刪除vm的指令。
- 透過 multiprocess 進行 grep 搜索
mapr -w 20 -c '@a=ls|xargs -L1' 'grep -R @a' --no-header
將ls
看到的目錄丟給 grep -R
做搜索,至多有 20 的 process 同時處理。預設 grep
執行失敗的結果不會顯示在畫面上。
- 找出死掉的程序
./mapr -f '@a=hosts' -t @f1 -t @f2 -t @f3 --last \
"ssh @a ps aux|tail -n +2 |awk '{print \$2,\$8}'|grep D|awk '{print \$1}'|tee @f1" \
"sleep 3s" \
"ssh @a ps aux|tail -n +2 |awk '{print \$2,\$8}'|grep D|awk '{print \$1}'|tee @f2" \
"grep -f @f1 @f2|tee @f3" "cat @f3|ssh @a xargs ps -p"
- 顯示 kern.log 檔案裡面,每小時 audit 出現的次數
mapr -l '@a=1-10' "date '+%b %d %H:' -d '-1 days @a hours'" 'grep "`cat @stdout1`" kern.log|grep audit|wc -l' 'echo `cat @stdout1` `cat @stdout2`' --last --no-header|sort -u