Oozie分散式任務的工作流——腳本篇

来源:http://www.cnblogs.com/xing901022/archive/2016/11/19/6079665.html
-Advertisement-
Play Games

繼前一篇大體上翻譯了Email的Action配置,本篇繼續看一下Shell的相關配置。 Shell Action Shell Action可以執行Shell腳本命令,工作流會等到shell完全執行完畢後退出,再執行下一個節點。為了運行shell,必須配置 以及 ,並且設置 來執行shell. She ...


繼前一篇大體上翻譯了Email的Action配置,本篇繼續看一下Shell的相關配置。

Shell Action

Shell Action可以執行Shell腳本命令,工作流會等到shell完全執行完畢後退出,再執行下一個節點。為了運行shell,必須配置job-tracker以及name-node,並且設置exec來執行shell.

Shell既可以使用job-xml引用一個配置文件,也可以在shell action內直接配置。shell action中的配置會覆蓋job-xml中的配置。

EL表達式同樣適用於shell action。

註意,mapred.job.tracker以及fs.default.name屬性不能再shell action中直接配置。

在mapreduce任務中可以處理一些資源,這樣shell就可以使用了。更多的內容參考[WorkflowFunctionalSpec#FilesAchives]``[Adding Files and Archives for the Job]章節。

shell的輸出可以被後面的工作流任務使用,這些信息可以用來配置一些關鍵的信息。如果shell的輸出想要對整個工作流任務可用,那麼必須滿足

  • 輸出的格式是標準的java屬性文件
  • 輸出的內容不能超過2KB

語法

<workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.3">
    ...
    <action name="[NODE-NAME]">
        <shell xmlns="uri:oozie:shell-action:0.1">
            <job-tracker>[JOB-TRACKER]</job-tracker>
            <name-node>[NAME-NODE]</name-node>
            <prepare>
               <delete path="[PATH]"/>
               ...
               <mkdir path="[PATH]"/>
               ...
            </prepare>
            <job-xml>[SHELL SETTINGS FILE]</job-xml>
            <configuration>
                <property>
                    <name>[PROPERTY-NAME]</name>
                    <value>[PROPERTY-VALUE]</value>
                </property>
                ...
            </configuration>
            <exec>[SHELL-COMMAND]</exec>
            <argument>[ARG-VALUE]</argument>
                ...
            <argument>[ARG-VALUE]</argument>
            <env-var>[VAR1=VALUE1]</env-var>
               ...
            <env-var>[VARN=VALUEN]</env-var>
            <file>[FILE-PATH]</file>
            ...
            <archive>[FILE-PATH]</archive>
            ...
            <capture-output/>
        </shell>
        <ok to="[NODE-NAME]"/>
        <error to="[NODE-NAME]"/>
    </action>
    ...
</workflow-app>
  • prepare元素,經常用於創建一系列的目錄或者刪除目錄。註意目錄必須是hdfs://host:port這種格式的。
  • job-xml元素,指定shell任務的配置。在0.2的schema中,job-xml元素允許指定多個job-xml文件。
  • configuration元素,包含了shell任務的配置信息。
  • exec元素,這個是必填項。包含了shell腳本的路徑,並執行它。參數可以設置0個或者多個argument元素。
  • argument元素,用於傳遞給shell腳本。
  • env-var元素,可以設置環境變數,傳遞給shell腳本。env-var需要包含鍵值對這種的信息。比如包含$PATH這種信息,那麼需要設置PATH=$PATH:mypath這種格式。不要使用${}這種語法,因為它會被認為是Oozie的EL表達式。
  • shell action也可以創建hadoop的配置。shell應用可以直接讀取配置文件。
  • capture-output元素,用來指定輸出端。shell命令輸出必須是java屬性這種格式,並且小於2kb.通過工作流的定義,輸出也可以通過string action實現。

上面這些元素都支持EL表達式。

例子

如何運行shell或者perl腳本。

<workflow-app xmlns='uri:oozie:workflow:0.3' name='shell-wf'>
    <start to='shell1' />
    <action name='shell1'>
        <shell xmlns="uri:oozie:shell-action:0.1">
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <configuration>
                <property>
                  <name>mapred.job.queue.name</name>
                  <value>${queueName}</value>
                </property>
            </configuration>
            <exec>${EXEC}</exec>
            <argument>A</argument>
            <argument>B</argument>
            <file>${EXEC}#${EXEC}</file> <!--Copy the executable to compute node's current working directory -->
        </shell>
        <ok to="end" />
        <error to="fail" />
    </action>
    <kill name="fail">
        <message>Script failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
    </kill>
    <end name='end' />
</workflow-app>

用於提交oozie工作的參數有

oozie.wf.application.path=hdfs://localhost:8020/user/kamrul/workflows/script#Execute is expected to be in the Workflow directory.
#Shell Script to run
EXEC=script.sh
#CPP executable. Executable should be binary compatible to the compute node OS.
#EXEC=hello
#Perl script
#EXEC=script.pl
jobTracker=localhost:8021
nameNode=hdfs://localhost:8020
queueName=default

如何運行java程式並添加jar包

<workflow-app xmlns='uri:oozie:workflow:0.3' name='shell-wf'>
    <start to='shell1' />
    <action name='shell1'>
        <shell xmlns="uri:oozie:shell-action:0.1">
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <configuration>
                <property>
                  <name>mapred.job.queue.name</name>
                  <value>${queueName}</value>
                </property>
            </configuration>
            <exec>java</exec>
            <argument>-classpath</argument>
            <argument>./${EXEC}:$CLASSPATH</argument>
            <argument>Hello</argument>
            <file>${EXEC}#${EXEC}</file> <!--Copy the jar to compute node current working directory -->
        </shell>
        <ok to="end" />
        <error to="fail" />
    </action>
    <kill name="fail">
        <message>Script failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
    </kill>
    <end name='end' />
</workflow-app>

提交的相關參數

oozie.wf.application.path=hdfs://localhost:8020/user/kamrul/workflows/script#Hello.jar file is expected to be in the Workflow directory.
EXEC=Hello.jar
jobTracker=localhost:8021
nameNode=hdfs://localhost:8020
queueName=default

shell Action日誌

shell action標準輸出和錯誤輸出都可以直接輸出到oozie的mapreduce任務控制臺上。

通過oozie web控制台,也可以看到它的執行日誌。

shell action的限制

儘管shell可以執行任何的腳本命令,但是還是有一些限制的。

  • 不支持互動式的命令
  • 命令不能使用不同的用戶執行
  • 用戶必須嚴格控制上傳的jar包。oozie會把他上傳到分散式環境中進行緩存
  • 儘管oozie在hadoop的計算節點執行shell命令,但是可能有一些預設安裝的工能是不支持的。因此需要瞭解,oozie可以支持安裝在計算節點的命令。

實戰分析

shell可以輸出java properties格式的數據,並且可以配合EL表達式,在其他的action中使用。因此它可以作為工作流的初始化任務,以及配置服務。

比如,在腳本中:

#!/bin/sh
a=1
b=2
echo "a=$a"
echo "b=$b"

在其他的節點中就可以通過EL表達式來使用了。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原文地址 以下是消息隊列以下的大綱,本文主要介紹消息隊列概述,消息隊列應用場景和消息中間件示例(電商,日誌系統)。 本次分享大綱 消息隊列概述 消息隊列應用場景 消息中間件示例 JMS消息服務(見第二篇:大型網站架構系列:分散式消息隊列(二)) 常用消息隊列(見第二篇:大型網站架構系列:分散式消息隊 ...
  • hello,各位小伙伴們,在很多小伙伴們剛剛開始學習android的時候,常常會有一些project裡面需要有一些基本動畫的插入,那麼具體是要怎麼實現呢?我們接下一起分析一下在android中的幾種基本動畫。 (這裡我們預設是用個人覺得比eclipse更智能一些的Android Studio來實現。 ...
  • 生命周期對程式員很重要,特別當我們瞭解,就可以寫出更流暢的程式,更好的來避規性能瓶頸,讓我們的APP擁有更好的用戶體驗。接下來我們來分享一下“返回棧”。 安卓的活動中重疊的,當我們打開一個新的活動時,會覆蓋上一個活動。然後點“back”時會銷毀最上面的活動,下麵的一個活動就會顯示出來。... ...
  • AndRodi Studio中的按鈕時件註冊一定要寫在onCraete中 ...
  • 相信很多同學都為調試蘋果的通知煩惱過,特別是通過通知啟動app這個功能,簡直讓人欲哭無淚!!! 然而我們都遇到的問題,蘋果怎麼可能沒有想到,原來早就有了官方的解決辦法,只是我們不知道而已。。。 這次又是從stackOverFlow上找到了答案,必須記錄一下!!! iOS10以後,通知框架被完全重構了 ...
  • 當一個程式第一次啟動的時候,Android會啟動一個LINUX進程和一個主線程。預設的情況下,所有該程式的組件都將在該進程和線程中運行。 同時,Android會為每個應用程式分配一個單獨的LINUX用戶。Android會儘量保留一個正在運行進程,只在記憶體資源出現不足時,Android會嘗試停止一些進 ...
  • 1.路徑最好不要是自己拼寫的路徑/mnt/shell/emulated/0/wifidog.conf 最好是通過方法獲取的路徑,不然可能導致命令無效 (掛載點的原因) public static final String SDCARD_ROOT=Environment.getExternalStor ...
  • 前言 啦啦啦~大家好,又見面啦~ 本篇博文講和大家一起完成一個需要註冊、登錄的備忘錄的,一起學習 SharedPreferences 的基本使用,學習 Android 中常見的文件操作方法,複習 Android 界面編程。 直接進入正題~ 基礎知識 1.SharedPreferences 的使用 使 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...