大数据生态系统中对数据进行分区的重要性

好文分享 3年前 (2018) Mgo
0
    下面讲解大数据news.webhostingtalk.cn/生态系统中对数据进行分区的重要性。

    每当我们使用SparkSQL来读取这类目录结构时,它将通过同时推断分区列及其值来为我们自动找出给定目录中的分区布局。接着,它们将被添加到某些伪列内(类似于以下Hive操作)生成的数据框中,请参考下列示例:

    valdf=sqlContext.read.parquet(“/path/to/my_table”)//loaddata

    df.printSchema()//printinferredschema

    root

    |--column1:string(nullable=true)

    |--column2:string(nullable=true)

    |--。。。

    |--Day:long(nullable=true)

    |--Month:long(nullable=true)

    |--Year:long(nullable=true)

    如果我们现在尝试使用任意这些分区列上的过滤词来查询基本数据,那SparkSQL引擎将对该查询进行优化,并只会读取与此过滤词相匹配的数据。

    打个比方,如果我们运行以下的查询指令:

    df.filter(“Year=2016”).show()

    那Spark将只会从/路径/至/我的_表格/年份=2016目录读取数据,而其余的目录将被跳过(修剪)。

    现在我想要加载一些数据

    一旦我们获取了这样的一个分区目录结构之后,就可以非常轻松地在逐个分区的基础上(不可改变的数据流水线)加载新的数据了。

    通常情况下,任何批处理类型都会每天、每周或每月按时进行。如果我们也通过任意这些属性对数据进行区分了,那只需用新数据替换正确的目录即可。

    不幸的是,我们必须自行解决这一问题,因为Spark尚未提供仅重写所选分区的简便方法。如果我们查看DataFrameWriterscalaAPI,就能看到以下方法(其实方法有很多,但我们重点关注的是以下几种方法):

    ▲直接按照我们已经描述的方式,通过文件系统上给定的列来对输出进行分区

    ▲当数据或表已存在时,指定保存的行为

    SaveMode的选项有:

    ▲覆盖――覆盖现有数据,

    ▲附加――附加数据,

    ▲忽略――忽略操作,

    ▲ErrorIfExists――默认选项,如果它早已存在,那它会在运行时警告异常

    乍一看,我们似乎已经获得了所需的一切东西,因为partitionBy会帮我们完成任何操作,所以我们无需担心任何事。不过,事实证明,我们不能对其产生依赖性,也不能只替换选定的分区。我的意思是,如果您为给定的批处理窗口将尚未分区的新数据加载到DataFrame中,那这时您具备两种选项,从而通过调用partitionBy方法来将新数据保存到现有的生产表中:

    ▲使用覆盖选项覆写现有的表格――请注意,这将彻底删除您所有的现有数据!

    ▲使用附加选项将新数据附加到现有表中――请注意,如果您尝试重新加载现有分区,那这将为您创建副本!如果您不想创建副本,那您将需要为这些分区加载现有的数据、将现有数据与新数据合并、从现有表格中删除现有数据、最终将合并过后的数据添加到该表格中。这很复杂,不是吗?不过它或多或少地还是遵循了我们在RDBMS中使用分区完成这些操作的方式。

    无论如何,对于我们不可变的数据流水线来说,似乎没有一种选项能为我们完成正确的工作,因为我们真正需要的是一种仅会替换选定分区数据的覆盖分区选项。所幸的是,Spark会在之后为我们提供这种选项,但我们现在只能自行解决这一问题了。

    这意味着,我们必须在逐个分区的基础上直接编写新的数据到一个正确的分区目录中。例如,如果我们获得了2016/1/1的新数据,那我们就需要将其保存到/路径/至/我的_表格/年份=2016/月份=1/日=1。这还需要您输入一些负责构建正确分区文件路径的实用代码。

    在某些系统中,您的批处理窗口日期(技术日期)可能与描述真实活动的实际业务日期无关,而这些日期与活动数据其实都处于摄入文件中。比如,您可以每天从不同的业务日期(如过去几天内的销售量)获取数据。

    幸运的是,我们仍然可以应用相同的概念,即解耦这两个日期,并将它们单独添加到我们的分区模式层次结构中,而在其中,批处理窗口日期将位于我们分区模式层次结构的最底层。有了这个技术批处理窗口日期,我们将能够保持我们数据流水线的不可变性,并以上述方式替换分区了。

    除了可以非常轻松地在分区基础上重新加载快照数据之外,这种方法还允许您在分区的基础上进行一些分析。例如,如果您的业务类型需要您每天验证是否设置了任何副本,那么您只需迭代使用每日分区数据来运行分析即可,这需要的内存要比您表格中现有的所有数据所需的内存要少得多。您可以想象哈希算法删除了一组将随着时间的推移而增加的PB级副本吗?另外,只要直接通过您的分区模式查看结构,您就可以立刻知道自己当下所拥有的数据类型,而且我确定您一定不想将所有的数据都放置于同一个容器中。

    小结

    我已经向您阐述了在大数据生态系统中对数据进行分区的重要性。有些人可能不同意我的观点,他们会说您可以通过扩展集群和存储来减轻性能问题,但我想说的是,我们不是应该首先解决软件问题吗?确保您的软件正常运行可以大幅提高您的性能,而且通常也不会造成硬件方面的性能问题。我们有义务使用自己的技术来维持事物的正常运行,虽然我们不能做到面面俱到,但绝对可以做到明智地处理问题。另外,这除了能让您提高性能以外,还会允许您以结构化的方式保存数据,从而简化一些操作流程。

版权声明:Mgo 发表于 2018-10-18 17:34:29。
转载请注明:大数据生态系统中对数据进行分区的重要性 | 站长聚集地

暂无评论

暂无评论...