HiBenchが成長ノート - (10)のソースコードを解析し、execute_with_log.py

 

!は/ usr / binに/のenv python2の1または複数の下には、Apache Software Foundation(ASF)にライセンス貢献者のライセンス契約。一緒に配布NOTICEファイルを参照してください著作権の所有権に関する追加情報については、この作品を。ASFライセンスはApache Licenseの下であなたにこのファイルを、バージョン2.0 (「ライセンス」)。あなたは遵守を除いて、このファイルを使用することはできませんライセンス。あなたは時にライセンスのコピーを入手することができる     http://www.apache.org/licenses/LICENSE-2.0 、ソフトウェア適用される法律または書面での同意がない限りライセンスの下で配布さが上に分散されBASIS、「AS IS」明示または黙示のいかなる種類の保証または条件なし、。具体的な許可およびのためのライセンスを参照してください
#のライセンスの下で制限。

インポートSYS、OS、サブプロセス
 から terminalsize インポートget_terminal_size
 から時間インポート時間、睡眠
 インポートインポートのfnmatchの

デフload_colors():
    color_script_fn = os.path.join(os.path.dirname(__FILE__)、" color.enabled.sh "
    (Fなど)color_script_fn:オープンと
        戻り辞書([(K、v.split(" ' ")[1] .replace(' \ Eが[ '" \ 033 [ "))のための K、V における X [ .strip()。スプリット(' = 'のためのx における f.readlines()場合 x.strip() しないが、(x.strip)。STARTSWITH(' ' )]])
 = load_colors()
 もし INT( os.environ.get(" HIBENCH_PRINTFULLLOG "、0)):
    カラー[ ' RET ' ] = os.linesep
 
    カラー[ ' RET ' ] = ' \ R ' 

tab_matcher = re.compile(" \ tの" 
タブストップ = 8
 DEF replace_tab_to_space(S):
     DEF tab_replacer (マッチ):
        POS = match.start()
        長さ =のPOS%のタブストップ
         なら ない長さ:長さ+ = タブストップの
         リターン "  " *リターンtab_matcher.sub(tab_replacer、s)は

クラス_Matcher:
    Hadoopの = re.compile(R " 。^ *マップ\ S * = \は%)\ D +(S *、\ sは* \を削減(* = \は、*のSのS \ D +)%。* $ " 
    hadoop2 = re.compile(R " ^。*マップの\ S + \ sの*(\ D +)%\ S + \ sの+ \ sの*(\ D +)%を削減。* $ " 
    火花 = re.compile(R " ^は。*ステージの\ Sで終了したタスクの\ S +がで+ \(TIDの\ S + \)。*上。* \((\ D +)/(\ dは+)\)\はよ* $ " DEF :(自己、ライン)が一致
         するため、P における[self.hadoop、self.hadoop2] 
            M = p.match(行)
             場合M:
                 リターン(フロート(m.groups()[0])+フロート(m.groups()[1]))/ 2 のために P における[self.spark]:
            M = p.match(ライン)
             もしM:
                 リターンフロート(m.groups()[0])/フロート(m.groups()[1])* 100 
マッチャ = _Matcher()デフshow_with_progress_bar(ライン、進捗状況、line_widthの
    ):""」
    プログレスバーで表示するテキスト。
    @progress:0-100 
    @line:テキストを表示する
    @line_widthを:画面の幅""」
    POS = INT(line_widthの*進捗/ 100 の場合

        
        



    LEN(ライン)< line_widthの: =行+ "  " *(line_widthの- LEN(行)) = " {On_Yellow} {line_seg1} {On_Blue} {line_seg2} {Color_Off} {RET} " .format(
        line_seg1 =ライン【:POS]、line_seg2 =行[POS:]、** カラー)
    sys.stdout.write(ライン)

DEF (workload_result_file、command_linesを実行):
    PROC = subprocess.Popen("  " .join(command_lines)、シェル=真、BUFSIZE = 1、STDOUT = subprocess.PIPE、標準エラー= subprocess.STDOUT)
    カウント = 100 
    last_time = 0
    LOG_FILE =オープン(workload_result_file、' W ' #が表示さhttp://stackoverflow.com/a/4417735/1442961 
    lines_iterator = ITER(proc.stdout.readline、B "" のためのラインlines_iteratorは:
        カウント + = 1
         であれば、カウント> 100 または時間() - last_time> 1: 100行のために、端末のサイズを更新したり、各秒 
            カウント、last_time = 0、時間()
            幅、高さ = get_terminal_size() - = 1 試み

         
            ライン = line.rstrip()
            log_file.write(ライン + " \ n個" 
            log_file.flush()
        を除くKeyboardInterrupt:
            proc.terminate()
            ブレーク
        ライン = line.decode(' UTF-8 '  = replace_tab_to_space(ライン)
         #の印刷形式(カラー**)、ライン"{赤} => {Color_Off}ログ"。 
        LLINE = line.lower()

        DEF table_not_found_in_log(ライン):
            table_not_found_patternは = " *表*が見つかりません"
            正規表現 = fnmatch.translate(table_not_found_pattern)
            reobj = re.compile(正規表現)
             場合reobj.match(ライン):
                 返す真の
             返す

        デフdatabase_default_exist_in_log(ライン):
            database_default_already_exist = " データベースのデフォルトがすでに存在している" 
            場合 database_default_already_exist 行:
                 リターン真の
             返す

        デフuri_with_key_not_found_in_log(ライン):
            uri_with_key_not_foundは = " [dfs.encryption.key.provider.uri]キーでURIを見つけることができませんでした" 
            場合 uri_with_key_not_found :行
                 を返す真の
             返すFalseの

        場合' エラー'   LLINE) LLINE。 lstrip()== LLINE:
             #1 バイパスハイブ「エラーのとKeyProviderCacheエラー 
            bypass_error_condition = table_not_found_in_log database_default_exist_in_log(LLINE)又はuri_with_key_not_found_in_log(LLINE)
             なら ないbypass_error_condition:
                COLOR = " " 
                sys.stdout.write((U " {%S}、{行} {Color_Off} {ClearEnd} \ n "%COLOR).format(ライン=行、**カラー).encode(' UTF-8 ' ))
            
        もし LEN(ライン)> = 幅: =行[:幅4] + ' ... ' 
            進捗 = matcher.match(LLINE )
             の場合進歩はありません ではない:なし
                show_with_progress_bar(線、進行、幅)
            
                sys.stdout.write(U " {行} {ClearEnd} {RET} " .format(line =行、**カラー).encode(' UTF- 8 ' ))
        sys.stdout.flush()
    印刷
    log_file.close()
    試す
        proc.wait()
    以外KeyboardInterrupt:
        proc.kill()
        リターン 1
     リターンproc.returncode 

DEF test_progress_bar()
     のための I における範囲(101):
        show_with_progress_bar(" 試験進捗:%D "%I、I、80 
        sys.stdout.flush()

        睡眠( 0.05 

場合 __name__ == " __main__ " 
    sys.exit(実行(workload_result_file = sys.argvの[1 ]、
                     command_lines = sys.argvの[2 :]))
 #1     test_progress_bar()

 

おすすめ

転載: www.cnblogs.com/ratels/p/11070615.html