大数据开发规范
大数据平台开发管理规范
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中。