我正在解决一个问题,我们有很多不同的事件来自不同的来源,这些事件有60%的共同领域。所以,说到这里,我开始为每个事件创建单独的表,现在看到可以有很多事件,这些事件中几乎有60%的数据字段是相同的,我正在考虑创建一个事件表,该表将包含所有事件的列,并且我将在该表中添加一个type列,它将允许我的spark作业选择与它们相关的事件。此表是一个配置单元外部表,spark作业将通过处理暂存json表将数据加载到其中。
我正在征求Maven的意见,看看这一张table的设计是否可行?
我的分区类似于分区(日期字符串、客户类型、事件类型字符串)
我可能有一个额外的分区,但还没有决定
数据以Parquet格式存储
我看到的一个好处是,当引入一个新事件时,我只需添加特定于它的列,并扩展spark框架,以防添加新的表和内容
我的集群有6个dns,每个dns上有32gig的ram和5tb的磁盘空间。因为spark是我们的核心处理框架,所以我担心所有将运行的作业的资源消耗?如果分区变得太大怎么办?我也在考虑性能和速度?
感谢您的任何意见。
1条答案
按热度按时间cu6pst1q1#
在决定如何存储数据之前,有一些事情需要考虑。
为什么用Parquet地板代替avro?在使用parquet而不是avro的进化模式周围的hive中有一些限制。
你将对你的数据做什么样的操作?如果你会使用一些列,我会建议使用Parquet而不是avro,但如果不是这样,将不会做聚合,你将主要是在行级别的工作,我会建议avro
合并这些表您希望得到什么?您会在不同的表之间使用非公共字段进行操作吗?这是常见的情况吗?从可用性的Angular 来看,保持所有表相互独立并创建一个包含公共字段的表可能是一个好主意,这将允许您处理那些不包含这些列的记录所需的非公共列,以及“合并”表中的公共字段,这就是外部表的优点。
您的数据每天将增长多少?这是非常重要的一点,你会生成很多小文件吗?如果是这样的话,你应该考虑中间进程来创建你的新文件,并使你的文件更大,至少与块大小相匹配,这是一个重要的一点,考虑到你的集群的大小是小的。
注意如何对数据进行分区一个非常细粒度的分区可能会导致许多小文件,这将影响性能。您真的需要按客户和事件类型划分分区吗?
我不确定你的spark框架的细节,但是直接引入新的列似乎很难维护,如果你决定使用avro,请考虑使用genericord
我希望这对一些决定有帮助。
编辑:回答一些问题
当您修改Parquet地板表的列结构时,配置单元似乎有一些限制。例如,要修改表定义中列的名称,您必须使用parquet.column.index.access标志才能进行此操作,这意味着您需要的所有数据都包含相同的模式。“替换配置单元中的列以添加全新定义”在配置单元版本1.3中不起作用,由于某些原因,我无法读取新列,不确定是否在其他版本中修复了此问题。
此外,spark中的模式演化被关闭,因为它更昂贵,基本上您必须读取所有文件并合并模式才能以这种方式工作,并且取决于您的文件数,这可能会影响性能
http://spark.apache.org/docs/latest/sql-programming-guide.html#schema-合并