jopen 4年前發佈 | 67K 次閱讀 分佈式/雲計算/大數據 Apache Falconhtml
Apache Falcon 是一個面向Hadoop的、新的數據處理和管理平臺,設計用於數據移動、數據管道協調、生命週期管理和數據發現。它使終端用戶能夠快速地將他們的數據及其相關的處理和管理任務「上載(onboard)」到Hadoop集羣。java
Apache Falcon解決了大數據領域中一個很是重要和關鍵的問題。升級爲頂級項目是該項目的一個重大進展。Apache Falcon有一個完善的路線圖,能夠減小應用程序開發和管理人員編寫和管理複雜數據管理和處理應用程序的痛苦。node
用戶會發現,在Apache Falcon中,「基礎設施端點(infrastructure endpoint)」、數據集(也稱 Feed)、處理規則均是聲明式的。這種聲明式配置顯式定義了實體之間的依賴關係。這也是該平臺的一個特色,它自己只維護依賴關係,而並不作任何繁重的工做。全部的功能和工做流狀態管理需求都委託給工做流調度程序來完成mysql
下面是Falcon的架構圖:web
從上圖能夠看出,Apache Falcon:sql
而按照開發人員Michael Miklavcic的說法,Apache Falcon使他們的團隊逐步構建起一個複雜的管道。該管道包含超過90個 Process 和200個Feed。若是單獨使用Apache Oozie,這會是一項重大挑戰。Hortonworks工程部門副總裁Greg Pavlik則表示,Apache Falcon是用於「數據湖(Data lake)」建模、管理和操做的最好的、最成熟的構建模塊。Hortonworks官方網站上提供了一個 在Hadoop中使用Apache Falcon的示例 。數據庫
目的:
使終端用戶在面向Hadoop集羣進行數據集處理和數據集管理更加容易。express
緣由
在Hadoop環境中,在各類數據集和處理關係之間創建關係
在集羣中進行數據集管理例如數據集聲明週期、數據集複製等
抓取數據集或者處理過程的血統信息。
容許本地數據和其餘任何地方的集羣進行數據整合。
與metastore和catalog進行整合,例如:Hive和Hcatalog
Easy to onboard new workflows/pipelines, with support for late data handling, retry policiesapache
Falcon是一個面向Hadoop的、數據處理和管理平臺。它被設計用於數據移動、數據管道協調、生命週期管理和數據備份等場景。Falcon本質上是經過數據處理引擎將數據集和處理過程的配置信息轉化爲重複的業務處理流程。api
在Apache Falcon中,集羣接口鏈接、數據集 、處理規則均是聲明式的。這種聲明式配置顯式定義了實體之間的依賴關係,這也是該平臺的一個特色,它自己只維護依賴關係,而並不作任何繁重的工做。全部的功能和工做流狀態管理需求都委託給工做流調度程序來完成。
Apache Falcon解決了大數據領域中一個很是重要和關鍵的問題。升級爲頂級項目是該項目的一個重大進展。Apache Falcon具備完善的功能實現,可使應用程序開發和管理人員在管理數據時實現自動化。
架構的總體框架
調度器
Falcon選擇Oozie做爲默認的調度器。固然Falcon也能夠和其餘的調度器進行整合。面向Hadoop的許多的數據處理組件都須要具有數據有效性和實時性兩方面的要求。Oozie正好知足這些屬性,所以將選擇Oozie做爲Falcon的調度器。
即便Oozie能夠工做的很好,但在某些場景中,Oozie的調度也被證實存在限制。在當前的版本中,Falcon依賴Oozie去調度和工做流的執行。 Falcon relies on Oozie for both scheduling and for workflow execution, due to which the scheduling is limited to time based/cron based scheduling with additional gating conditions on data availability. 這自己對數據集的週期性具備了強加的限制.爲了提供更好的調度能力,Falcon將推出本身的調度器。
控制流
即便實際工做中,調度器(Oozie)負責工做流,Falcon經過訂閱每個工做流可能產生的信息依舊保持着執行路徑。當Falcon在Oozie中產生一個工做流,When Falcon generates a workflow in Oozie, it does so, after instrumenting the workflow with additional steps which includes messaging via JMS.Falcon可以訂閱這些控制信息和可以完成例如撤銷,處理後序數據等的展現。
Feed Schedule flow
Process Schedule flow
部署模式
Falcon有兩種基本組件:Falcon Prism and Falcon Server,正如這個名字所說Falcon Prism切割到達Falcon server的請求。
Stand Alone Mode(獨立模式)
當Hadoop工做流和處理相關的數據僅僅涉及一個Hadoop集羣就可使用獨立模式。在這種模式中,Falcon Server經過Oozie去調度工做流在hadoop集羣。全部的 process/feed都會有提交,調度,掛起,殺死等過程信息被髮送到這個服務器。對於這種Falcon在配置過程當中應該使用獨立模式。
Distributed Mode(分佈式)
分佈式模式是爲了多個hadoop集羣的案例,以及須要多個工做流調度器去調度他們。在這種模式中,falcon有兩個組件Prism and Server(s),每一個Prism and servers都會有他們本身的計劃配置(運行時間和啓動任務所具有的配置)以及他們各自的配置位置。在這個模式中Prism做爲兩個falconServer的鏈接點,全部的命令對於Prism都適用,可是隻有read and instance api對Server是有用的。接下來的請求能被髮送到每個Hadoop集羣:
Prism:submit, schedule, submitAndSchedule, Suspend, Resume, Kill, instance management
Server: schedule, suspend, resume, instance management
正如上面觀察到的,Submit和Kill只能對Prism進行,這樣能夠保持全部的配置信息在不一樣的集羣中保持同步。
請求能夠經過Prism發出直接在CLI指定-colo參數來指定特定的falcon集羣,or append the same in web request, if using API.
在Falcon Prism中,當一個cluster被提交,它被默認的發到每個Falcon server。當Feed被提交或者調度後,只會被髮送到feed/process配置文件中指定的FalconServer。Server屬性在feed/process的xml文件中經過 CLUSTER標籤來指定。
Communication between prism and falcon server (for submit/update entity function) is secured over https:// using a client-certificate based auth.Prism server須要提供有效的客戶端驗證才能使Falcon server來接收請求。
若是TLS可使用,啓動配置文件在falcon prism和Falcon Server須要配置* keystore.file * keystore.password
Falcon——Prism圖解
安全模式
安全模式是爲了防止Falcon用戶對工做流引擎中的調度實體進行操做,這在下面兩種狀況中起做用:
Hadoop集羣更新
Falcon集羣的實體被更新
在安全模式下,用戶只能進行限制的操做,其中包括:
用戶能夠對通過受權的實體對象進行讀操做
管理員用戶能夠對集羣中的實體進行更新操做
若是用戶想去suspend特定的工做,獨立的實例能夠被Suspend/Kill
可調度的實體能夠被suspend,這是由於用戶可能想去掛起實體操做在處理工做流與版本不兼容的問題中。
其中被禁止的動做包括:
(1)全部實體的 submit, submitAndSchedule操做
(2)實體的操做: update, schedule, touch, delete, submit, submitAndSchedule, resume
(3)實例化的操做不被容許: rerun, resume
Getting into/out-of Safemode.
用戶可使用以下命令進入或者退出安全模式:
falcon-start -setsafemode
## CLI
<falcon-server>/bin/falcon admin [-setsafemode <true/false>]
## RestAPI
GET http://falcon-server:15000/api/admin/setSafeMode/true
OR
GET http://falcon-server:15000/api/admin/setSafeMode/false
1
2
3
4
5
6
7
NOTE
用戶能夠發現是否Falcon Server處與安全模式by calling the Admin Version API,一旦Server被設置成安全模式,他的狀態會一直處於安全模式,若是用戶想退出安全模式必須進行明確的設置。
配置存儲
配置存儲文件系統Falcon能夠將定義的實體存儲在其中,這個文件系統能夠是本地文件系統或者HDFS,建議將配置文件存儲在和Falcon部署的不一樣的機器上。這能夠避免在Falcon部署的系統出現硬盤損壞或者永久性失效等問題,配置存儲也對先前的配置版本或者被刪除的配置提供歸檔操做,這些文件講永遠不能被Falcon server訪問和他們僅僅提供追蹤實體配置的歷史變化。
原子操做
當Falcon執行實體操做時,當須要作許多操做時,若是一個操做失敗了,可能形成不統一的狀態。爲避免這一狀況的發生,全部的我的操做都被記錄在事務日誌裏面,這個日誌用來回滾總體的用戶操做。某些狀況下,撤銷操做是不成功的,在這些狀況下,Falcon嘗試盡力去保持系統的一致性。
存儲
Falcon introduces a new abstraction to encapsulate the storage for a given feed which can either be expressed as a path on the file system, 文件系統存儲或者在Hcatalog的表,such as Hive, Catalog Storage.
<xs:choice minOccurs="1" maxOccurs="1">
<xs:element type="locations" name="locations"/>
<xs:element type="catalog-table" name="table"/>
</xs:choice>
1
2
3
4
任何一個Feed都應該包含其中的一個
File System Storage(文件系統存儲)
這表示爲文件系統上的一個存儲路徑,這個路徑指定了Feed在這個集羣上的哪一個地方具備有效性,一個路徑的標籤包含:data, meta, stats 以及他們相應的路徑,一個Feed至少包含data路徑標籤,這個標籤指定了feed週期性產生數據的HDFS的路徑,例如: ex: type=」data」 path=」/projects/TrafficHourly/YEAR−YEAR−{MONTH}-${DAY}/traffic」 The granularity of date pattern in the path should be at least that of a frequency of a feed.
<location type="data" path="/projects/falcon/clicks" />
<location type="stats" path="/projects/falcon/clicksStats" />
<location type="meta" path="/projects/falcon/clicksMetaData" /
1
2
3
Catalog Storage (Table)表
一個表的標籤指定了在catalog中註冊的表的URI:
catalog:$database-name:$table-name#partition-key=partition-value);partition-key=partition-value);*
1
這是一個URI的模板,它並無對 Hive or HCatalog任何的參考,它對於全部實現catalog registry都可以適用,The catalog implementation specified in the startup config provides implementation for the catalog URI. 高級分區必須是一個日期的模式,在日期模式的設置必須和feed的頻率設置一致。
例如:
<table uri="catalog:default:clicks#ds=${YEAR}-${MONTH}-${DAY}-${HOUR};region=${region}" />
<table uri="catalog:src_demo_db:customer_raw#ds=${YEAR}-${MONTH}-${DAY}-${HOUR}" />
<table uri="catalog:tgt_demo_db:customer_bcp#ds=${YEAR}-${MONTH}-${DAY}-${HOUR}" />
1
2
3
Falcon配置
Falcon配置詳見Falcon配置專題
實體管理操做
全部的操做均可以使用Falcon’s RESTful API來完成
Submit
實體Submit操做容許用戶將新的cluster/feed/process提交到falcon,被Submit的實體並無被調度,只是爲falcon服務提供簡單的配置信息,除了對驗證添加的實體自己進行驗證以外,也會對配置文件中的相應的配置進行驗證和驗證這個實體所依賴的實體。
List
列出falcon 配置倉庫下全部的特定的類型的實體,包括被調度和被提交的實體配置。
Dependency
列出所指定的實體的所依賴的實體。這個會顯示出這個實體被當作依賴的部分和被依賴的部分兩部分進行顯示。
Schedule
對於已經提交的Feed/Process能夠被調度,對於被調度的實體,Falcon將把這些重複性的行爲做爲Oozie的協調器和利用Oozie 調度器去執行他們(它也能夠是除了Oozie之外的調度器),Falcon對feed/process工做流產生另外的ID,這個額外的IP能夠被用來對實例的管理。
這個調度將用戶的指定的工做流和庫複製到一個臨時的路徑,而調度器引用工做流和庫在這個臨時路徑。
Suspend
這個動做只對已經提交的實體有用,這個觸發器可已將早起進行調度的實體進行執行,在掛起裝態下的Feed/Process沒有被執行。
Resume
將一個掛起的feed/process實體從新返回的執行狀態。
Status
返回當前的實體的狀態
Definition
獲得已經被提交的實體的定義. Please note that user documentations in the entity will not be retained.
Delete
delate操做將刪除全部在調度期的工做流,而且將提交的實體從falcon中刪除,只有當這個實體沒有被依賴的時候,這個實體纔會被刪除。
Update
Update操做容許對早已經提交或者調度的實體進行更新操做,更新Feed可能致使全部串聯的Process進行更新,Process update triggers update in falcon if entity is scheduled.
Cluster update will require user to update dependent Feed and Process entities that are already scheduled. 集羣更新須要在falcon安全模式下進行. We provide a CLI command for the user to update the scheduled dependent entities after cluster update and exiting safemode.
下列的動做將被視爲更新:
更新舊的被調度的實體設置結束時間爲「now」
調度每個開始時間爲「now」的process/feed
Falcon提供了週期性的將源數據從外部數據庫(數據庫,drop boxes etc)導入到Hadoop上以及將講過Hadoop運算的數據導出到外部的數據庫。
在至今全部的版本中,Falcon僅僅支持關係型數據庫(Mysql,Oracle等)講過JDBC做爲外部的數據源。未來的版本可能增長支持其餘類型的數據庫。
要將數據導入和數據導出須要知足如下的條件:
- Sqoop 1.4.6+
- Oozie 4.2.0+
- 合適的數據庫鏈接器
Note
Falcon經過Sqoop進行數據導入和數據導出操做,Sqoop將須要合適的數據庫驅動來鏈接相應的數據庫。必須確保數據庫的jar包被複制到Oozie中的Sqoop的share lib中:
For example, in order to import and export with MySQL, please make sure the latest MySQL connector *mysql-connector-java-5.1.31.jar+* is copied into oozie's Sqoop share lib /user/oozie/share/lib/{lib-dir}/sqoop/mysql-connector-java-5.1.31.jar+ where {lib-dir} value varies in oozie deployments.
實體定義和設置
數據源實體實現了數據庫鏈接和數據庫憑據驗證的高度抽象。數據源實體支持了數據庫特定憑據驗證的讀和寫的接口,若是讀和寫的接口不能使用使用的話,它會調用默認的憑據進行驗證。一般狀況下,數據源實體將被系統管理員定義。
接下來的例子定義了一個Mysql的數據源的實體,這個導入操做將使用Mysql的讀接口(URI:jdbc:mysql://dbhost/test)用戶名:import_usr,密碼:sqoop。導出操做將使用帶有(URI:jdbc:mysql://dbhost/test)的寫接口採用用戶名:export_usr和密碼指定在HDFS的 「/user/ambari-qa/password-store/password_write_user」.這個文件中。
當讀接口和寫接口的憑據不能使用時,將使用默認的憑據The default credential specifies the password using password alias feature available via hadoop credential functionality. 用戶能夠建立一個祕鑰使用以下命令:
hadoop credential -create <alias> -provider <provider-path>
where is a string and is a HDFS jceks file,在運行期間 ,the specified alias will be used to look up the password stored encrypted in the jceks hdfs file specified under the providerPath element.
讀和寫的接口可使管理員分開讀和寫的工做量:
File: mysql-database.xml
<?xml version="1.0" encoding="UTF-8"?> <datasource colo="west-coast" description="MySQL database on west coast" type="mysql" name="mysql-db" xmlns="uri:falcon:datasource:0.1"> <tags>owner=foobar@ambari.apache.org, consumer=phoe@ambari.apache.org</tags> <interfaces> <!-- ***** read interface ***** --> <interface type="readonly" endpoint="jdbc:mysql://dbhost/test"> <credential type="password-text"> <userName>import_usr</userName> <passwordText>sqoop</passwordFile> </credential> </interface> <!-- ***** write interface ***** --> <interface type="write" endpoint="jdbc:mysql://dbhost/test"> <credential type="password-file"> <userName>export_usr</userName> <passwordFile>/user/ambari-qa/password-store/password_write_user</passwordFile> </credential> </interface> <!-- *** default credential *** --> <credential type="password-alias"> <userName>sqoop2_user</userName> <passwordAlias> <alias>sqoop.password.alias</alias> <providerPath>hdfs://namenode:8020/user/ambari-qa/sqoop_password.jceks</providerPath> </passwordAlias> </credential> </interfaces> <driver> <clazz>com.mysql.jdbc.Driver</clazz> <jar>/user/oozie/share/lib/lib_20150721010816/sqoop/mysql-connector-java-5.1.31</jar> </driver> </datasource>
Feed實體可使用戶在指定去保持數據生命週期和複製數據的同時定義數據導入和數據導出的策略,導入和導出策略將引用已經定義的數據庫實體去鏈接和指定特定的數據表。接下來的例子定義了一個具備導入和導出策略的feed實體,導入和導出都將引用「mysql-db」實體,導入操做將使用讀接口和導出操做將使用寫接口,一個Feed實例將每個小時被建立一次和因爲保留策略的設置這個feed策略將被刪除在90天以後。
File: customer_email_feed.xml
<?xml version="1.0" encoding="UTF-8"?> <!-- A feed representing Hourly customer email data retained for 90 days --> <feed description="Raw customer email feed" name="customer_feed" xmlns="uri:falcon:feed:0.1"> <tags>externalSystem=USWestEmailServers,classification=secure</tags> <groups>DataImportPipeline</groups> <frequency>hours(1)</frequency> <late-arrival cut-off="hours(4)"/> <clusters> <cluster name="primaryCluster" type="source"> <validity start="2015-12-15T00:00Z" end="2016-03-31T00:00Z"/> <retention limit="days(90)" action="delete"/> <import> <source name="mysql-db" tableName="simple"> <extract type="full"> <mergepolicy>snapshot</mergepolicy> </extract> <fields> <includes> <field>id</field> <field>name</field> </includes> </fields> </source> <arguments> <argument name="--split-by" value="id"/> <argument name="--num-mappers" value="2"/> </arguments> </import> <export> <target name="mysql-db" tableName="simple_export"> <load type="insert"/> <fields> <includes> <field>id</field> <field>name</field> </includes> </fields> </target> <arguments> <argument name="--update-key" value="id"/> </arguments> </export> </cluster> </clusters> <locations> <location type="data" path="/user/ambari-qa/falcon/demo/primary/importfeed/${YEAR}-${MONTH}-${DAY}-${HOUR}-${MINUTE}"/> <location type="stats" path="/none"/> <location type="meta" path="/none"/> </locations> <ACL owner="ambari-qa" group="users" permission="0755"/> <schema location="/none" provider="none"/> </feed>
導入策略將使用datasource實體指定特定鏈接特定的數據源,表名應該在存在引用的數據庫中,導入過程能夠指定導入特定的字段而且能夠指定是每次都是所有一次性倒入或者增量導入,
The merge policy specifies how to organize (snapshot or append, i.e time series partiitons) the data on hadoop.有效的組合是:
[full,snapshot] :數據每次被所有抽取而且被保存在Feed指定的位置。
[incremental, append] :data is extracted incrementally using the key specified in the deltacolumn and added as a partition to the feed instance location.
接下來的例子定義了[incremental, append]的策略:
<import> <source name="mysql-db" tableName="simple"> <extract type="incremental"> <deltacolumn>modified_time</deltacolumn> <mergepolicy>append</mergepolicy> </extract> <fields> <includes> <field>id</field> <field>name</field> </includes> </fields> </source> <arguments> <argument name="--split-by" value="id"/> <argument name="--num-mappers" value="2"/> </arguments> </import>
Filed標籤將必定哪個列將被導入,默認狀況下,全部的列將被導入,Includes標籤訂義了其中須要導入的列的字段,Excludes正好與Includes相反,
arguments標籤將能夠調用在Sqoop中任何額外的參數。
導出策略和導入策略同理,使用Datasource去鏈接數據庫,加載特定列的數據對數據表進行插入或者更新數據,Fields操做的選項和Import具備一樣的策略。表名應該存在於數據庫中。
操做步驟:
## submit the mysql-db datasource defined in the file mysql_datasource.xml falcon entity -submit -type datasource -file mysql_datasource.xml ## submit the customer_feed specified in the customer_email_feed.xml falcon entity -submit -type feed -file customer_email_feed.xml ## schedule the customer_feed falcon entity -schedule -type feed -name customer_feed
Hadoop數據生命週期管理框架Apache Falcon簡介
Apache Falcon是一個開源的hadoop數據生命週期管理框架, 它提供了數據源 (Feed) 的管理服務,如生命週期管理,備份,存檔到雲等,經過Web UI能夠很容易地配置這些預約義的策略, 可以大大簡化hadoop集羣的數據流管理.
本文主要介紹了Falcon的基本特性, 核心概念以及架構, 最後討論了它的優勢和侷限.
Hortonworks的hadoop發行版HDP中,數據治理包括Falcon和Atlas這兩個組件.Atlas主要負責元數據的管理. Falcon主要負責數據生命週期的管理.
Falcon最初由移動廣告公司Inmobi開發,2012年開始在Inmobi內部投入使用,2013年成爲Apache孵化項目,2015年孵化畢業成爲Apache頂級項目,目前最新的版本是0.10.
Falcon的使用者能夠經過命令行或者Falcon Web UI來建立數據流水線,數據流水線由集羣存儲位置定義,數據源和處理邏輯組成,這三部分分別爲由xml文件定義的實體.
falcon中定義的三種實體包括:
Falcon pipeline
每一個實體是單獨定義的,把實體組合起來就造成了數據流水線,Falcon提供了不少預約義的策略來處理數據拷貝,數據保留時間和存檔.
Falcon把用戶定義的feed和process
翻譯成調度器的做業配置文件,這些做業流由調度器管理,falcon實際上只維護實體之間的依賴關係,因此它是個輕量級的工具.Falcon實體的配置文件(xml文件)能夠存在本地或者hdfs上.
Falcon架構
Falcon目前默認使用oozie做爲調度器, 因爲oozie調度器的一些限制,falcon正在開發本身的調度器,預計將在之後的版本中正式發佈.
Falcon經過JMS (Java消息服務) 與oozie進行通訊,控制oozie上對應的做業流,oozie也經過JMS給falcon報告做業運行狀況.
總結來講, Falcon是在調度器Oozie上封裝了一層,用戶能夠用Web UI上的wizard來配置數據流水線, 數據生命週期管理很是方便. 它最大的優勢就是加強了Oozie的易用性, 對於業務邏輯比較複雜的系統, 用Falcon管理比起直接用Oozie會大大簡化.
可是調研中發現, Falcon Web UI上呈現的血緣關係只是以實體爲中心, 並無全局層面上整個data pipeline的血緣關係. 若是可以以pipeline爲中心, 畫出血緣關係圖,提供zoom in功能, 以及在圖中把實體運行狀態可視化, 將會是一個頗有用的特性.
雖然被稱爲數據治理工具,可是它的功能只是集中在數據生命週期管理和流水線管理,要與元數據管理(Atlas),數據安全管理(Ranger)等組合,才能造成一個完整的數據治理解決方案.
調研發現, Falcon的關注度並不算高,能搜到的英文資料主要是Apache和Hortonworks官網,中文資料幾乎沒有. 目前也沒有看到哪一個大公司在生產環境中用Falcon,我認爲主要是由於Falcon提供的功能單一, 只解決了數據治理領域的一小部分需求,用戶更願意使用集中化的數據治理工具,或者本身開發.
若是安裝了HDP,則可使用Ambari上的Wizard來安裝Falcon,很是簡單,使用默認配置便可. 若是想單獨安裝Falcon, 能夠參考Apache Falcon官網的文檔,下載源碼,編譯並安裝Falcon. 連接爲:
http://falcon.apache.org/InstallationSteps.html
能夠經過Web UI, CLI和Rest API三種方式使用Falcon.
配置一個簡單的HDFS鏡像的Process, 具體步驟參考http://saptak.in/writing/2015/08/11/mirroring-datasets-hadoop-clusters-apache-falcon
配置一個簡單的處理E-mail的數據流,包含兩個Feed和兩個Process. 具體步驟參考http://saptak.in/writing/2015/08/13/processing-data-pipeline-with-apache-falcon
https://zh.hortonworks.com/apache/falcon/#section_1
http://falcon.apache.org/
http://wenku.it168.com/d_001179518.shtml
https://baike.so.com/doc/26957806-28326669.html