大数据开发规范

大数据平台开发管理规范

1    系统架构介绍与描述

1.1    系统介绍

1、Lxx1-xx1大数据基础数据平台:xx1是公共基础数据层。主要是用于从各关系型数据库或其它子公司抽取数据,并提供给所有团队使用的基础数据平台;

2、Lxx1-xx3大数据对外公共数据平台:xx3是数据对外公共层,主要是用于对外部公司供数的,是数据对外传递的唯一途径;

3、Lxx1-xx2大数据对内公共同步平台:xx2是对内公共导数层,主要是用于从大数据库导数到关系型数据库上。数据对内导出必须走xx2子系统;

Note:xx2子系统是虚拟子系统没有统一的队列和存储,走版本时是需要使用各集市库的队列资源。

4、DM数据集市:DM是各业务团队的集市库,主要是用于依据业务的不同进行业务数据分析。如数据采集,数据挖掘等;所有DM集市库是由各业务小组自己管理,总体使用原则必须依据《大数据基本法》以及本文档的开发规范。

Note:公共子系统是以“谁用谁负责”原则,此两个系统的脚本开发、测试、验证由各个使用方负责;其中大数据应用团队负责版本的分布,迭代,上线以及相应的技术开发指导工作。

 

1.2    系统描述

1.    源数据系统接入大数据的唯一入口是从xx1(hduserXXXX)接入,脚本开发由使用方开发和测试,大数据应用团队负责规范宣导和检查审核;

2.    数据对外(外部公司)唯一出口从xx3(hduserXXXX)输出,所有对外输出数据,必须经过业务属主、安全、数据治理小组审核,完成签报后才可输出;脚本开发由使用方开发和测试,大数据应用团队负责规范宣导和检查审核;

3.    数据对内(hive到数据库)唯一导出入口从xx2接入,所有对内导出到关系型数据库必须走xx2版本,脚本开发测试和部署版本都由使用方负责,必须参照规范进行开发;

4.    xx1到xx3,脚本开发由使用方开发和测试,大数据应用团队负责规范宣导和检查审核,走xx3版本部署(xx3或xx1版本);

5.    xx1到DM集市库(各部门申请的业务hive库),首先申请业务库到xx1库的访问权限,然后脚本开发测试和部署版本,这些都由使用方负责,需按规范开发。

2    版本计划

大数据团队定期发布Lxx1-xx1、Lxx1-xx3、DM集市库版本计划,各个关联方可从各部门接口人处获取版本计划。

Lxx1-xx2子系统是根据各部门自己内部版本计划发布版本。

2.1    xx1、xx3、DM版本规划

每年的版本规划都是统一由系规规划好发给各部门,规划原则一般是双周版本,月初与月底不允许发布版本,重大节假日等日期会相应调整发布时间



2.2    xx2版本规划

由于Lxx1-xx2是虚拟子系统,没有固定的存储资源及计算资源,都是使用各团队自己的资源,所以各团队自己定版本与发布。

3    Lxx1-xx1开发规范

xx1开发规范主要是规范用户队列使用、表命名创建、任务命名规范等。

3.1    用户队列规范

虚拟用户:hduserXXXX

父队列:queue_XX02

子队列:queue_XX02.XXXX_01

3.2    创建表规范

xx1表的规范主要是要求规范化创建表,其主要包括有增量,基础表,初始化表,维表四种。注意xx1创建表都不能以“_mask”结尾(脱敏表除外),这些都是专门用于脱敏表的特殊标识。

3.2.1    表命名规范

1、增量表用于同步关系型数据库的增量数据。

规范:idld(w/m)_"oracle sid"_源表名,如: idld_XXX_XXX_XXX

IDLD: Interface data layer data



2、基础表主要是用于存储全量数据, 其数据与关系型数据基本保持一致。

规范:bas_"oracle sid"_源表名,如:bas_lbs_pol_info

Bas: basic



3、初始化表主要是用于将基础表的数据进行初始化。

规范:bas_"oracle sid"_源表名_init,如:bas_lbs_pol_info_init

Init: initial

注意:

初始化表只是用于将bas表进行初始化的作用



4、维度表主要是用于同步字典表。维度信息也可以根据对应数据表中的字段名称进行命名。

规范:dim_维度信息_tbl,如:dim_region_code

DIM: dimension

3.2.2    字段规范

1、    所有xx1表必须要与关系型数据库字段保持一致,机构库的表可以扩展增加机构字段当分区字段;

2、    所有xx1表必须要有表注释及字段注释;

3、    字段名带#号的,请去掉#

4、    数据库数据类型转为Hive数据类型规范

A: 在Oracle数据库中,有很多数据类型,用得最多的分别为字符,日期,数字,在Hive中,一般按照如下规则转换:

字符类型 所有字符类型都转为String

日期类型 也转为String

数字类型 可以转为DECIMAL,如DECIMAL(12,2)

B:很大的数字类型, 如超过20位的数字,没有金额含义的,只做序列等使用的,在Oracle中定义为NUMBER,则hive中一般转为String, 这是因为当数字很大时,在导入导出的时候,会超过Java数字类型限制,比如:最典型的例子是很多机构表的pk_serial#字段,定义为number,但是在Hive不能定义为DECIMAL,而是定义为string。

Rowid类型 需要使用rowidtochar(rowid)进行导入,然后转换为String类型

3.2.3    创建表文件存储格式规范

1、    所有直接从关系型数据导数的表必须使用TEXTFILE,如果不是的话就会导致任务报错。如从oracle使用sqoop导入到idld表,那我们创建表就必须使用TEXTFILE。

如:ROW FORMAT DELIMITED FIELDS TERMINATED BY '\001' STORED AS TEXTFILE;

2、    所有从hive库表中抽取数据到hive上都必须使用压缩文件格ORCFILE或者其它压缩格式,尽量保证数据得到压缩。如:从idld表抽取数据到bas表,那我们创建表就必须使用压缩文件格式。

如:ROW FORMAT DELIMITED FIELDS TERMINATED BY '\001' STORED AS ORCFILE

3.2.4    分区规范

1、    所有分区必须以字母开头,不能以数字或其它特殊字符开头。

2、    分区表的分区 不能包含“空格”“冒号”“百分号”等特殊字符。

3、    分区表的分区不能超过三个分区字段。

3.3    创建表脚本规范

1、    创建表脚本命名必须需带上开发人员“故事号_序号”_CREATE/ALTER/账号并以hql结尾。

如:“故事号_序号”_create/alter/drop_XXXXXXX.hql

2、    创建表脚本格式必须是UTF-8无BOM格式编码

3、    创建表脚本在语句前必须带上库名。

3.4    Shell脚本规范

1、    所有sqoop任务(不包括hive任务,非关系型数据库导数任务)设置参数-m 1,不能设置超过1,不然会影响数据库的性能。

2、    对oracle查询不允许使用并行parallel参数,会影响数据库性能

3.5    脚本部署规范

在神兵上对和投产版本相关的开发、测试人员授权使用,然后按以下步骤使用:

A、根据oracle库然后选择相应的hive库,例

B、在神兵上找到相应投产版本的SVN分支路径checkout到本地,将开发好的脚本提交到相应路径下:

DDL脚本路径:src\main\shell\apps\hduserXXXX\Hive库名\db\版本号

sqoop脚本路径:src\main\shell\apps\hduserxXXXX\Hive库名\sqoop_imp

hive脚本路径:src\main\shell\apps\hduserXXXX\Hive库名\hive_xxx

3.6    任务命名规范

1、    增量任务命名:sqoop_idld_"oracle sid"_源表名

2、    基础任务命名:hive_bas_"oracle sid"_源表名

3、    初始化任务命名:hive_bas_"oracle sid"_源表名_init

4、    维度任务命名:hive_dim_维度信息

4    Lxx1-xx3开发规范

4.1    用户队列规范

4.2    创建表规范

1、xx3表命名规范:out_源系统简称_to_目标系统简称_表名

2、xx3字段规范必须要有注释

3、文件格式、分区规范可参考3.2章

4.3    创建表脚本规范

xx3创建表脚本规范与xx1略同

4.4    xx3脚本部署规范

在神兵上对和投产版本相关的开发、测试人员授权使用,然后按以下步骤使用:

A、对外接口系统只有一个库sx_inout_safe。

B、在神兵上找到相应投产版本的SVN分支路径checkout到本地,将开发好的脚本提交到相应路径下:

DDL脚本路径:src\main\shell\apps\hduserXXXX\db\版本号,

如:src\main\shell\apps\ hduserXXXX\db\

hive脚本路径:src\main\shell\apps\hduserXXXX\sx_XXXX_safe\hive_xxx

4.5    任务命名规范

hive任务命名:hive_源系统简称_to_目标系统简称_表名

5    Lxx1-xx2开发规范

xx2子系统主要用于对内导出任务管理子系统,没有存储资源和队列资源,所以需要使用集市库的资源,不需要单独建表,直接从DM库的表中导出数据即可。

5.1    xx2任务命名规范

任务命名:sqoop_export_表名

表放在新建的hive库中 :各自团队的集市库

用户是: 各自团队集市库的虚拟用户

队列是: 各自团队集市库的队列

5.2    xx2脚本部署规范

在神兵上对和投产版本相关的开发、测试人员授权使用,然后按以下步骤使用:

在神兵上找到相应投产版本的SVN分支路径checkout到本地,将开发好的脚本提交到相应路径下:

DDL脚本路径:src\main\shell\apps\hduserxxxx\db\版本号,

5.3    特别说明:xx2资源使用规范

xx2这个公共子系统是没有独立的公共资源,所以xx2导出都是使用各自集市库的资源(队列/存储),具体规范如下:

1、    对于团队内数据推送,按部门为单位创建队列,支持数据推送

2、    对于跨团队数据对接,需求方使用自己的队列先从关联方同步到自己的Hive库,再推送到业务系统

6    DM集市库的开发规范

DM集市库是各业务团队分析业务的集市库,归各团队自己管理。

6.1    用户队列规范

虚拟用户与队列都由各团队自行管理,并非统一。

6.2    创建表规范

DM表的规范主要是要求规范化创建表,其主要包括有agg汇总表和sub主题表两种。注意DM集市库的创建表都不能以“_mask”结尾,脱敏表除外,这些都是专门用于脱敏表的特殊标识。

6.2.1    表命名规范

1、    主题表用于记录主题域的数据

按不同的集市内容或模块划分,表的涉及应该带上表用途设计关键字。如对于APP相关的集市,应该带上“APP”关键字;数据挖掘集市的表中应该有关键字“DM”,目的是为了后续便于统一管理和维护。

规范:sub_+模块+主题[day/mon/week/year]命名,如:sub_redev_emp_info

2、汇总表主要是用于存储全量数据,其数据与关系型数据基本保持一致。

规范:agg_+模块+汇总[day/mon/week/year]命名,如:agg_redev_result

注意:

1、汇总数据表如果有明确的业务时间,可以考虑按照业务时间来分区,同时如果有8个库,也可以考虑按照REGION_SID分为8个分区,也就是双层分区;

2、需要注意,也可以在“内容”中务必加上月度、周或者日的汇总关键字,分别是DAY、WEEK 、MON、YEAR。

3、临时表用于数据临时落地使用。

规范:seq_目标表

6.2.2    字段规范、文件存储规范、分区规范

6.3    创建表脚本规范

创建表脚本规范可参考3.3章。

6.4    脚本部署规范

在神兵上对和投产版本相关的开发、测试人员授权使用,然后按以下步骤使用:

A、根据各团队选择相应的hive库,线上业务分析的任务,对应的hive库为sx_360_safe。

B、在神兵上找到相应投产版本的SVN分支路径checkout到本地,将开发好的脚本提交到相应路径下:

DDL脚本路径:src\main\shell\apps\虚拟用户名\Hive库名\db\版本号

hive脚本路径:src\main\shell\apps\hduserXXXX\Hive库名\hive_xxx

6.5    任务命名规范

2、    spark任务命名:spark_“表名”

7    Shell脚本开发规范

7.1    shell的标准开头

#!/bin/sh

source ExitCodeCheck.sh

这里ExitCodeCheck.sh,定义了一个函数exitCodeCheck去检查程序的返回值是否为0,如果是0就表示成功,继续往下操作,否则就失败,跳出整个shell;所以基本在每一个实际操作后,都加上这个函数exitCodeCheck $?。



hive -v -e "执行语句";

exitCodeCheck $?

注意:在一些特殊情况,是不需要加的,这个在后面单独章节描述;

7.2    运营参数规范

不管是什么频率的运行脚本(包括初始化),MIS运营调度每次都可以将9大类参数传入,shell脚本里面9类参数不能写死。依次为:

开始时间:格式yyyymmdd

结束时间:格式yyyymmdd

关系数据库的jdbc连接串

关系数据库的用户名

关系数据库的密码

关系数据库的REGION_SID(一定为大写字母)

Hadoop队列名,shell脚本队列需要进行参数化,不能写死

Hadoop集群名(不带后面的/)

用户自定义其他参数

可以用下面类似的shell语句去得到前面8个参数,然后用到shell脚本中,

getparam(){

arg=$1

echo $opts |xargs -n1 |cut -b 2- |awk -F'=' '{if($1=="'"$arg"'") print $2}'

}



IncStart=`getparam inc_start`

IncEnd=`getparam inc_end`

oracle_connection=`getparam jdbc_str`

oracle_username=`getparam db_user`

oracle_password=`getparam db_psw`

dataName=`getparam db_sid`

queueName=`getparam hdp_queue`

hdfshostname=`getparam hdfs_host`;

hivedbname=`getparam hive_db_name`;

自测试调用的时候,可以参考下面格式

./b.sh -inc_start=20030228 -inc_end=20030302 -jdbc_str=jdbc:XXXXXXXXXXX -db_user=username -db_psw=password -db_sid=LUBJ0 -hdp_queue=queue_XXXXX   -hdfs_host=hdfs://XXXXXXXXXX:9000

7.3    支持二次运行

在运行中,由于各种原因,程序可能会失败,一个shell脚本应该具有原子性,当出现失败的时候,或者运行成功之后,重复运行这个shell脚本应该不会影响数据的正确性和完整性,这就要求在设计上进行必要的支持二次运行的设计。

如导入,导出的时候,先删除临时目录

7.4    支持重跑历史数据

在运行任务中,很多任务需要根据某些业务时间去重跑历史数据,比如计算金管家APP历史天的注册量,为运行历史的每日注册量和当日最新任务的脚本,使用尽量同一套脚本,因此在编写SQL时,通常需要限制业务时间的上限时间,以达到脚本能支持历史数据的重跑,否则,将会造成历史数据的错误。

7.5    加工简洁

1、一个shell脚本中只对一个表进行增删改操作(这从shell脚本的命名规范中也可以看到),但是这不是必须的,Hive为了提高性能,支持一个源头操作多个表,在程序开发中也可以利用这一点提高性能。

注:当出现一个shell脚本操作多个表的时候,在录入运营的部署平台的时候,对于目标表每个表都必须录入,用逗号隔开;

2、 一个shell脚本尽量简洁,不要将过多的内容放到一个shell脚本中执行,当处理内容过多时,可以考虑拆分为多个shell脚本,而且这个对于二次运行也有好处,当一个脚本加工很多内容时,如果遇到一个错误,必须从头开始执行,那些前面已经成功的任务也重复执行了,从而影响到性能。

3、为了数据仓库的可读性与可维护性,临时表的加工链路尽量简洁,串行shell任务依赖长度不宜超过3层。

7.6    初始化任务循环条数不能超过333条

初始化任务循环取数不能超过333条,不然后报以下错误。

 

7.7    Sqoop脚本开发规范

1、    同步表结构必须要与源数据库端一致,不能根据业务情况进行增减字段。

2、    同步方式只能有增量、全量、初始化三种模式

3、    sqoop 后面不要加空格,否则容易造成乱码

4、    数字类型处理

一般很大的数字类型,没有金额含义的,只做序列等使用的,则一般转为String,很大数字的数字类型,如超过20位的数字,没有金额含义的,只做序列等使用的,在Oracle中定义为NUMBER,则一般转为String, 这是因为当数字很大时,在导入导出的时候,会超过数字类型限制;这个最典型的例子是很多机构表的pk_serial#字段,定义为number,但是在Hive不能定义为DECIMAL,而是定义为string。

5、    日期类型处理

对于日期类型,不需要进行显示的类型转换,Oracle中的日期类型,在Hive中也定义为String,这时候,不需要在sqoop中进行显示的类型转换,也就是直接使用字段名即可。自动转为字符,但是特别注意:sqoop在导入Oracle的错误日期0000的时候不报错,而是将其导成了一个比较特殊的日期,如5587-01-01 00:00:00.0,所以为了好处理,可以考虑在sqoop语句中加适当判断语句。直接在Oracle中判断,如case when 时间字段 < to_date('10000101','yyyymmdd') then to_date('10000101','yyyymmdd') else 时间字段 end。

6、    target-dir参数以及必须执行二次运行

A: target-dir参数指定导入数据时用的临时目录;目前规范为:/apps-data/Hadoop用户名/Hadoop数据库名/import/ ${IncStart}/${hive_table}/${dataName};

其中IncStart,可选,主要用于增量任务,初始化任务,如果是按时间分段同步,则也需要,否则不需要;hive_table必选,用于区分不同表;dataName,可选,用于从8个机构库的导数;

B: 为了支持8个机构库的并发,对于从8个库的导入,对于初始化任务,最后的表名,统一是建立一个表用8个分区的方式,都在目录增加一个“关系数据库的REGION_SID”,(也就是运营调度平台的第6个参数);

例如:

下面数据库参数保存在shell变量dataName中,那么target-dir参数为target_dir=/apps-data/hduser0101/sx_360_safe/import/${hive_table}/${dataName};这样的好处为:各个机构库不会因为并行而造成目录冲突,采用一个表8个分区的方式,这一点要特别注意,因为容易忘记,但是忽略会造成错误;

C:为了支持二次运行,必须在sqoop命令前加上hadoop dfs -rmr 目录去删除这个目录,这个“目录”就是上面的target-dir参数,但是在后面不要增加exitCodeCheck $?,否则当没有这个目录时去删除的时候会报错。

7、    split-by子句用法

A: -m 1

表示只使用一个MAP来执行数据导入。默认设置MAP个数为1。不允许私自将参数调大,影响关系型数据库性能。

B: --split-by ${some_column}

表示根据某一个字段的值将导数任务拆分。当前版本只能指定一个字段。split-by支持的字段类型有:BigDecimal,Boolean,Date,Float,Integer。

split-by字段区分度:

(1) 若split-by的字段是varchar2的,性能比全表导只快一点点,有可能还要慢, 且varchar2的可能会导致数据重复导入,建议不要用varchar2的字段做split-by。

(2) split-by字段应该挑选可将整表数据均匀划分范围的字段。

(3) split-by字段的不同的值的个数n与指定的map个数m的关系,两者最好相等,或者n是m的偶数倍,否则会出现数据倾斜。

 a)若指定4个mapper导数,但split-by的字段实际数值只有一种,sqoop只会启一个map导数,比全表导会更慢。

 b)若split-by 月份,且表中有1月到4月共4个月的数,指定map个数为3,则会出现数据倾斜问题,即3月和4月由一个map来导;此时最好设置map数为4才能避免数据倾斜情况。

(4) split-by字段有空值的情况,为空的部分不会导入到hadoop,但整个过程不会报错。

(5) split-by不支持多个字段。

8、    fetch-size一次导入的数据量

fetch-size:fetch-size 默认是1000,表示jdbc的一次从resultSet中获取多少记录数,若查询的字段较少,可适当调大这个参数值,目前建议设置为5000。

9、    源端库建立的视图和表定义的差别

最好直接抽取下面的表而非视图,如 View: undwrt_result定义为lifedata. undwrt_result where is_valid='Y',那么最好直接抽取lifedata. undwrt_result,同时抽取is_valid;抽取过来后在后面的使用中考虑增加过滤条件is_valid='Y',因为这有利于数据同步,因为业务数据可能由Y变成N,从而造成两边数据不一致。抽取表数据的好处在于:将is_valid抽过来,再将那些由Y变化为N的以及由N变化为Y都同步过来进行修改,这样就可以保证两边一致。

10、    必须考虑删数情况

在设计导数的时候,需要考虑有记录在业务系统中删除的情况,  并且由于删数往往是按照pk_serial#进行,所以最好进行除重,而且从两个基础删除表中抽删除的数,而不是从视图中抽取;如下面是从pol_info的删除表中抽取删除记录的语句:

SELECT distinct \

        AB.PK_SERIAL,  \

       AB.REGION_SID   \

FROM  \

(     \

SELECT   \

       to_char(PK_SERIAL#) AS PK_SERIAL,  \

       upper('${dataName}') as REGION_SID   \

  FROM lifelog.tr_log_POL_INFO1 A   \

  WHERE   a.TRIGGER_DATE >=to_date('${IncStart}','yyyymmdd')  \

  and     a.TRIGGER_DATE < to_date('${IncEnd}','yyyymmdd')   \

  AND     A.LOG_TYPE = 'D'  \

  UNION    \

  SELECT    \

       to_char(PK_SERIAL#) AS PK_SERIAL, \

       upper('${dataName}') as REGION_SID  

  FROM lifelog.tr_log_POL_INFO2 A  \

  WHERE   a.TRIGGER_DATE >=to_date('${IncStart}','yyyymmdd')  \

  and     a.TRIGGER_DATE < to_date('${IncEnd}','yyyymmdd')   \

  AND     A.LOG_TYPE = 'D' \

) AB \

WHERE  1= 1 \

and   \$CONDITIONS

由于删除的记录不是很多,而且在很多情况下,可能没有记录,所以可以在前面做一个判断,如果删除记录表里面没有数据,则不必进行基础数据删除。

11、    脚本内需要添加job_name参数

脚本内需要添加job_name参数,值为$0(即为脚本名),这样有利于在hadoop的WebUI根据jobname监控当日任务运行状况,便于排错等,如果同一个脚本有多个步骤的执行任务,则可以设置mapred.job.name=job_name_[第几步任务],便于监控脚本执行进度。

7.8    HIVE脚本开发规范

7.7.1    HQL和Oracle SQL的几个很隐蔽的差异

A、SQL中null代表空值, 值得警惕的是, 在HiveQL中String类型的字段若是空(empty)字符串, 即长度为0, 那么对null值进行IS NULL的判断结果是False;

B、对于字符串连接函数,Oracle 中有一个字符串参数为null的时候,则直接为原值;但是Hive只要中间有一个是null,则整个是NULL;

C、Hive不允许按照字段进行加入操作,也就是insert后面不允许选择字段,所以必须以所有字段为单位,缺失的字段加入NULL或者缺省值;

D、分号是SQL语句结束标记,在HiveQL中也是,但是在HiveQL中,对分号的识别没有那么智能。

例如:

select concat(key,concat(';',key)) from dual;

但HiveQL在解析语句时提示:

FAILED: Parse Error: line 0:-1 mismatched input '<EOF>' expecting ) in function specification

解决的办法是,使用分号的八进制的ASCII码进行转义,那么上述语句应写成:

select concat(key,concat('\073',key)) from dual;

7.7.2    查询语句规范

A、应该把最大的那个表写在最后,也可以用HINTS改变:/*+ STREAMTABLE(s) */

B、LEFT SEMI JOIN 是 IN/EXISTS 子查询的一种更高效的实现

C、关联比较小的维表以及事实表,可以考虑使用MAPJOIN

7.7.3    常见的调优和严禁的写法

A、严禁写笛卡尔积写法,除非是逻辑需要。

如:

Select *

From table1,table2

Where table1.field1 = table2.field2

这个在Hive中会产生笛卡尔积

而应该写成

Select *

From table1 join table2 on table1.field1 = table2.field2

B、提前过滤数据,减少中间数据依赖,尤其是有分区表中过滤条件包含分区字段。

C、不要关联过多的表,如超过4个。尽量是2个,表小的话,可以考虑3个,4个。

7.7.4    排序和除重

A:HQL中Order by 实现全局排序,一个reduce实现,效率低。

Sort by 实现部分有序,单个reduce输出的结果是有序的,效率高,通常和DISTRIBUTE BY关键字一起使用(DISTRIBUTE BY关键字 可以指定map 到 reduce端的分发key),CLUSTER BY col1 等价于DISTRIBUTE BY col1 SORT BY col1。

所以建议不要使用Order by,而是CLUSTER BY,尤其当只是操作记录而非前台展示。

B:除重

除重是一个消耗资源的操作,HQL提供了一些常用的除重方法:

第一:distinct

第二:row_number函数

第三:提前进行基础表的除重,尤其是大表之间的关联,在小的基础表上可以提前按照关联字段进行除重,从而避免了对于关联后的结果集进行除重。

7.7.5    脚本内需要添加job_name参数

脚本内需要添加job_name参数,值为$0(即为脚本名),这样有利于在hadoop的WebUI根据jobname监控当日任务运行状况,便于排错等,如果同一个脚本有多步执行任务,则可以设置mapred.job.name=job_name_[第几步任务],便于监控脚本执行进度。

7.7.6    脚本优化参数

1、    所有hive脚本(不包括sqoop直接从关系型数据库的导数任务)建议增加以下参数

输入文件合并

set mapreduce.input.fileinputformat.split.maxsize=256000000(默认256M,可以大于256M,但绝对不能小于256M)

set mapreduce.input.fileinputformat.split.minsize.per.node=256000000

set mapreduce.input.fileinputformat.split.minsize.per.rack=256000000

输出文件合并

-- 在Map-only的任务结束时合并小文件,建议开启

set hive.merge.mapfiles=true;

-- 在Map-Reduce任务结束时合并小文件,建议开启

set hive.merge.mapredfiles=true;

2、    建议开发不要指定reduce个数,如:set mapred.reduce.tasks=xxx

8    SVN权限申请

xx1,xx2,xx3公共子系统的权限申请,可以联系大数据团队接口人获取相应的版本计划、SVN权限、神兵

DM集市库权限申请需要联系对应集市库负责人申请。

DM集市库信息

10.2    xx1系统hive库的数据权限申请规范:

1、    按整个库授权,数据属主部门可以申请访问对应hive库的全库访问权限。

2、    跨属主部门申请表权限,按照权限最小化原则。在征得业务属主同意后,只能申请对应表的访问权限

10.3    xx3系统权限申请规范:

1、    按照权限最小化原则。在征得业务属主与安全同意后,只能申请对应表的访问权限,并且接口表的创建只能按照输出签报中已明确要求的字段,多余字段不得输出。

2、    对外接口表有涉及敏感字段(已评估可输出),需发给安全同事(张扬)进行评估,是否需要加密输出

11    Lxx1-xx1系统新增数据源流程

假如后面新增ODS数据源

1、    Lxx1-xx1申请新库

2、    内部数据源xx1库

3、    外部数据源ODS库

4、    Lxx1-xx1系统走架构评审,“谁使用谁负责”

5、    大数据应用团队接口人需提供对应的系统逻辑实体、IP端口、新数据源用户名等配置信息。

6、    打通Lxx1-xx1系统与新数据源防火墙

7、    调度平台申请新的调度jdbc:新建jdbc,命名规则:xxx_jdbc。其中xxx为关系型数据库sid,并且首字母要求大写。

8、    新调度jdbc配置用户与密码:新数据源用户需由关联方联系DBA创建,创建后联系运营将用户、密码信息配置到新jdbc中。

posted on 2020-09-20 21:10  风有衡  阅读(438)  评论(0编辑  收藏  举报