- 浏览: 2182536 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (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 1171Flink是未来大数据实时 ... -
计算机图形处理的一些知识
2018-04-25 17:46 1227最近在搞opencv来做一些 ... -
如何在kylin中构建一个cube
2017-07-11 19:06 1264前面的文章介绍了Apache Kylin的安装及数据仓 ... -
Apache Kylin的入门安装
2017-06-27 21:27 2142Apache Kylin™是一个开源的分布式分析引擎,提供 ... -
ES-Hadoop插件介绍
2017-04-27 18:07 1990上篇文章,写了使用spark集成es框架,并向es写入数据,虽 ... -
如何在Scala中读取Hadoop集群上的gz压缩文件
2017-04-05 18:51 2128存在Hadoop集群上的文件,大部分都会经过压缩,如果是压缩 ... -
如何收集项目日志统一发送到kafka中?
2017-02-07 19:07 2790上一篇(http://qindongliang.iteye. ... -
Hue+Hive临时目录权限不够解决方案
2016-06-14 10:40 4700安装Hue后,可能会分配多个账户给一些业务部门操作hive,虽 ... -
Hadoop的8088页面失效问题
2016-03-31 11:21 4447前两天重启了测试的hadoop集群,今天访问集群的8088任 ... -
Hadoop+Hbase集群数据迁移问题
2016-03-23 21:00 2522数据迁移或备份是任何 ... -
如何监控你的Hadoop+Hbase集群?
2016-03-21 16:10 4917前言 监控hadoop的框架 ... -
Logstash与Kafka集成
2016-02-24 18:44 11620在ELKK的架构中,各个框架的角色分工如下: Elastic ... -
Kakfa集群搭建
2016-02-23 15:36 2644先来整体熟悉下Kafka的一些概念和架构 (一)什么是Ka ... -
大数据日志收集框架之Flume入门
2016-02-02 14:25 4185Flume是Cloudrea公司开源的一款优秀的日志收集框架 ... -
Apache Tez0.7编译笔记
2016-01-15 16:33 2520目前最新的Tez版本是0.8,但还不是稳定版,所以大家还 ... -
Bug死磕之hue集成的oozie+pig出现资源任务死锁问题
2016-01-14 15:52 3830这两天,打算给现有的 ... -
Hadoop2.7.1和Hbase0.98添加LZO压缩
2016-01-04 17:46 26021,执行命令安装一些依赖组件 yum install -y ... -
Hadoop2.7.1配置NameNode+ResourceManager高可用原理分析
2015-11-11 19:51 3176关于NameNode高可靠需要配置的文件有core-site ... -
设置Hadoop+Hbase集群pid文件存储位置
2015-10-20 13:40 2847有时候,我们对运行几 ... -
Hadoop+Maven项目打包异常
2015-08-11 19:36 1561先简单说下业务:有一个单独的模块,可以在远程下载Hadoop上 ...
相关推荐
根据提供的文件信息,以下是有关Hadoop入门进阶课程中Hive介绍和安装部署的知识点: 1. Hive介绍: - Hive是Facebook开发的数据仓库工具,运行于Hadoop集群之上。 - 提供类SQL的HQL(Hive Query Language)查询...
在IT行业中,大数据处理是不可或...对Hadoop初级学者来说,理解这些概念和实践操作是迈进Hadoop高手之路的重要一步。通过搭建和配置HA集群,不仅能增强对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开发者和大数据分析师。通过深入学习和实践,你可以掌握处理大规模数据的技能,为在大数据领域...
Hadoop的学习路径
2.Hadoop入门进阶课程_第2周_Hadoop2.X64位编译.pdf 2.Hadoop入门进阶课程_第2周_Hadoop2.X64位编译.pdf
标题中的"hadoop/bin/hadoop.dll"指出这是一款与Hadoop框架相关的动态链接库(DLL)文件,它位于Hadoop安装目录的"bin"子目录下。在Windows操作系统中,DLL文件是程序运行所必需的组件,它们包含了可执行文件在运行...
相比之下,Hadoop的批量处理模式在数据量增长时,分析时间会相应增加,这在追求实时性的今天显得有些滞后。 此外,谷歌的Dremel系统在即时数据分析方面展现出强大的能力。Dremel能够在几秒钟内处理PB级别的数据,极...
### Hadoop入门进阶课程之Mahout介绍、安装与应用案例 #### Mahout概述 Mahout作为Apache Software Foundation(ASF)旗下的一个开源项目,致力于提供一系列可扩展的机器学习算法实现,以帮助开发者更轻松地构建...
Hadoop是一个流行的开源框架,允许分布在商业硬件上的分布式存储和计算。Hadoop的核心部分是HDFS(Hadoop ...此外,通过Hadoop入门进阶课程的实践,可以更深入地理解和掌握HDFS的操作以及Hadoop整个生态系统的应用。
Hadoop圣经 Hadoop权威指南第四版 最新配套代码 Hadoop权威指南第四版 最新配套代码
### Hadoop入门进阶课程之Pig介绍、安装与应用案例 #### 一、课程概述 根据提供的文档信息,这是一门关于Hadoop生态系统的入门级课程中的第七周内容,主要介绍了Pig这一工具的基本概念、安装过程以及如何通过Pig...
Hadoop是一个由Apache基金会开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序,充分利用集群的威力进行高速运算和存储。它有以下几个核心组成部分: 1. Hadoop Common:包含...
### Hadoop 1.X 伪分布式安装知识点概览 #### 1. Hadoop 简介 - **定义**: Apache Hadoop 是一个开源框架,它允许开发者通过简单的编程模型来处理大量的数据集,并且能够在集群服务器上进行分布式处理。 - **特点**...
再说一点,Hadoop现在人才已经非常多了,想在该技术领域做到中国前100人之内是非常有难度的,而如果从事Spark则会更容易些,因为现在Spark人才不是稀少,而是太稀缺。 Hadoop从业者们,您需要Spark。
Hadoop是一个分布式系统基础架构,由Apache基金会开发,它实现了MapReduce编程模型,用于大规模数据集的存储与计算。MapReduce是一种编程模型,用于处理和生成大数据集,它将任务分成两个阶段:Map阶段和Reduce阶段...