您正在使用IE低版浏览器,为了您的FUTUREAI账号安全和更好的产品体验,强烈建议使用更快更安全的浏览器
FUTUREAI 业界
发私信给FUTUREAI
发送

基于XML形貌的可编程函数式ETL真现

本文作者:FUTUREAI 2019-07-02 16:00
导语:转载本文需说明出处:微疑公家号EAWorld,背者必究。 弁言: 传统 ETL 次要以 SQL 为次要手艺手腕,把数据经抽与、浑洗转换以后减载到数据堆栈。可是正在现在挪动互联网鼎力开展的场

转载本文需说明出处:微疑公家号EAWorld,背者必究。

弁言:

传统 ETL 次要以 SQL 为次要手艺手腕,把数据经抽与、浑洗转换以后减载到数据堆栈。可是正在现在挪动互联网鼎力开展的场景下,发生年夜量碎片化战没有划定规矩的数据。当局,公安等止业,传统数据库曾经近近没法满意需供。数据本初文件经由过程文件导进到根底库,再经由过程年夜数据 HQL等手艺手腕提与出两级库,那中心的数据导进战 SQL ETL 的提与的历程,年夜量耗损 IO 机能战计较资本,正在许多场景下曾经是数据处置的瓶颈地点。

普元正在施行公安项烦闷 沉迷历程中开辟了一种基于 XML 形貌的可编程的函数 ETL 转换办法。次要用于年夜数据文件处置范畴,能从本初数据文件间接、快速减载到专题库的手艺手腕。手艺计划次要处理了用 XML 的手艺手腕形貌数据文件的格局,包罗文件字段切分、字段范例、默许值、非常值校验、工夫格局校验。正在处置时可增加自止开辟的 JAVA UDF 函数,函数真参撑持变量、常量、表达式、函数战运算符重载。同时函数撑持多层嵌套,即内部函数的返回值最为内部函数的真参。该计划真现了 XML 内函数体的语法剖析并正在运转历程中间接编译为 Java 字节码的手艺。有用的处理了当局、公安、电疑止业巨量的数据处置需求的年夜量计较资本战 IO 机能瓶颈,有用的进步了数据处置服从战低落了数据处置开辟易度。

烦闷 沉迷录:

1、基于 XML 掌握文件剖析数据文件计划引见

2、XML 掌握文件构造战语法

3、函数战多层嵌套函数传参

4、UDF 函数编写办法

5、数据测试东西

6、FlumeOnYarn 架构战散布式摆设

1、基于 XML 掌握文件剖析数据文件计划引见

关于数据开辟项烦闷 沉迷,我们经常会晤临寡多的数据对接,部门场景不只数据量年夜,且数据品种多,数据剖析开辟事情量宏大。关于年夜量数据对接,普通设想的 RPC 接心战 WebService 普通皆达没有到数据机能请求的。而且他们皆是面对面的办事,一旦高低游体系毛病,城市形成全部数据对接非常。因而年夜部门城市挑选利用文件的方法停止数据对接。

关于非及时数据对接需供,那种方法的长处:

正在数据量年夜的状况下,能够经由过程文件传输,上游只写进,无需体贴数据营业战毛病;

计划简朴,制止了收集和谈相干的观点;

保护简朴,只需包管磁盘写进不变性便可;

我们经常会晤临基于此架构的数据对接。但基于此架构数据处置事情皆鄙人游(即数据利用圆)。

面临年夜量数据对接战寡多的数据范例,我们关于每种数据文件剖析、解码、浑洗耗损年夜量的人力,而且基于编码的方法关于较大都据范例的场景代码量年夜,且易以办理。因而颠末屡次数据开辟理论,我们开辟了一种基于 XML 形貌的方法去剖析战浑洗数据文件的真现。

本架构真现合适以下几个圆里:

基于文件的数据对接;

文件没法间接导进到烦闷 沉迷标数据库,需求做转换,浑洗为烦闷 沉迷标格局;

如上数据对接架构图,Flume 根本真现了基于文件体系的主动扫描战读与,因而架构真现了基于 Flume Sink 的模块。本架构也可做为SDK 做为框架散成到现无数据处置计划中。

2、XML数据掌握文件构造战语法

<?xml version="1.0" encoding="UTF-8"?><schema><key>JD_TYPE_V1</key><type>textfile</type><delimiter>,</delimiter><fields><field type="int">exp_flag</field>    <field type="string">sender_id</field>        <field type="string">sender_num</field>  <field type="string" value="unknown">sender_address</field>  <field type="string">receiver_num</field>  <field type="date" pattern="yyyy-MM-dd HH:mm:ss">expect_time</field>  <field type="string" default="true" value="location(receiver_num)">receiver_num_origin</field>    <field type="string" default="true" value="yn(none(sender_num))">is_sender_num_null</field>    <field type="string" default="true" value="concat(caller_number, '-', called_number)">number_connect</field>    <field type="string" default="true" value="yn(all_true(none(sender_num), none(receiver_num)))">all_num_null</field>  <field type="string" default="true" value="province_code(sender_province)">sender_province_code</field>  </fields></schema>

(可摆布滑动检察局部代码)

如上 XML 形貌了一种数据文件范例及该范例的切分办法,数据每止颠末切分后,发生的多个数据列的转换办法。

实际上,每种数据范例该当对应一个掌握文件,意味着掌握文件去形貌该种数据范例怎样剖析战转换。

Key 次要标注该掌握文件处置的范例ID;

Delimiter 为文件列切割字符;

Fields 中包罗每列的字段形貌;

数据范例撑持Java根本范例战date范例;

Skip为数据对齐语法,掌握正在列中疏忽某列的值;

Default = true 属性为数据对齐语法,给某列供给默许值,供给默许值的列正在数据列中没有挪动位移;

Value 供给了给该字段供给当列中无值时供给默许值;value=null则指定列值为null;

Date 范例需 pattern 属性;

3、函数战多层嵌套函数传参

默许值

词法阐发时字段field 的value 属性值出有以英文小括号闭开的真体。以下示例中的primeton:

<field type="string" default="true" value="primeton">data_vendor</field>

(可摆布滑动检察局部代码)

函数

函数是由一组字符串、数字、下划线构成的开法函数名战0 到多个情势参数构成。正在词法阐发时字段field 的 value 属性值由英文小括号闭开的真体。以下示例中的:

location(),yn(),concat();<field type="string" default="true" value=" unix_timestamp ">curr_time</field><field type="string" default="true" value="location(receiver_num)">receiver_num_origin</field>    <field type="string" default="true" value="yn(none(sender_num))">is_sender_num_null</field>    <field type="string" default="true" value="concat(caller_number, '-', called_number)">number_connect</field>

(可摆布滑动检察局部代码)

函数名

函数体小括号前里的部门。普通由字符串、数字、下划线构成的一组特定的称号。如location(receiver_tel),location 即为该函数的函数称号。

函数的情势参数:

1.无参数

词法阐发时value的值满意函数前提且函数体内无参数。以下示例中:unix_timestamp() 得到当前体系内的 Unix 工夫戳;

<field type="string" default="true" value=" unix_timestamp()">curr_time</field>

(可摆布滑动检察局部代码)

2.常量型形参

词法阐发时函数体内以英文单引号援用的值为函数体的常量型形参。如’100’,函数示例为:random_int(‘100’),死成 0-100 之内的随机整形数值;

<field type="string" default="true" value="random_int(‘100’)">rand_num</field>

(可摆布滑动检察局部代码)

3.变量型形参

词法阐发时函数体内参数出有英文单引号援用而且没有以英文小括号闭开的为函数体的变量型形参。以下示例中的receiver_tel;

<field type="string" default="true" value="location(receiver_tel)">r_num_loc</field>

(可摆布滑动检察局部代码)

4.函数型形参

词法阐发时函数体内出有英文单引号而且以英文小括号闭开的参数范例参数为函数体的函数型参数。以下示例中的:none(sender_num)战none(receiver_num);

<field type="string" default="true" value="yn(all_true(none(sender_num), none(receiver_num)))">all_num_null</field>

(可摆布滑动检察局部代码)

词法阐发得到到函数体的同时,利用函数名挪用UdfRegistors.getUdf(udfName) 函数,以查验当前体系需要 存正在该函数,不然则扔出没法辨认的函数非常。

5.范例校验

词法阐发阶段得到了字段 field 的与值是默许值大概函数,下一步需校验其默许值或函数的返回值能否能战界说的字段范例相婚配。假如是函数同时校验函数的形参战真参范例能否相婚配。

<field type="string" default="true" value="primeton">data_vendor</field><field type="int"    default="true" value="2">call_flag</field>

(可摆布滑动检察局部代码)

如上示例中的primeton 需能转换为 string 范例,call_flag 需能转换为 int 范例。假如范例不克不及转换,则会扔出范例没法转换非常。关于函数,经由过程 returnType 返回范例战字段范例停止校验,可婚配大概是该范例的子范例则范例考证经由过程。

4、UDF 函数编写办法

编写一个UDF函数的步调:

担当 UDF 类,真现 eval 办法;

Eval 办法传进的是一个数组参数;

判定参数少度能否战预期的分歧;

判定地位参数范例能否战预期的分歧;

真现函数体;

返回eval函数施行的返回值,实际上该返回值的范例该当分歧,不该 该统一函数返回多品种型值;

函数编写者该当包管函数体内是线程平安 的;

UDF 真现以下:

public abstract class UDF {   /**   * 能否撑持该组参数范例,没有撑持扔出UnsupportedTypeException非常。默许返回 true   */   public void support(Class<?>... paramsClass)throws UnsupportedTypeException;   /*** 该 UDF 返回值范例,用于校验嵌套函数范例能否婚配。可返回简朴范例,map,array,record 等范例.默许返回 String 范例*/   public Class<?> returnType();/*** UDF 施行函数,当输进没有契合预期时,背中扔出非常* @param params 函数的输进真参* @return 函数输出成果,简朴范例大概庞大范例,撑持简朴范例,map,array,record 范例*/public abstract Object eval(Object... params);}

(可摆布滑动检察局部代码)

一个判定能否包罗子串的UDF 写法:

一切的UDF皆经由过程一个中心注册类(那面相似 Hive 的FunctionRegistry)

public final class UdfRegistors {   /**    * UDF 函数映照    */static final Map<String, UDF> UDF_CACHED = new HashMap<String, UDF>();    static {UDF_CACHED.put("copy", new CopyUDF());  // 复造一个变量的值      UDF_CACHED.put("eq", new EqUDF()); // 判定两个变量能否相称      UDF_CACHED.put("yn", new YnUDF()); // 按照输进true,false 转换为 Y、NUDF_CACHED.put("null", new NullUDF()); // 判定变量能否为null// add udf methodUDF_CACHED.put("location", new LocationUDF());     // 得到脚机号码的回属天   UDF_CACHED.put("nation_code", new NationCodeUDF()); // 按照国度称号获得国度代码    UDF_CACHED.put("province_code", new ProvinceCodeUDF()); //按照省称号获得省代码    UDF_CACHED.put("city_code", new CityCodeUDF());    // 按照都会称号获得都会代码    UDF_CACHED.put("phone_num", new PhoneNumUDF());  // 校验能否是脚机号大概固话UDF_CACHED.put("number_format", new NumberFormatUDF()); //校验能否能够转化成数字}/*** 增加一个UDF函数     * @param key UDF 函数     * @param value UDF 函数 eval 应线程平安    * @return     */    public static boolean addUdf(String key, UDF value) {        return UDF_CACHED.put(Optional.of(key).map((it)->it.toLowerCase()).get(), value) != null;    }    /**     * 得到内置的 udf 函数     */    public static UDF getUdf(String udfName) {        return UDF_CACHED.get(udfName.toLowerCase());    }}

(可摆布滑动检察局部代码)

UDF 函数注册期间:

可正在编译期绑定内置的 UDF 函数;

可正在体系启动时设置自减载的 UDF 函数;

可正在运转期静态注进UDF 函数;

5、数据测试东西

数据对接历程,面临数据能否能转换为烦闷 沉迷标成果经常无从所知。基于XML 掌握文件的数据剖析,可真现一个测试东西。该东西经由过程上传数据文件战上传 XML 掌握文件,可对数据文件随机的读与止停止婚配测试,只需数据列战烦闷 沉迷标 XML文件能经由过程列婚配测试,则数据可经由过程 ETL 剖析浑洗。不然持续修正 XML 掌握文件,曲到逆利经由过程婚配。

6、FlumeOnYarn 架构战散布式摆设

本架构合适以文件做为数据对接的计划,另外一圆里,经由过程扩大 Flume 便可真现拿去主义。Flume 内部真现对 Channel 的 Transaction,关于每一个以文件机关的 Event 工具是本子操纵,要末局部胜利,要末失利。flume依靠事件去包管event的牢靠性。Flume 默许出有散布式真现,因而开辟了 FlumeOnYarn 的架构,用于撑持 Flume 的散布式摆设。

FlumeOnYarn劣势:

无需每一个节面装置 Flume,可一键启动战截至;

设置文件正在客户端节面修正,主动复造到 Yarn 上各真例,无需每一个节面修正;

基于 CDH或HDP的刊行版,即便真现了 Web 可视化化的设置战散布式摆设,可是关于 Flume 只能真现单设置文件真例,没法真现多设置真例;

散群的范围能够按照数据量巨细停止及时的调解(删加节面),真现弹性处置。经由过程号令大概 api 便可掌握(CDH 等需求正在页里增加 host,烦琐且不容易静态调解);

多个租户大概统一租户多个处置真例互没有影响,且能断绝(Yarn Container);

FlumeOnYarn 架构

上图所示,提交FlumeOnYarn 需求客户端,该客户端出有太多战Flume装置包构造特别的处所,只是正在 lib 下增加了 flume-yarn 的架构撑持战 bin 下 flume-on-yarn 的启动剧本。

Flume OnYarn 客户端法式

经由过程 bin/flume-on-yarn 便可提交 FlumeOnYarn Application 散群。以下的号令便可一次性申请多个 Yarn 资本节面,真现一键摆设:

bin/flume-on-yarn yarn -s --name agent_name –conf  conf/flume-hdfs.conf  --num-instances 5

(可摆布滑动检察局部代码)

总结

保举浏览

元数据新型存储架构的探究

基于 Spark 的数据阐发理论

当地 读写的多活数据存储架构设想要义

闭于做者:震秦,普元资深开辟工程师,专注于年夜数据开辟 8 年,善于 Hadoop 死态内各东西的利用战劣化。介入 某公闭告白(上市)公司DMP 建立,卖力数据分层设想战批处置,调理真现,完成托付利用;介入 海内多省市公安交际收集项烦闷 沉迷摆设,卖力说明 阐述开辟(Spark 阐发使用);介入 数据浑洗减工为我圆主题库并摆设上层使用。

闭于EAWorld:微办事,DevOps,数据管理,挪动架构本创手艺分享。存眷微疑公家号EAWorld!


本文由进驻维科号的做者撰写,不雅面仅代表做者自己,没有代表景智AI坐场。若有侵权或其他成绩,请联络告发。

声明:景智AI网尊重行业规范,任何转载稿件皆标注作者和来源;景智AI网的原创文章,请转载时务必注明文章作者和"来源:景智AI网", 不尊重原创的行为将受到景智AI网的追责;转载稿件或作者投稿可能会经编辑修改或者补充,有异议可投诉至:mailto:813501038@qq.com

分享:
相关文章
最新文章