hadoop input文件路径匹配

来源:互联网 发布:java导出excel的方法 编辑:程序博客网 时间:2024/05/29 03:04

一、最近在搞hadoop大数据计算,hdfs文件目录结构是xxxx/yyyy/MM/dd/xxxxHH.log,说白了就是每小时生成一个文件,生成的文件放在相应年月日目录中。有相关程序会定时把  文件传到hdfs相应目录,具体过程就不在此赘述了。

二、其中有一个业务场景是要定时计算每月的数据(每天计算一次),那么怎么从海量日志目录结构中定位到目前为止 的 目录呢?

三、首先想到的是hdfs目录通配,假如今天是月末,那很好解决,目录直接定位到是xxxx/yyyy/MM/*,这样就解决了,很不好意思,这只是一个特殊情况,很容出现跨月,跨年这这些情况,现在说下跨月的情况,今天是2014年12月10号,按照业务需求是就要计算2014年11月11日到今天的数据。跨年呢,假如今天是2015年1月10日,按照业务规则就要算2014年12月11日到今天的数据。说到这里hdfs目录匹配貌似没那么容易做到,我没找到好的匹配方法,大神们如果有好的方法,欢迎不吝赐教,在此谢过了微笑。hdfs目录匹配不好做到,只能另辟蹊径。动态拼hdfs目录路径,也就是说每次进行mapreduce计算时先动态计算出来hdfs input目录路径。

       1、 第一个思路就是java正则表达式,^xxxx/(yyyy/MM/dd)?(yyyy/MM/dd)?(yyyy/MM/dd)?(yyyy/MM/dd)?/xxx.*$,先算出需要计算那些天的数据,以xxxx开头,xxx结尾,只要在表达式内拉出来计算,经测试,该匹配的匹配出来了,不改匹配出来的没匹配出来,貌似问题解决了,不好意思,这样的正则表达式hadoop不认,碰了一鼻子灰,这个方案行不通。

       2、再说第二个思路,使用FileInputFormat的setInputPaths方法,其接受两个参数,第一个参数是JobConf,第二个参数是Path数组,看到第二个参数,相信大家也会眼前一亮,为何不直接拼出符合条件path路径呢,先直接一个一个拼出要计算的目录路径,然后封装成Path对象,到此问题解决!

       3、记录下问题解决的历程,希望能帮到被此问题困扰的coder...

       4、实现代码很简单,就是字符串拼接,就不贴出来了

0 0
原创粉丝点击