Skip to content

antony@notes:~/data-platform$ cat "資科平台重要資訊.md"

資科平台重要資訊

2022-08-04· data-platform ·資料科技平台

資科平台重要資訊

[TOC]

查看 hadoop 管理者帳號

$ hdfs dfs -ls -d /
  • -d ,Directories are listed as plain files.

output :

drwxr-xr-x   - bigred bigboss          0 2022-07-27 23:08 /
  • hdfs 檔案系統 根目錄 的擁有者 : bigred

練習寫一隻程式

功能 : 透過 time 命令以及 for 迴圈,得出在 YARN 運算系統執行 x 支程式 跑 n 輪的時間,並將每次得到的時間平均

用法 :

參數 1 為 : 設定幾支 map 程式 參數 2 為 : 設定要 run 幾輪

完整程式

#!/bin/bash

[ "$#" != "2" ] && echo -e "\n用法\n\n參數 1 為 : 設定幾支 map 程式\n參數 2 為 : 設定要 run 幾輪\n" && exit 1

# clean file
cat /dev/null > /tmp/txt
cat /dev/null > /tmp/average

# 收集資料
for ((i=0;i<${2};i=i+1))
do
  /usr/bin/time -p -o /tmp/txt yarn jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-${HADOOP_HOME##*-}.jar pi $1 10000000 &>/dev/null
  cat /tmp/txt | grep 'real' | cut -d " " -f 2 >>/tmp/average
done

# 加總收集到的秒數
a=0
while read line
do
  a=$(echo "${line} + ${a}" | bc)
done < /tmp/average

# 取平均值
c=$(cat /tmp/average | wc -l)
average=$(echo "scale=5; ${a}/${c}" | bc)
t=$(echo "${1} + 2" | bc)
echo -e "\n總共 ${t} 支程式,跑 ${c} 輪的平均時間 : ${average} 秒\n"

程式解析

  • #!/bin/bash , 宣告以下程式內容由 bash 程式執行
  • $# ,參數總數
  • echo -e ,讓 \ 反斜線轉譯
    • \n ,換行符號
  • cat /dev/null > /tmp/txt ,將 /tmp 目錄下的 txt 檔案清空
  • for ((i=0;i<${2};i=i+1)) ,格式為 for ((起始值;最大值;累進值))
  • $2 ,第二個參數,主要用來設定跑幾輪
  • time 用於統計命令執行所消耗的時間及相關係統資源等資訊。
    • /usr/bin/time ,用絕對路徑的原因是因為如果只執行 time ,會去執行 busybox 的 time 命令,功能不完整
    • -p ,使用相容輸出格式,real %e user %U sys %S
    • %e,執行指令所花費的時間,單位是秒
    • %S:指令執行時在內核模式(kernel mode)所花費的時間,單位是秒
    • %U:指令執行時在用戶模式(user mode)所花費的時間,單位是秒
    • -o /tmp/txt,設定結果輸出到 /tmp 目錄下的 txt 檔案。這個選項會將 time 的輸出寫入所指定的檔案中。如果檔案已經存在,覆寫其內容
    • 詳解 Linux time 命令的使用 連結
  • yarn jar ,Runs a jar file. Users can bundle their Yarn code in a jar file and execute it using this command.
    • *.jar ,人家寫好的 java 程式
    • pi ,計算 pi 值
    • 2 ,產生兩個 map 程式
    • 100000 ,座標
    • reduce ,會幫我們處理和分析 examples-3.3.3.jar 的資料
    • &>/dev/null ,將 1 號裝置 (標準輸出) 和 2 號裝置 (警告訊息 or 錯誤訊息) 重導到 黑洞
  • cat /tmp/txt,將檔案內容顯示在螢幕上
    • | ,pipe,將左邊命令執行後的結果輸入給右邊的命令
    • grep 'real',搜索 real 字串
    • cut -d " ",指定用空格作為分隔符號,-f 2,將第 2 欄的內容剪下
    • >>/tmp/average,將左邊 cut 完的結果 append 到 /tmp 目錄下的 average 這個檔案
  • while 結合 read 的語法,先讀檔(每次會只讀一行)後,再跑迴圈。
  • a=$(echo "${line} + ${a}" | bc),因 bash 不支援有小數的運算,所以要透過 pipe 丟給 bc 這個命令去算
  • wc -l ,得出檔案有幾行
  • scale=5,小數點後面保留 5 位數,預設為 0

程式執行結果

$ bash time.sh 5 5

總共 7 支程式,跑 5 輪的平均時間 : 18.58800 秒
tags: 資料科技平台