掌桥专利:专业的专利平台
掌桥专利
首页

一种确定方法、服务器和计算机存储介质

文献发布时间:2023-06-19 19:28:50


一种确定方法、服务器和计算机存储介质

技术领域

本发明涉及Hive数据的存储技术,尤其涉及一种确定方法、服务器和计算机存储介质。

背景技术

Hive组件是Hadoop大数据生态系统中常用的数据分析组件,分析人员通过提交Hive SQL任务,利用Hive完成海量数据的分析,开源组件Hive的数据都是存储在同一个NameNode上,所以Hive处理的数据量规模受限于底层NameNode的存储数据量规模,而NameNode由于架构限制,单个NameNode在存储超过1.5亿文件后会达到性能瓶颈,不仅严重制约着Hive处理的数据规模,而且影响集群稳定性。

Hadoop开源社区为了解决单个NameNode的存储瓶颈,提出了HDFS Federation方案,即一套Hadoop集群启动多个NameNode服务,每个NameNode均可以存储文件。但是上层组件如Hive,由于开源社区最初的架构设计,无法利用多个NameNode进行数据的均衡存储与分析。即使集群开启了分布式文件系统(HDFS,Hadoop Distributed System)Federation,Hive数据仍然存储在单一NameNode路径上,导致集群多个NameNode之间数据存储不均,Hive的数据处理还是受限于单个NameNode的性能瓶颈。

目前,均是通过调优缓解Hive在单个NameNode下的数据处理瓶颈,并没有Hive利用多个NameNode进行数据均衡存储方面的高效解决方案,由此可以看出,现有的多个NameNode存储Hive数据的方式存在存储不均衡的技术问题。

发明内容

有鉴于此,本发明提供一种确定方法、服务器和计算机存储介质,以解决现有技术中存在的多个NameNode存储Hive数据的方式存储不均衡的技术问题。

本发明的技术方案是这样实现的:

第一方面,本发明实施例提供了一种确定方法,所述方法应用于基于Hive架构的服务器中,包括:

对获取到的Hive SQL任务进行解析,得到所述Hive SQL任务中表数据的输出数据;

根据预设的NameNode的选择策略,从NameNode集合中,选取NameNode;其中,所述NameNode的选择策略为按照NameNode的负载程度由低到高选取NameNode的策略;

将选取出的NameNode中可访问的NameNode,确定为所述输出数据的NameNode。

在上述方法中,所述方法还包括:

接收Hive SQL;

对接收到的Hive SQL任务进行重构,得到重构后的Hive SQL任务;

并将重构后的Hive SQL任务,确定为所述获取到的Hive SQL任务。

在上述方法中,所述对接收到的Hive SQL任务进行重构,得到重构后的Hive SQL任务,包括:

当接收到的Hive SQL任务的重构类型为插入类型,且接收到的Hive SQL任务中表数据的存储形式为分区表,且接收到的Hive SQL任务没有创建分区的语句时,对接收到的Hive SQL任务中插入语句之前创建并添加分区,并指定所创建的分区用于存储所述输出数据的NameNode的路径,以得到重构后的Hive SQL任务。

在上述方法中,所述对接收到的Hive SQL任务进行重构,得到重构后的Hive SQL任务,包括:

当接收到的Hive SQL任务的重构类型为选择类型,在接收到的Hive SQL任务中添加配置出的临时目录,并指定所述临时目录用于存储所述输出数据的NameNode的路径,以得到重构后的Hive SQL任务。

在上述方法中,所述对接收到的Hive SQL任务进行重构,得到重构后的Hive SQL任务,包括:

当接收到的Hive SQL任务的重构类型为创建类型,且接收到的Hive SQL任务中没有指定的NameNode的路径时,指定接收到的Hive SQL任务中所创建的分区用于存储表数据的NameNode的路径,以得到重构后的Hive SQL任务。

在上述方法中,所述根据所述NameNode的选择策略,从NameNode集合中,选取NameNode,包括:

获取所述NameNode集合中每个NameNode的空间信息;

计算所述每个NameNode的剩余存储空间;

按照所述每个NameNode的剩余存储空间由多到少,从所述NameNode集合中,选取NameNode。

在上述方法中,所述根据所述NameNode的选择策略,从NameNode集合中,选取NameNode,包括:

获取所述NameNode集合中每个NameNode的远程调用的指标信息;

从所述每个NameNode的远程调用的指标信息中,选取出所述每个NameNode的远程过程调用的存储队列长度;

按照所述每个NameNode的远程调用的存储队列长度由短到长,从NameNode集合中,选取NameNode。

在上述方法中,所述方法还包括:

当对所述Hive SQL任务中的表数据进行查询,且所述Hive SQL任务中表数据存在至少两个NameNode的路径时,对所述Hive SQL任务中表数据的至少两个NameNode的路径进行路径校验;

和/或,当对所述Hive SQL任务中的表数据进行查询,且所述Hive SQL任务中表数据的临时文件设置了路径加密时,对所述Hive SQL任务中表数据的临时文件的至少两个NameNode的路径进行路径加密;

和/或,当对所述Hive SQL任务中的表数据进行查询时,获取所述Hive SQL任务中以分区表存储的表数据的元数据,和所述Hive SQL任务中所有分区表在至少两个NameNode的路径,以对所述所有分区表在至少两个NameNode的路径进行扫描。

在上述方法中,所述方法还包括:

当对所述Hive SQL任务中的表数据的输出数据进行存储,且所述Hive SQL任务中存在分区表时,允许所述分区表中输出数据的存储路径与所述Hive SQL任务中表数据的根目录不一致;

和/或,当对所述Hive SQL任务中的表数据的输出数据进行存储,且所述Hive SQL任务中分区表中的数据已经生成时,允许所述分区表中临时数据的存储路径与所述HiveSQL任务中表数据的临时数据的根目录不一致。

第二方面,本发明提供了一种服务器,所述服务器为基于Hive架构的服务器,包括:

解析模块,用于对获取到的Hive SQL任务进行解析,得到所述Hive SQL任务中表数据的输出数据;

选取模块,用于根据预设的NameNode的选择策略,从NameNode集合中,选取NameNode;其中,所述NameNode的选择策略为按照NameNode的负载程度由低到高选取NameNode的策略;

确定模块,用于将选取出的NameNode中可访问的NameNode,确定为所述输出数据的NameNode。

在上述服务器中,上述装置还用于:

接收Hive SQL;

对接收到的Hive SQL任务进行重构,得到重构后的Hive SQL任务;

并将重构后的Hive SQL任务,确定为所述获取到的Hive SQL任务。

在上述装置中,上述装置对接收到的Hive SQL任务进行重构,得到重构后的HiveSQL任务中,包括:

当接收到的Hive SQL任务的重构类型为插入类型,且接收到的Hive SQL任务中表数据的存储形式为分区表,且接收到的Hive SQL任务没有创建分区的语句时,对接收到的Hive SQL任务中插入语句之前创建并添加分区,并指定所创建的分区用于存储所述输出数据的NameNode的路径,以得到重构后的Hive SQL任务。

在上述服务器中,上述服务器对接收到的Hive SQL任务进行重构,得到重构后的Hive SQL任务中,包括:

当接收到的Hive SQL任务的重构类型为选择类型,在接收到的Hive SQL任务中添加配置出的临时目录,并指定所述临时目录用于存储所述输出数据的NameNode的路径,以得到重构后的Hive SQL任务。

在上述服务器中,上述服务器对接收到的Hive SQL任务进行重构,得到重构后的Hive SQL任务中,包括:

当接收到的Hive SQL任务的重构类型为创建类型,且接收到的Hive SQL任务中没有指定的NameNode的路径时,指定接收到的Hive SQL任务中所创建的分区用于存储表数据的NameNode的路径,以得到重构后的Hive SQL任务。

在上述服务器中,选取模块,具体用于:

获取所述NameNode集合中每个NameNode的空间信息;

计算所述每个NameNode的剩余存储空间;

按照所述每个NameNode的剩余存储空间由多到少,从所述NameNode集合中,选取NameNode。

在上述服务器中,选取模块,具体用于:

获取所述NameNode集合中每个NameNode的远程调用的指标信息;

从所述每个NameNode的远程调用的指标信息中,选取出所述每个NameNode的远程过程调用的存储队列长度;

按照所述每个NameNode的远程调用的存储队列长度由短到长,从NameNode集合中,选取NameNode。

在上述服务器中,上述服务器还用于:

当对所述Hive SQL任务中的表数据进行查询,且所述Hive SQL任务中表数据存在至少两个NameNode的路径时,对所述Hive SQL任务中表数据的至少两个NameNode的路径进行路径校验;

和/或,当对所述Hive SQL任务中的表数据进行查询,且所述Hive SQL任务中表数据的临时文件设置了路径加密时,对所述Hive SQL任务中表数据的临时文件的至少两个NameNode的路径进行路径加密;

和/或,当对所述Hive SQL任务中的表数据进行查询时,获取所述Hive SQL任务中以分区表存储的表数据的元数据,和所述Hive SQL任务中所有分区表在至少两个NameNode的路径,以对所述所有分区表在至少两个NameNode的路径进行扫描。

在上述服务器中,上述服务器还用于:

当对所述Hive SQL任务中的表数据的输出数据进行存储,且所述Hive SQL任务中存在分区表时,允许所述分区表中输出数据的存储路径与所述Hive SQL任务中表数据的根目录不一致;

和/或,当对所述Hive SQL任务中的表数据的输出数据进行存储,且所述Hive SQL任务中分区表中的数据已经生成时,允许所述分区表中临时数据的存储路径与所述HiveSQL任务中表数据的临时数据的根目录不一致。

第三方面,本发明实施例还提供了一种服务器,所述服务器包括:处理器以及存储有所述处理器可执行指令的存储介质,所述存储介质通过通信总线依赖所述处理器执行操作,当所述指令被所述处理器执行时,执行上述一个或多个实施例所述确定方法。

第四方面,本发明实施例提供了一种计算机存储介质,存储有可执行指令,当所述可执行指令被一个或多个处理器执行的时候,所述处理器执行上述一个或多个实施例所述确定方法。

本发明所提供的一种确定方法、服务器和计算机存储介质,该方法应用于基于Hive架构的服务器中,包括:对获取到的Hive SQL任务进行解析,得到Hive SQL任务中表数据的输出数据,根据预设的NameNode的选择策略,从NameNode集合中,选取NameNode;其中,NameNode的选择策略为按照NameNode的负载程度由低到高选取NameNode的策略,将选取出的NameNode中可访问的NameNode,确定为输出数据的NameNode;也就是说,在本发明实施例中,通过对获取到的Hive SQL任务进行解析得到需要存储的输出数据,根据预设的NameNode的选择策略选取出NameNode后,将选取出的NameNode中具有访问权限的NameNode作为输出数据的NameNode,由于预设的NameNode的选择策略是按照NameNode的负载由低到高来选择的,即这里考虑到了各个NameNode的负载情况,并根据各个NameNode的负载情况来选取用于存储输出数据的NameNode,如此,避免了多个NameNode存储Hive数据时出现NameNode的负载失衡的情况发生,从而实现了多个NameNode存储Hive数据时的均衡存储。

附图说明

图1为本发明实施例中的一种可选的确定方法的流程示意图;

图2为本发明实施例提供的一种可选的Hive SQL任务的语义解析的流程图;

图3为本发明实施例提供的一种可选的进行Hive SQL任务处理的结构示意图;

图4为本发明实施例提供的一种可选的对Hive SQL任务进行重构的流程示意图;

图5为本发明实施例提供的一种可选的NameNode的性能分析的流程示意图;

图6为本发明实施例提供的一种可选的服务器的结构示意图;

图7为本发明实施例提供的另一种可选的服务器的结构示意图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述。

实施例一

本发明实施例提供一种确定方法,图1为本发明实施例中的一种可选的确定方法的流程示意图,如图1所示,该确定方法可以包括:

S101:对获取到的Hive SQL任务进行解析,得到Hive SQL任务中表数据的输出数据;

目前,为了缓解NameNode的存储失衡,通常可以采用以下任意一种方案:第一种,通过Hive的大小文件的合并功能,把NameNode上多个小文件合并成一个大文件,缓解NameNode的文件数量过多带来的响应延迟问题;第二种,关闭或者缩短NameNode的trash回收站保存的历史删除数据的周期,以此来提高Hive新的数据的存储规模;第三种,在底层NameNode存储达到瓶颈时,新建一套Hadoop集群,把Hive数据存储在新的集群中。

然而,上述三种方案均是围绕在单个NameNode存储下的调优方案,并且这些方案也会带来其他的负面影响,并不能从根本上解决存储失衡的技术问题,为了解决多个NameNode存储数据时存数失衡的问题,本发明实施例提供一种确定方法,首先,对获取到的Hive SQL任务进行解析以得到Hive SQL任务中表数据的输出数据。

针对Hive SQL任务来说,其中,包括用于存储表数据的NameNode的路径,当获取到Hive SQL任务时,对Hive SQL任务进行解析时,先查询,即获取Hive SQL任务中的表数据的NameNode的路径,然后根据表数据的NameNode的路径查询得到表数据,并根据表数据计算得到输出数据,本发明实施例中用于确定输出数据的NameNode。

为了实现利用多个NameNode来存储输出数据,在一种可选的实施例中,上述方法还可以包括:

接收Hive SQL;

对接收到的Hive SQL任务进行重构,得到重构后的Hive SQL任务;

并将重构后的Hive SQL任务,确定为获取到的Hive SQL任务。

具体来说,由于现有的都是将输出数据存储至单个NameNode,需要对Hive SQL任务进行重构,以确定出用于存储输出数据的NameNode的路径的区域或者表数据的NameNode的路径的区域,最终将重构后的Hive SQL任务确定为获取到的Hive SQL,以实现对获取到的Hive SQL任务的解析,得到表数据的输出数据和存储输出数据的NameNode的路径的区域。

那么,在计算得到输出数据和存储输出数据的NameNode的路径的区域之后,服务器可以将输出数据按照输出数据的NameNode的路径找到输出数据的NameNode,并将输出数据存储至输出数据的NameNode中。

为了实现对Hive SQL任务的重构,通常可以将Hive SQL任务分为三种重构类型,其中,三种重构类型可以包括插入类型(INSERT),选择类型(SELECT)和创建类型(CREATE),针对不同的类型,对Hive SQL任务进行不同的重构,在一种可选的实施例中,对接收到的Hive SQL任务进行重构,得到重构后的Hive SQL任务,包括:

当接收到的Hive SQL任务的重构类型为插入类型,且接收到的Hive SQL任务中表数据的存储形式为分区表,且接收到的Hive SQL任务没有创建分区的语句时,对接收到的Hive SQL任务中插入语句之前创建并添加分区,并指定所创建的分区用于存储输出数据的NameNode的路径,以得到重构后的Hive SQL任务。

具体来说,先确定Hive SQL任务的重构类型,当确定Hive SQL任务的重构类型为插入类型时,需要继续判断Hive SQL任务中的表数据的存储形式是否为分区表,当确定Hive SQL任务中的表数据的存储形式是分区表时,继续判断Hive SQL任务中有没有创建分区的语句,当Hive SQL任务中没有创建分区的语句,对Hive SQL任务进行重构。

在对Hive SQL任务进行重构中,主要是在插入语句之前将创建好的分区添加进去,并指定创建好的分区用于存储输出数据的NameNode的路径,也就是说,在插入语句之前添加进去创建好用于存储输出数据的NameNode的路径的分区,这样,实现对Hive SQL任务的重构,从而得到重构后的Hive SQL任务。

另外,当确定Hive SQL任务的重构类型为插入类型时,确定Hive SQL任务中的表数据的存储形式不是分区表时,不对Hive SQL任务进行重构,判断Hive SQL任务中有创建分区的语句,也不对Hive SQL任务进行重构。

针对Hive SQL任务的重构类型为选择类型的情况来说,在一种可选的实施例中,述对接收到的Hive SQL任务进行重构,得到重构后的Hive SQL任务,包括:

当接收到的Hive SQL任务的重构类型为选择类型,在接收到的Hive SQL任务中添加配置出的临时目录,并指定临时目录用于存储输出数据的NameNode的路径,以得到重构后的Hive SQL任务。

具体来说,当确定Hive SQL任务的重构类型为选择类型时,对Hive SQL任务进行重构,在对Hive SQL任务重构中,包括配置出临时目录,该临时目录用于存储输出数据的NameNode的路径,最后将配置出的用于存储输出数据的NameNode的路径的临时目录添加至Hive SQL任务中,得到重构后的Hive SQL任务。

当Hive SQL任务的重构类型既不是插入类型,也不是选择类型时,在一种可选的实施例中,对接收到的Hive SQL任务进行重构,得到重构后的Hive SQL任务,包括:

当接收到的Hive SQL任务的重构类型为创建类型,且接收到的Hive SQL任务中没有指定的NameNode的路径时,指定接收到的Hive SQL任务中所创建的分区用于存储表数据的NameNode的路径,以得到重构后的Hive SQL任务。

具体来说,当确定Hive SQL任务的类型为创建类型时,继续判断Hive SQL任务中是否有指定的NameNode的路径,也就是说,该创建类型的Hive SQL任务中是否存在指定的用于存储表数据的NameNode的路径的分区,如果没有,需要对Hive SQL任务进行重构,指定Hive SQL任务中所创建的分区用于存储表数据的NameNode的路径。

另外,如果Hive SQL任务中有指定的NameNode的路径,则不对Hive SQL任务进行重构。

S102:根据预设的NameNode的选择策略,从NameNode集合中,选取NameNode;

为了实现对输出数据的存储,需要为输出数据选取合适的NameNode,以实现NameNode的均衡存储,这里,预先设置有NameNode的选择策略,其中,NameNode的选择策略为按照NameNode的负载程度由低到高选取NameNode的策略;也就是说,根据NameNode的负载程度来为输出数据选取NameNode,这样,选取出负载程度较低的NameNode作为输出数据的NameNode,能够实现多个NameNode存储数据时的均衡存储。

需要说明的是,针对负载程度的高低可以采用多个指标来计算,例如,通过计算NameNode的剩余存储空间来确定NameNode的负载程度,或者通过远程调用的存储队列长度来确定NameNode的负载程度,这里,本发明实施例对此不作具体限定。

为了实现通过计算NameNode的剩余存储空间来确定NameNode的负载程度,在一种可选的实施例中,S102可以包括:

获取NameNode集合中每个NameNode的空间信息;

计算每个NameNode的剩余存储空间;

按照每个NameNode的剩余存储空间由多到少,从NameNode集合中,选取NameNode。

具体来说,先获取NameNode集合中每个NameNode的空间信息,然后根据每个NameNode的空间信息,分别计算出每个NameNode的剩余存储空间,然后按照计算出的每个NameNode的剩余存储空间由多到少的顺序,从NameNode集合中选取NameNode。

也就是说,剩余存储空间越多的NameNode,负载程度越低,剩余存储空间越少的NameNode,负载程度越高,这里,从负载程度由低到高选取NameNode,使得,选取出的NameNode尽可能负载较低,这样,实现多个NameNode存储数据时的均衡存储。

为了实现通过远程调用的存储队列长度来确定NameNode的负载程度,在一种可选的实施例中,S102可以包括:

获取NameNode集合中每个NameNode的远程调用的指标信息;

从每个NameNode的远程调用的指标信息中,选取出每个NameNode的远程过程调用的存储队列长度;

按照每个NameNode的远程调用的存储队列长度由短到长,从NameNode集合中,选取NameNode。

具体来说,先获取NameNode集合中每个NameNode的远程过程调用的指标信息,然后根据每个NameNode的远程过程调用的指标信息,选取出每个NameNode的远程过程调用的存储队列长度,再按照每个NameNode的远程调用的存储队列长度由短到长的顺序,从NameNode集合中选取NameNode。

也就是说,远程调用的存储队列长度越短的NameNode,负载程度越低,远程调用的存储队列长度越长的NameNode,负载程度越高,这里,从负载程度由低到高选取NameNode,使得,选取出的NameNode尽可能负载较低,这样,实现多个NameNode存储数据时的均衡存储。

S103:将选取出的NameNode中可访问的NameNode,确定为输出数据的NameNode。

在确定出输出数据和选取出NameNode之后,需要对选取出的NameNode进行行访问权限的校验,针对选取出的NameNode为用户可访问的NameNode,作为输出数据的NameNode,针对选取出的NameNode为用户不可访问的NameNode,不能作为输出数据的NameNode,防止出现不可访问的NameNode在存储时出现无法存储的问题。

另外,针对输出数据存储至不同的NameNode中,能够避免部分NameNode出现的数据出现负载过高,集群不稳定的场景,然而,针对多个NameNode存储数据时,经常会出现Hive SQL任务的语义解析异常的情况发生,在一种可选的实施例中,上述方法还可以包括:

当对Hive SQL任务中的表数据进行查询,且Hive SQL任务中表数据存在至少两个NameNode的路径时,对Hive SQL任务中表数据的至少两个NameNode的路径进行路径校验;

和/或,当对Hive SQL任务中的表数据进行查询,且Hive SQL任务中表数据的临时文件设置了路径加密时,对Hive SQL任务中表数据的临时文件的至少两个NameNode的路径进行路径加密;

和/或,当对Hive SQL任务中的表数据进行查询时,获取Hive SQL任务中以分区表存储的表数据的元数据,和Hive SQL任务中所有分区表在至少两个NameNode的路径,以对所有分区表在至少两个NameNode的路径进行扫描。

具体来说,针对开源Hive在语义解析阶段存在的异常问题,可以分为查询时出现的异常情况和存储时出现的异常情况,针对查询时出现的异常情况来说,主要是对Hive语义解析过程中的逻辑执行计划阶段进行改进。

当对Hive SQL任务中的表数据进行查询,且Hive SQL任务中表数据存在至少两个NameNode的路径时,说明该表数据存储在不同的NameNode中时,由于现有的语义解析中只支持单个NameNode的路径校验,所以,这里,对Hive SQL任务中表数据的至少两个NameNode的路径进行路径校验,即,首先解除Hive对单个NameNode输入路径的校验,增加多路径校验逻辑,允许Hive表数据输入路径来自多个NameNode。

当对Hive SQL任务中的表数据进行查询,且Hive SQL任务中表数据的临时文件设置了路径加密时,由于现有的仅对单个NameNode的路径进行加密,所以,这里,对Hive SQL任务中表数据的临时文件的至少两个NameNode的路径进行路径加密,即,允许表数据输出至不同的加密NameNode路径。

当对Hive SQL任务中的表数据进行查询时,先获取表数据的元数据,通过元数据获取所有分区表在至少两个NameNode的路径,这样,可以对所有分区表在至少两个NameNode的路径进行扫描,从而有利于对多个NameNode的路径的表数据的查询。

针对存储时出现的异常情况来说,在一种可选的实施例中,上述方法还可以包括:

当对Hive SQL任务中的表数据的输出数据进行存储,且Hive SQL任务中存在分区表时,允许分区表中输出数据的存储路径与Hive SQL任务中表数据的根目录不一致;

和/或,当对Hive SQL任务中的表数据的输出数据进行存储,且Hive SQL任务中分区表中的数据已经生成时,允许分区表中临时数据的存储路径与Hive SQL任务中表数据的临时数据的根目录不一致。

具体来说,一般地,在存储输出数据时,针对单个NameNode的路径来说,不允许分区表中的输出数据的存储路径与表数据的根目录不一致,也不允许分区表中的临时数据的存储路径与表数据的临时数据的根目录不一致,然而针对多个NameNode的路径来说,会出现异常情况。

为了防止异常情况的发生,这里,当对Hive SQL任务中的表数据的输出数据进行存储,且Hive SQL任务中存在分区表时,允许分区表中输出数据的存储路径与Hive SQL任务中表数据的根目录不一致;和/或,当对Hive SQL任务中的表数据的输出数据进行存储,且Hive SQL任务中分区表中的数据已经生成时,允许分区表中临时数据的存储路径与HiveSQL任务中表数据的临时数据的根目录不一致,这样,能够将输出数据最终写入不同的NameNode中。

举例来说,图2为本发明实施例提供的一种可选的Hive SQL任务的语义解析的流程图,如图2所示,Hive SQL任务尽在进行语义解析中,共包括四个阶段,分别为:AbstractSyntax Tree(抽象语法树),Logical plan(逻辑执行计划),Optimized Logical Plan(优化后的逻辑执行计划)和Physical Plan(物理执行计划),针对开源Hive在语义解析阶段存在的问题,对SQL解析源码进行优化,具体优化针对两个方面:

一个方面,若Hive查询的表数据来自多个NameNode的路径,优化Hive语义解析过程中的Logical plan阶段。

解除Hive对单个NameNode输入路径的校验,增加多路径校验逻辑,允许Hive表数据输入路径来自多个NameNode;解除Hive对临时文件的加密空间校验,即若Hive数据临时文件的路径设置了HDFS路径加密,允许Hive表数据输出至不同的加密NameNode路径。

增加Hive中多种数据输入格式,如OrcInputFormat、RcFileInputFormat的多个NameNode数据源输入获取逻辑,允许Hive任务中的获取的表数据来自不同NameNode;增加Hive中多种数据输出格式,如OrcOutputFormat、RcFileOutputFormat对不同NameNode的数据写入逻辑,允许Hive任务中输出的临时数据存储至不同NameNode。

优化分区表数据扫描逻辑,通过查询Hive分区表元数据,获取所有分区在不同NameNode上具体路径,以此增加Hive分区表读取数据时对不同NameNode上分区路径的扫描操作。

另一方面,若Hive表的分区需要存储至不同NameNode路径,优化Hive语义解析过程中Optimized Logical plan阶段。

首先对判断已经生成的逻辑计划中Hive表是否存在分区,若存在分区则允许表数据的分区路径HDFS Schema与父路径(即表数据的路径)不一致,实现分区自定义存放不同NameNode路径第一步骤;

在分区数据生成时,允许分区路径的临时数据的存放目录与表数据的临时存放目录不一致,优化分区数据Move逻辑,实现分区数据最终写入不同NameNode路径的目的。

通过这两个方面的Hive源码优化,使Hive支持一条SQL访问不同NameNode路径数据,以及同一个Hive表分区存放至不同的NameNode路径,从而使Hive充分利用多个NameNode路径进行数据存储、访问,解决了单个NameNode存储压力过大的痛点。

下面举实例来对上述一个或多个实施例中所述的确定方法进行描述。

图3为本发明实施例提供的一种可选的进行Hive SQL任务处理的结构示意图,如图3所示,Hive架构的服务器在进行Hive SQL任务处理时可以分为以下几个部分:

客户端模块(Hive Client、JDBC):用户通过Hive Client、JDBC客户端提交HiveSQL任务。

HiveServer2 Hook插件模块:对用户提交的Hive SQL任务进行解析,对Hive SQL中的输出数据的路径指定负载较低的NameNode进行存储。

Analysis Server NameNode性能分析模块:对HDFS Federation的多个NameNode进行综合分析,返回负载低的NameNode至HiveServer2 Hook插件模块。

Ranger鉴权模块:对Hive SQL中需要访问的多个NameNode路径进行权限校验。

底层HDFS Federation存储模块:由多个NameNode组成,每个NameNode有独立的NameSpace(NS)存储命名空间,如NS1、NS2、NSn多个命名空间。

Tez job计算模块:计算SQL任务,输出数据存储至负载低的NameNode。

图4为本发明实施例提供的一种可选的对Hive SQL任务进行重构的流程示意图,如图4所示,SQL重构插件负责对用户提交的Hive SQL作业输出的数据指定负载较低的NameNode,使Hive数据均衡存储在不同的NameNode路径上,同时各个NameNode负载均衡,上述重构可以包括:

S401:Hive Client/JDBC接收Hive SQL;

具体来说,用户提交Hive SQL至Hive Client/JDBC,Hive Client/JDBC将HiveSQL提交至HiveServer2 Hook服务;其中,Hive SQL中的表数据来自多个NameNode存储路径;Hive Server2 Hook插件拦截用户的Hive SQL任务,对Hive SQL任务进行分类重构。

针对重构,分为三种重构SQL类型,一种是查询类型(SELECT),一种是插入类型(INSERT),另一种是创建类型(CREATE)。下面分步骤阐述三种SQL的重构策略。

S402:Hook拦截Hive SQL;

S403:判断Hive SQL是否为INSERT,若是,执行S404;否则,执行S412;

S404:判断Hive SQL中的表数据的存储形式是否为分区表,若是,执行S405;否则,执行S412;

S405:判断Hive SQL中有没有创建分区的语句,若没有,执行S406:,否则,执行S412;

S406:对Hive SQL重构;

具体来说,在Hive SQL的INSERT语句之前添加创建分区的语句,并在分区创建中指定负载较低的NameNode,其中,负载较低的NameNode由Analysis Server NameNode性能分析模块返回;执行S412;

S407:判断Hive SQL是否为SELECT,若是,执行S408,否则执行S409;

S408:对Hive SQL重构;

具体来说,添加配置指定Hive SQL输出结果的临时目录存到负载较低的NameNode路径,其中,负载较低的NameNode由Analysis Server NameNode性能分析模块返回;执行S412;

S409:判断Hive SQL是否为CREATE,若是,执行S410,否则,执行S412;

S410:判断用户提交的Hive SQL中是否已经指定具体的NameNode存储路径,若是,执行S,否则执行S411;

S411:对Hive SQL重构;

具体来说,Hive SQL中指定表存储至负载较低的NameNode路径上,其中,负载较低的NameNode由Analysis Server NameNode性能分析模块返回;执行S412。

S412:对Hive SQL放行,任务提交。

图5为本发明实施例提供的一种可选的NameNode的性能分析的流程示意图,如图5所示,上述NameNode的性能分析方法可以包括以下步骤:

S501:Analysis Server NameNode性能分析模块获取HiveSerer2 Hook传入的NameNode的选择策略是否为基于剩余存储空间的策略,若为是,执行S502;否则,执行S504;

S502:Analysis Server NameNode性能分析模块对NameNode路径的剩余存储空间统计;

具体来说,向所有NameNode发送指定目录剩余存储空间计算请求,获取所有NameNode对指定路径的剩余存储空间信息;

S503:选择NameNode;执行S10;

具体来说,对比所有NameNode指定路径存储,选择指定路径剩余存储空间最多的NameNode。

S504:判断HiveSerer2 Hook传入的NameNode选择策略是否为远程过程调用(RPC,Remote Procedure Call)请求最少策略,若是,进行S506;否则执行S508;

S506:NameNode的RPC指标信息统计;执行S507;

具体来说,Analysis Server NameNode性能分析模块获取所有NameNode的RPC指标信息,过滤出所有NameNode的RPC的存储队列长度(CallQueueLength)信息;

S507:选取NameNode;执行S10;

具体来说,根据CallQueueLength大小选择出RPC请求最少的NameNode;

S508:采用随机策略;

S509:随机返回一个NameNode;

具体来说,随机策略从当前集群存在的NameNode中随机选择一个NameNode返回;执行S10;

S510:输出负载最低的Nameode。

通过上述实例,该方法能同时利用集群多个NameNode进行Hive数据存储、查询,不仅能够缓解单个NameNode存储数据导致的性能瓶颈,而且提高了Hive的数据处理规模、均衡了所有NameNode的Hive数据存储;该方法通过存储Hive数据至不同的NameNode,均衡了所有NameNode负载,使Hive查询分散至不同NameNode,查询返回速度提升,同时其他计算引擎如presto、spark速度也会提升;优化了开源Hive组件SQL语义解析逻辑,使Hive支持数据存储在多个NameNode路径;开发了可插拔的Hive Hook插件,以及NameNode性能分析微服务,在不侵入Hive代码情况下完成SQL重构、NameNode负载分析。

本发明所提供的一种确定方法,该方法应用于基于Hive架构的服务器中,包括:对获取到的Hive SQL任务进行解析,得到Hive SQL任务中表数据的输出数据,根据预设的NameNode的选择策略,从NameNode集合中,选取NameNode;其中,NameNode的选择策略为按照NameNode的负载程度由低到高选取NameNode的策略,将选取出的NameNode中可访问的NameNode,确定为输出数据的NameNode;也就是说,在本发明实施例中,通过对获取到的Hive SQL任务进行解析得到需要存储的输出数据,根据预设的NameNode的选择策略选取出NameNode后,将选取出的NameNode中具有访问权限的NameNode作为输出数据的NameNode,由于预设的NameNode的选择策略是按照NameNode的负载由低到高来选择的,即这里考虑到了各个NameNode的负载情况,并根据各个NameNode的负载情况来选取用于存储输出数据的NameNode,如此,避免了多个NameNode存储Hive数据时出现NameNode的负载失衡的情况发生,从而实现了多个NameNode存储Hive数据时的均衡存储。

实施例二

基于同一发明构思,本发发明实施例还提供一种服务器,该服务器为基于Hive架构的服务器,图6为本发明实施例提供的一种可选的服务器的结构示意图,如图6所示,该服务器可以包括:

解析模块61,用于对获取到的Hive SQL任务进行解析,得到Hive SQL任务中表数据的输出数据;

选取模块62,用于根据预设的NameNode的选择策略,从NameNode集合中,选取NameNode;其中,NameNode的选择策略为按照NameNode的负载程度由低到高选取NameNode的策略;

确定模块63,用于将选取出的NameNode中可访问的NameNode,确定为输出数据的NameNode。

在一种可选的实施例中,上述服务器还用于:

接收Hive SQL;

对接收到的Hive SQL任务进行重构,得到重构后的Hive SQL任务;

并将重构后的Hive SQL任务,确定为获取到的Hive SQL任务。

在一种可选的实施例中,上述服务器对接收到的Hive SQL任务进行重构,得到重构后的Hive SQL任务中,包括:

当接收到的Hive SQL任务的重构类型为插入类型,且接收到的Hive SQL任务中表数据的存储形式为分区表,且接收到的Hive SQL任务没有创建分区的语句时,对接收到的Hive SQL任务中插入语句之前创建并添加分区,并指定所创建的分区用于存储输出数据的NameNode的路径,以得到重构后的Hive SQL任务。

在一种可选的实施例中,上述服务器对接收到的Hive SQL任务进行重构,得到重构后的Hive SQL任务中,包括:

当接收到的Hive SQL任务的重构类型为选择类型,在接收到的Hive SQL任务中添加配置出的临时目录,并指定临时目录用于存储所述输出数据的NameNode的路径,以得到重构后的Hive SQL任务。

在一种可选的实施例中,上述服务器对接收到的Hive SQL任务进行重构,得到重构后的Hive SQL任务中,包括:

当接收到的Hive SQL任务的重构类型为创建类型,且接收到的Hive SQL任务中没有指定的NameNode的路径时,指定接收到的Hive SQL任务中所创建的分区用于存储表数据的NameNode的路径,以得到重构后的Hive SQL任务。

在一种可选的实施例中,上述选取模块62,具体用于:

获取NameNode集合中每个NameNode的空间信息;

计算每个NameNode的剩余存储空间;

按照每个NameNode的剩余存储空间由多到少,从NameNode集合中,选取NameNode。

在一种可选的实施例中,上述选取模块62,具体用于:

获取NameNode集合中每个NameNode的远程调用的指标信息;

从每个NameNode的远程调用的指标信息中,选取出每个NameNode的远程过程调用的存储队列长度;

按照每个NameNode的远程调用的存储队列长度由短到长,从NameNode集合中,选取NameNode。

在一种可选的实施例中,上述服务器还用于:

当对Hive SQL任务中的表数据进行查询,且Hive SQL任务中表数据存在至少两个NameNode的路径时,对Hive SQL任务中表数据的至少两个NameNode的路径进行路径校验;

和/或,当对Hive SQL任务中的表数据进行查询,且Hive SQL任务中表数据的临时文件设置了路径加密时,对Hive SQL任务中表数据的临时文件的至少两个NameNode的路径进行路径加密;

和/或,当对Hive SQL任务中的表数据进行查询时,获取Hive SQL任务中以分区表存储的表数据的元数据,和Hive SQL任务中所有分区表在至少两个NameNode的路径,以对所有分区表在至少两个NameNode的路径进行扫描。

在一种可选的实施例中,上述服务器还用于:

当对Hive SQL任务中的表数据的输出数据进行存储,且Hive SQL任务中存在分区表时,允许分区表中输出数据的存储路径与Hive SQL任务中表数据的根目录不一致;

和/或,当对Hive SQL任务中的表数据的输出数据进行存储,且Hive SQL任务中分区表中的数据已经生成时,允许分区表中临时数据的存储路径与Hive SQL任务中表数据的临时数据的根目录不一致。

在实际应用中,上述解析模块61,选取模块62和确定模块63可由位于服务器上的处理器实现,具体为中央处理器(Central Processing Unit,CPU)、微处理器(Microprocessor Unit,MPU)、数字信号处理器(Digital Signal Processing,DSP)或现场可编程门阵列(Field Programmable Gate Array,FPGA)等实现。

图7为本发明实施例提供的另一种可选的服务器的结构示意图,如图7所示,本发明实施例提供了一种服务器700,包括:

处理器71以及存储有所述处理器71可执行指令的存储介质72,所述存储介质72通过通信总线73依赖所述处理器71执行操作,当所述指令被所述处理器71执行时,执行上述实施例一所述确定方法。

需要说明的是,实际应用时,终端中的各个组件通过通信总线73耦合在一起。可理解,通信总线73用于实现这些组件之间的连接通信。通信总线73除包括数据总线之外,还包括电源总线、控制总线和状态信号总线。但是为了清楚说明起见,在图7中将各种总线都标为通信总线73。

本发明实施例提供了一种计算机存储介质,存储有可执行指令,当所述可执行指令被一个或多个处理器执行的时候,所述处理器执行实施例一所述的确定方法。

其中,计算机可读存储介质可以是磁性随机存取存储器(ferromagnetic randomaccess memory,FRAM)、只读存储器(Read Only Memory,ROM)、可编程只读存储器(Programmable Read-Only Memory,PROM)、可擦除可编程只读存储器(ErasableProgrammable Read-Only Memory,EPROM)、电可擦除可编程只读存储器(ElectricallyErasable Programmable Read-Only Memory,EEPROM)、快闪存储器(Flash Memory)、磁表面存储器、光盘、或只读光盘(Compact Disc Read-Only Memory,CD-ROM)等存储器。

本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用硬件实施例、软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器和光学存储器等)上实施的计算机程序产品的形式。

本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。

相关技术
  • 一种还款数据确定方法、装置、服务器及计算机存储介质
  • 一种数据存储方法、计算机可读存储介质及服务器
  • 一种实体关系图的确定方法、装置、服务器及存储介质
  • 一种美容方案确定方法、装置、服务器、用户终端、美容仪及存储介质
  • 一种加密数据共享方法、服务器及计算机可读存储介质
  • 一种推送内容的确定方法、服务器和计算机可读存储介质
  • 一种基线向量的确定方法、服务器和计算机存储介质
技术分类

06120115925806