- 浏览: 2148222 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (682)
- 软件思想 (7)
- Lucene(修真篇) (17)
- Lucene(仙界篇) (20)
- Lucene(神界篇) (11)
- Solr (48)
- Hadoop (77)
- Spark (38)
- Hbase (26)
- Hive (19)
- Pig (25)
- ELK (64)
- Zookeeper (12)
- JAVA (119)
- Linux (59)
- 多线程 (8)
- Nutch (5)
- JAVA EE (21)
- Oracle (7)
- Python (32)
- Xml (5)
- Gson (1)
- Cygwin (1)
- JavaScript (4)
- MySQL (9)
- Lucene/Solr(转) (5)
- 缓存 (2)
- Github/Git (1)
- 开源爬虫 (1)
- Hadoop运维 (7)
- shell命令 (9)
- 生活感悟 (42)
- shell编程 (23)
- Scala (11)
- MongoDB (3)
- docker (2)
- Nodejs (3)
- Neo4j (5)
- storm (3)
- opencv (1)
最新评论
-
qindongliang1922:
粟谷_sugu 写道不太理解“分词字段存储docvalue是没 ...
浅谈Lucene中的DocValues -
粟谷_sugu:
不太理解“分词字段存储docvalue是没有意义的”,这句话, ...
浅谈Lucene中的DocValues -
yin_bp:
高性能elasticsearch ORM开发库使用文档http ...
为什么说Elasticsearch搜索是近实时的? -
hackWang:
请问博主,有用solr做电商的搜索项目?
Solr中Group和Facet的用法 -
章司nana:
遇到的问题同楼上 为什么会返回null
Lucene4.3开发之第八步之渡劫初期(八)
在hadoop的编程中,如果你是手写MapReduce来处理一些数据,那么就避免不了输入输出参数路径的设定,hadoop里文件基类FileInputFormat提供了如下几种api来制定:
如上图,里面有
(1)addInputPath(),每次添加一个输入路径Path
(2)addInputPaths, 将多个路径以逗号分割的字符串,作为入参,支持多个路径
(3)setInputPath ,设置一个输入路径Path,会覆盖原来的路径
(4)setInputPath , 设置多个路径,支持Hadoop文件系统重写的Path对象,这在JAVA里是接口。
代码如下:
FileInputFormat.setInputDirRecursive(job, true);//设置可以递归读取目录 FileInputFormat.addInputPath(job, new Path("path1")); FileInputFormat.addInputPaths(job, "path1,path2,path3,path...."); FileInputFormat.setInputPaths(job, new Path("path1"),new Path("path2")); FileInputFormat.setInputPaths(job, "path1,path2,path3,path....");
而真正用的时候,我们只需要根据业务使用上面的其中一个路径即可。
ok知道怎么,传入路径了,下面来看下,如何在HDFS上过滤出,自己想要的文件或目录,HDFS系统的路径默认是支持正则过滤的,这一点非常强大,只要我们会写正则,我们几乎可以过滤任何我们想要的路径或文件。
详细内容请查阅这个链接http://hadoop.apache.org/docs/current/api/org/apache/hadoop/fs/FileSystem.html#globStatus(org.apache.hadoop.fs.Path)
下面散仙就举个实际项目应用中的例子,这样能帮助大家更好的理解和使用它。
先看下面的一个HDFS上的存储结构图:
这是一个按日期每天生成的一个文件夹,当然这里可以有很多分维度的法,比如按照年,月,日,小时,来划分,具体情况应跟业务结合考虑。
看下,直接的根目录的下一级目录:
ok,存储结构清楚了,那么现在提几个需求
(1)只过滤出pv目录下的数据
(2)只过滤出uv目录下的数据
(3)只过滤出keyword目录下的数据
(4)只过滤出pv和uv的数据或者叫以v结尾的数据
(5)过滤2015年的数据
(6)过滤出某个时间范围内的数据比如2015-04-10到2015-04-17时间范围下的pv的数据
其实前个需求很简单都是一种需求:
hadoop里的FileStatus类是支持路径通配的,对应的写法如下:
FileSystem fs = FileSystem.get(conf); // //过滤pv或uv的目录数据 // String basepath="/user/d1/DataFileShare/Search/*/*/{pv,uv}"; //过滤v结尾的目录数据 // String basepath="/user/d1/DataFileShare/Search//*/*/*v"; //过滤uv的数据 // String basepath="/user/d1/DataFileShare/Search//*/*/uv"; //过滤pv的数据 // String basepath="/user/d1/DataFileShare/Search//*/*/pv"; //过滤2015年的pv的数据 String basepath="/user/d1/DataFileShare/Search/2015*/*/pv"; //获取globStatus FileStatus[] status = fs.globStatus(new Path(basepath)); for(FileStatus f:status){ //打印全路径, System.out.println(f.getPath().toString()); //打印最后一级目录名 //System.out.println(f.getPath().getName()); }
最后一个复杂,直接使用正则,会比较繁琐,而且假如有一些其他的逻辑在里面会比较难控制,比如说你拿到这个日期,会从redis里面再次匹配,是否存在,然后在做某些决定。
hadoop在globStatus的方法里,提供了一个路径重载,根据PathFilter类,通过正则再次过滤出我们需要的文件即可,使用此类,我们可以以更灵活的方式,操作,过滤路径,比如说上面的那个日期范围的判断,我们就可以根据全路径中,截取出日期,再做一些判断,并且可以再次过滤低级的路径,比如是pv,uv或keyword的路径。
实例代码如下:
调用代码:
FileStatus[] status = fs.globStatus(new Path(basepath),new RegexExcludePathAndTimeFilter(rexp_date,rexp_business, "2015-04-04", "2015-04-06"));
处理代码:
/** * 实现PathFilter接口使用正则过滤 * 所需数据 * 加强版,按时间范围,路径过滤 * @author qindongliang * 大数据交流群:(1号群) 376932160 (2号群) 415886155 * * **/ static class RegexExcludePathAndTimeFilter implements PathFilter{ //日期的正则 private final String regex; //时间开始过滤 private final String start; //时间结束过滤 private final String end; //业务过滤 private final String regex_business; public RegexExcludePathAndTimeFilter(String regex,String regex_business,String start,String end) { this.regex=regex; this.start=start; this.end=end; this.regex_business=regex_business; } @Override public boolean accept(Path path) { String data[]=path.toString().split("/"); String date=data[7]; String business=data[9]; return Pattern.matches(regex_business, business)&&Pattern.matches(regex,date) && TimeTools.checkDate(start, end, date); } } /**日期比较的工具类**/ static class TimeTools{ final static String DATE_FORMAT="yyyy-MM-dd"; final static SimpleDateFormat sdf=new SimpleDateFormat(DATE_FORMAT); public static boolean cnull(String checkString){ if(checkString==null||checkString.equals("")){ return false; } return true; } /** * @param start 开始时间 * @param end 结束时间 * @param path 比较的日期路径 * **/ public static boolean checkDate(String start,String end,String path){ long startlong=0; long endlong=0; long pathlong=0; try{ if(cnull(start)){ startlong=sdf.parse(start).getTime(); } if(cnull(end)){ endlong=sdf.parse(end).getTime(); } if(cnull(path)){ pathlong=sdf.parse(path).getTime(); } //当end日期为空时,只取start+的日期 if(end==null||end.equals("")){ if(pathlong>=startlong){ return true; }else{ return false; } }else{//当end不为空时,取日期范围直接比较 //过滤在规定的日期范围之内 if(pathlong>=startlong&&pathlong<=endlong){ return true; }else{ return false; } } }catch(Exception e){ log.error("路径日期转换异常: 开始日期: "+start+" 结束日期 "+end+" 比较日期: "+path+" 异常: "+e); } return false; }
总结:
(1)如果只是简单的路径过滤,那么直接在路径中就使用正则通配是最简单强大的。
(2)如果是比较复杂的路径过滤,建议自定义PathFilter来封装过滤代码。
(3)如果是在建设初期的就把各个文件夹目录文件的存储规划好,这样是最好不过了,比如上面的pv是一个文件夹,然后下面是各个日期,uv是一个文件夹,然后下面是各种日期,这样从业务的角度就按维度切分好,那么我们处理起来也是非常方便的,这也就是Hive里面对应的分区功能,有了分区,我们就可以按需所取,尽量避免不必要的一些额外操作。
最后欢迎大家扫码关注微信公众号:我是攻城师,我们一起学习,进步和交流!(woshigcs)
本公众号的内容是有关搜索和大数据技术和互联网等方面内容的分享,也是一个温馨的技术互动交流的小家园,有什么问题随时都可以留言,欢迎大家来访!
发表评论
-
Apache Flink在阿里的使用(译)
2019-02-21 21:18 1059Flink是未来大数据实时 ... -
计算机图形处理的一些知识
2018-04-25 17:46 1190最近在搞opencv来做一些 ... -
如何在kylin中构建一个cube
2017-07-11 19:06 1208前面的文章介绍了Apache Kylin的安装及数据仓 ... -
Apache Kylin的入门安装
2017-06-27 21:27 2112Apache Kylin™是一个开源的分布式分析引擎,提供 ... -
ES-Hadoop插件介绍
2017-04-27 18:07 1947上篇文章,写了使用spark集成es框架,并向es写入数据,虽 ... -
如何在Scala中读取Hadoop集群上的gz压缩文件
2017-04-05 18:51 2090存在Hadoop集群上的文件,大部分都会经过压缩,如果是压缩 ... -
如何收集项目日志统一发送到kafka中?
2017-02-07 19:07 2749上一篇(http://qindongliang.iteye. ... -
Hue+Hive临时目录权限不够解决方案
2016-06-14 10:40 4641安装Hue后,可能会分配多个账户给一些业务部门操作hive,虽 ... -
Hadoop的8088页面失效问题
2016-03-31 11:21 4380前两天重启了测试的hadoop集群,今天访问集群的8088任 ... -
Hadoop+Hbase集群数据迁移问题
2016-03-23 21:00 2478数据迁移或备份是任何 ... -
如何监控你的Hadoop+Hbase集群?
2016-03-21 16:10 4834前言 监控hadoop的框架 ... -
Logstash与Kafka集成
2016-02-24 18:44 11508在ELKK的架构中,各个框架的角色分工如下: Elastic ... -
Kakfa集群搭建
2016-02-23 15:36 2592先来整体熟悉下Kafka的一些概念和架构 (一)什么是Ka ... -
大数据日志收集框架之Flume入门
2016-02-02 14:25 4147Flume是Cloudrea公司开源的一款优秀的日志收集框架 ... -
Apache Tez0.7编译笔记
2016-01-15 16:33 2430目前最新的Tez版本是0.8,但还不是稳定版,所以大家还 ... -
Bug死磕之hue集成的oozie+pig出现资源任务死锁问题
2016-01-14 15:52 3758这两天,打算给现有的 ... -
Hadoop2.7.1和Hbase0.98添加LZO压缩
2016-01-04 17:46 25521,执行命令安装一些依赖组件 yum install -y ... -
Hadoop2.7.1配置NameNode+ResourceManager高可用原理分析
2015-11-11 19:51 3129关于NameNode高可靠需要配置的文件有core-site ... -
设置Hadoop+Hbase集群pid文件存储位置
2015-10-20 13:40 2782有时候,我们对运行几 ... -
Hadoop+Maven项目打包异常
2015-08-11 19:36 1505先简单说下业务:有一个单独的模块,可以在远程下载Hadoop上 ...
相关推荐
8.Hadoop入门进阶课程_第8周_Hive介绍和安装部署.pdf p
hadoop初级学者
这次分享的是hadoop2.x、Hive、HBase进阶加强视频,视频的质量我不保证,因为我还没有完全看过,如果老师讲的不好,请不要喷我,谢谢
03-笔记-Linux基础·Zookeeper·Hadoop·Hive.pdf 03-讲义-Linux基础·Zookeeper·Hadoop·Hive.pdf 04-笔记-项目新零售.pdf 06-代码-Spark.pdf 06-笔记-Spark.pdf 06-讲义-Spark-源ppt.pdf ...
Hadoop入门进阶课程
Hadoop的学习路径
2.Hadoop入门进阶课程_第2周_Hadoop2.X64位编译.pdf 2.Hadoop入门进阶课程_第2周_Hadoop2.X64位编译.pdf
用Hadoop,还是不用Hadoop?(1).docx用Hadoop,还是不用Hadoop?(1).docx用Hadoop,还是不用Hadoop?(1).docx用Hadoop,还是不用Hadoop?(1).docx用Hadoop,还是不用Hadoop?(1).docx用Hadoop,还是不用Hadoop?(1).docx用...
用Hadoop,还是不用Hadoop?(1).pdf用Hadoop,还是不用Hadoop?(1).pdf用Hadoop,还是不用Hadoop?(1).pdf用Hadoop,还是不用Hadoop?(1).pdf用Hadoop,还是不用Hadoop?(1).pdf用Hadoop,还是不用Hadoop?(1).pdf用Hadoop...
11.Hadoop入门进阶课程_第11周_Sqoop介绍、安装与操作.pdf
5.Hadoop入门进阶课程_第5周_MapReduce原理及操作.pdf
4.Hadoop入门进阶课程_第4周_HDFS原理及操作.pdf 4.Hadoop入门进阶课程_第4周_HDFS原理及操作.pdf
6.Hadoop入门进阶课程_第6周_MapReduce应用案例.pdf 6.Hadoop入门进阶课程_第6周_MapReduce应用案例.pdf
12.Hadoop入门进阶课程_第12周_Flume介绍与安装.pdf i
hadoop streaming 进阶,很有用的
Hadoop的辉煌还能延续多久?
Hadoop_搭建进阶,多台机器分布式
1.Hadoop入门进阶课程_第1周_Hadoop1.X伪分布式安装.pdf
与 Hadoop 对比,如何看待 Spark 技术? - 知乎1
9.Hadoop入门进阶课程_第9周_Mahout介绍、安装与应用案例.pdf