You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by GitBox <gi...@apache.org> on 2020/02/20 04:14:34 UTC

[GitHub] [incubator-doris] wangbo commented on a change in pull request #2940: spark etl build global dict doc

wangbo commented on a change in pull request #2940: spark etl build global dict doc
URL: https://github.com/apache/incubator-doris/pull/2940#discussion_r381733448
 
 

 ##########
 File path: docs/documentation/cn/internal/spark_etl_global_dict.md
 ##########
 @@ -0,0 +1,125 @@
+# 目标
+支持Spark ETL导入流程中的全局字典构建与编码。
+
+# 主要思路
+通过新增一个spark job,执行spark sql,完成全局字典的构建与编码。
+如果当前的doris olapTable不包含精确去重字段,那么可以跳过全局字典的构建与编码,直接产出一张hive表,作为接下来spark etl流程的输入。
+以下是全局字典构建与编码job的详细设计,下文中均称为```当前job```
+
+# 作业输入
+1. 作业所需的所有上下文信息
+	* 上游hive表名称,String
+	* 精确去重字段列表,List<String>
+	* Doris olapTable字段列表,需要能和hive表中的字段对应上,List<String>
+	* Doris olapTable名称
+	* 用户指定filter,sql查询上游表时的过滤条件,String
+	* Doris Job Id,long
+	* 函数列,必须是spark支持的函数,列名需要和hive表中的列保持一致,List<String>
+		* 长度与doris表长度一致,通过数组下标确定字段到函数的对应关系
+	* 表达式计算列,必须是spark支持的表达式,表达式中的列需要和hive表中的列保持一致,List<String>
+	* doris hive库,所有构建流程中要用到的hive表都在当前库中创建,String
+	* 以上信息,可以通过提交spark作业时,以string的形式从main方法中传入参数
+
+2. 上游hive表
+	doris账户具备读权限即可
+
+# 作业输出
+1. 编码过的hive表
+	* 所有字段类型均为string
+	* 如果包含精确去重字段,精确去重字段实际存储值为bigint
+	* 该表主要用于下一步spark预计算时的输入
+	* 该表名称的格式为“固定前缀+doris表名+dorisjobid”
+	* 完成表达式计算
+	* 完成spark函数计算
+	* 完成用户指定条件的过滤
+
+# 功能点支持与实现
+1. 支持对于HDFS等文件系统存储数据的数据读取
+	* hive本身已经实现了指定数据源以及文件读取格式的功能,因此对于用户文件的导入可以通过新建外部表的方式
+	* 关于访问hive metastore的问题
+		* 目前sparksql是包含访问hive表的接口的,例如获取表结构。
+		* 使用时只需要在提交spark作业时上传一个包含hive metastore地址的hive-site.xml即可
+		* 另外还需要上传hive metastore依赖的jar,spark默认不携带这些jar包
+		* 如果公司内部版本的spark客户端在提交作业时会自动携带hive包,Doris提交作业时无需指定jar包位置
+2. 支持对于导入列的函数计算
+	* 函数可以分为两类
+		* 一类是spark支持的函数,针对这类函数,可以在```当前job```中通过sparksql完成
+		* 另一类是doris独有的,这类需要在spark预计算的job中完成
+3. 支持对于用户自定义表达式计算列的导入,例如期望导入c列,但是该列由a+b列计算出来
+	* 可以将表达式嵌入sparksql,在```当前job```中完成
+4. 支持多个hivemetastore
+	* 本次开发暂不实现
+5. 字段映射,hive表如何对应到doris的表
+	* 目前设计为创建doris的hive表时,字段名称与上游hive表一致即可
+	* 在提交```当前job```时就无需再指定映射
+6. hadoop账户的权限问题
+	* 目前仅支持使用一个doris的hadoop账户提交spark作业
+	* 如果是要读取业务方的数据,需要为doris的账户提供hadoop的读权限
+7. 失败重试
+	* 在现有的设计中,重试的粒度为```当前job```
+	* 也就是说```当前job```的任意步骤失败了,都需要从头开始重跑。
+	* 这样设计的好处是开发成本低,可以快速落地。缺点就是失败重试的成本会比较高。
+	* 暂时可以先按整个job粒度的重试。
+	* 后续可以考虑支持按照更细粒度步骤的重试,降低重试的时间成本和资源成本。
+	* 例如```当前job```每完成一步,就写一次hdfs,重试时可以从上次失败的地方继续等。
+8. 支持对于全局字典的并发访问
+	* 当有同一个olaptable的多个spark job同时运行时,可能会对全局字典的写入产生竞争,因此需要加锁
+	* 比较直接的思路是,读最新的版本,不加锁。写入时需要加锁,加锁之后建一个副本,写完成后再将该副本更新为最新的版本。
+	* 加锁可以是通过fe接口调用加锁。
+	* 并发访问问题现阶段暂时不实现。
+	* 现阶段可以先通过fe控制当前步骤的串行执行实现。
+
+# 全局字典hive表结构设计
+1. distinct_column_group_by(dict_key string) partition by (dict_column string)
+	* dict_key,主要保存了字段去重后的值,来源是上游hive表
+	* dict_column,保存了去重字段的名称,在多个去重字段的去重值在同一个hive表的前提下,帮助快速访问到需要的分区数据
+2. global_dict_hive_table(dict_key string, dict_value bigint)partition by (dict_column string)
 
 Review comment:
   目前设计是一个olaptable表,一个global_dict table。
   缺点是可能会有冗余,但好处是不同olap table的导入不会受影响

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org