本发明涉及大数据处理的技术领域,尤其涉及一种基于业务的全局id生成方法,以及基于业务的全局id生成系统。
背景技术:
现有技术方案大多采用时间戳+随机数的生成方式。时间戳一般是取系统当前的13位毫秒时间戳,随机数则是根据系统内置的随机数生成函数,并经过一定的处理,返回一个固定位数的数字串,拼接起来作为整个id。
现有方案在单机执行的时候,是没什么问题的,但是在分布式系统中,由于是并行操作,在同一毫秒,多台机器都会执行相同指令,从而导致出现重复id的状况,经过测试,40亿左右的数量级,会产生1万个左右的重复id,重复率约为40万分之一。
技术实现要素:
为克服现有技术的缺陷,本发明要解决的技术问题是提供了一种基于业务的全局id生成方法,其能够使生成的id是唯一的,而且有了业务意义,让数据分析师根据id就可以得到很多重要信息,避免了很多例如join之类的其他多余操作,提升了数据分析效率。
本发明的技术方案是:这种基于业务的全局id生成方法,该方法包括以下步骤:
(1)对业务数据进行数字编码,并把生成的字典文件存储到hadoop集群;
(2)实时获取运营商数据,并写到hadoop集群;
(3)配置调度任务,定期执行程序,解析运营商数据,并生成id,导入数据仓库。
本发明通过把分布式系统中的机器id和计数器加入参数中,完美的确定了唯一性,并对业务数据进行编码,作为生成id的子串,从而能够使生成的id是唯一的,而且有了业务意义,让数据分析师根据id就可以得到很多重要信息,避免了很多例如join之类的其他多余操作,提升了数据分析效率。
还提供了一种基于业务的全局id生成系统,该系统包括:
业务编码模块,其配置来对业务数据进行数字编码,并把生成的字典文件存储到hadoop集群;
运营商数据获取模块,其配置来实时获取运营商数据,并写到hadoop集群;
id生成模块,其配置来配置调度任务,定期执行程序,解析运营商数据,并生成id,导入数据仓库。
附图说明
图1所示为根据本发明的基于业务的全局id生成方法的流程图。
具体实施方式
如图1所示,这种基于业务的全局id生成方法,该方法包括以下步骤:
(1)对业务数据进行数字编码,并把生成的字典文件存储到hadoop集群;
(2)实时获取运营商数据,并写到hadoop集群;
(3)配置调度任务,定期执行程序,解析运营商数据,并生成id,导入数据仓库。
本发明通过把分布式系统中的机器id和计数器加入参数中,完美的确定了唯一性,并对业务数据进行编码,作为生成id的子串,从而能够使生成的id是唯一的,而且有了业务意义,让数据分析师根据id就可以得到很多重要信息,避免了很多例如join之类的其他多余操作,提升了数据分析效率。
另外,所述步骤(1)中,对用户最关心的账号类型、运营商和省份数据,进行了数字编码。
另外,所述步骤(1)中,数字编码采用2位十进制数字表示,账号类型、运营商和省份数据相互独立,分别编码。
生成id的程序是基于mapreduce框架实现的。mapreduce运行时,会调用集群中的多台机器并行执行,其中每个机器会有一个taskid,不同机器taskid不同,这里我们便利用了这个特性。另外每个机器处理数据的过程中,会有一个计数器,即counter,程序每处理一条数据,计数器执行加一操作。
另外,所述步骤(3)中,id的组成为:时间戳加上计数器加上机器节点id再加上业务编码。这样既可以完全保证生成id的唯一性,而且id包含了重要的业务信息,方便后续的数据分析需求。
另外,所述步骤(3)中,从运营商数据解析出uid、运营商、省份、账号类型,判断相应的uid是否已经生成过id,是则跳过,否则获取当前的13位时间戳和当前机器节点的id;然后对运营商、省份、账号类型根据字典文件按顺序进行相应的编码转换,生成一个数字组成的字符串,并对计数器加一,如果计数器超过阈值(阈值可以为9999,也可根据实际自行调整),则计数器归零,如此往复。
本领域普通技术人员可以理解,实现上述实施例方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,所述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,包括上述实施例方法的各步骤,而所述的存储介质可以是:rom/ram、磁碟、光盘、存储卡等。因此,与本发明的方法相对应的,本发明还同时包括一种基于业务的全局id生成系统,该系统通常以与方法各步骤相对应的功能模块的形式表示。使用该方法的系统包括:
业务编码模块,其配置来对业务数据进行数字编码,并把生成的字典文件存储到hadoop集群;
运营商数据获取模块,其配置来实时获取运营商数据,并写到hadoop集群;
id生成模块,其配置来配置调度任务,定期执行程序,解析运营商数据,并生成id,导入数据仓库。
另外,所述业务编码模块中,对用户最关心的账号类型、运营商和省份数据,进行了数字编码。
另外,所述业务编码模块中,数字编码采用2位十进制数字表示,账号类型、运营商和省份数据相互独立,分别编码。
另外,所述id生成模块中,id的组成为:时间戳加上计数器加上机器节点id再加上业务编码。
另外,所述id生成模块中,从运营商数据解析出uid、运营商、省份、账号类型,判断相应的uid是否已经生成过id,是则跳过,否则获取当前的13位时间戳和当前机器节点的id;然后对运营商、省份、账号类型根据字典文件按顺序进行相应的编码转换,生成一个数字组成的字符串,并对计数器加一,如果计数器超过阈值,则计数器归零,如此往复。
本发明的有益效果如下:
1.可以确保id的全局唯一性;
2.业务数据加入id,提高的数据存储的资源利用率,减少了数据解析的环节和时间成本。
以上所述,仅是本发明的较佳实施例,并非对本发明作任何形式上的限制,凡是依据本发明的技术实质对以上实施例所作的任何简单修改、等同变化与修饰,均仍属本发明技术方案的保护范围。