`
david.org
  • 浏览: 157162 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

关于MapReduce解析XML算法的一点构思

阅读更多

 

没想到Hadoop在解析XML时如此纠结,以至于新版apimapreduce竟然放弃了XML格式的format以及reader,在老版(hadoop-0.19.*)的streaming模块提供了这样的api,由于我用的hadoop-0.20.2 3U1版本,因此需要把处理XML的几个类移植过来使用。

 

移植所带来的问题是各处依赖包,和各种api不兼容。没关系,我可以看一下源码,然后自己写一个。细看了一下reader的代码,发现mapreduce使用了BufferedInputStreammarkreset来寻找XMLtag,这个tag就是我们在提交作业所设置的,比如<log></log>这样的标签。Javastream流的markreset,允许指针回读,即在找到<log>时,mark一下指针,然后再找到</log>标签,最后通过reset方法,返回到mark的位置,把<log></log>内的数据读取出来。但在匹配的过程中,我发现mapred使用了BufferedInputStream read(); 方法,该方法返回下一个可读的字节。那么整个处理过程就是读一个字节,比较一个字节,我没有在mapreduce中用这样的算法,但我测试过,向缓冲区(BufferedInputStream)中一个字节一个字节的读,性能严重不足,read(); 方法平均返回时间在331纳秒,处理一个170Mxml文档(tag比较多),竟然花了200+秒。streaming模块还写了一个faster*方法,哎,慢死了)

 

周敏同学提供了pig中处理xml的reader,但pig那边的代码我还没细看,也不知道hadoop的jira中有没有新的feature来解决现有xml的问题。如果有的话,不防可以告诉我一下下。呵呵。 

 

现在有一个构思,即主要思想仍然围绕字节比较,因为字符串匹配效率更低,另外算法源于String.indexOf(“”),即找到<log>这个后,记住位置,然后再找</log>,这样算完全匹配,中间的内容用system.arraycopy来复制到新的字节数组,目前这算法我实现了一半,即找到<log></log>后,把这两个签标全部替换掉,170M文档,用时2.2秒(最快1.3秒)。

 

算法及问题:

首先提供一个BufferedInputStream,默认大小8k,在程序中建一个字节数组,大小为4k,即每次向BufferedInputStream4k,这个效率是很不错的,然后去寻找<log>.toArray这样的字节数组,这一步速度是很惊人的。但这里有一个小的问题,即每次读4k的大小去处理,那很有可能<log></log>位于两次读取的一尾一头,那么我的想法是做一个半循环的字节数组,即如果在4k的字节数组中的最后找到<log>,那么就把前面未匹配的仍掉,然后把<log>标签移到字节数组最前端,然后另用这个字节数组再向BufferedInputStream中去读4k-5长度的内容(5<log>的字节长度)。关于4k这个大小,首先要对XML数据进行sampling,即确定<log></log>当中的内容长度,然后再定这个缓冲buf的大小。

 

分享到:
评论
2 楼 david.org 2012-05-27  
lookqlp 写道
牛人 有没有好的xml解析办法了?我这边也遇到了这麻烦


目前XML可谓是map/reduce的天敌,你可以参考一下Pig的做法。
1 楼 lookqlp 2012-03-27  
牛人 有没有好的xml解析办法了?我这边也遇到了这麻烦

相关推荐

    基于MapReduce的Apriori算法代码

    基于MapReduce的Apriori算法代码 基于MapReduce的Apriori算法代码是一个使用Hadoop MapReduce框架实现的关联规则挖掘算法,称为Apriori算法。Apriori算法是一种经典的关联规则挖掘算法,用于发现事务数据库中频繁...

    基于MapReduce实现决策树算法

    基于MapReduce实现决策树算法的知识点 基于MapReduce实现决策树算法是一种使用MapReduce框架来实现决策树算法的方法。在这个方法中,主要使用Mapper和Reducer来实现决策树算法的计算。下面是基于MapReduce实现决策...

    用MapReduce实现KMeans算法

    此时,结合MapReduce框架可以在分布式环境中高效地执行KMeans算法。以下将详细阐述如何用MapReduce实现KMeans算法以及涉及的关键步骤。 1. **数据预处理**: 在HDFS(Hadoop Distributed File System)上存储数据...

    基于MapReduce的图算法

    基于MapReduce的图算法

    基于MapReduce的Apriori算法

    标题中的“基于MapReduce的Apriori算法”直接指出了文章研究的核心内容,即针对传统Apriori算法的局限性,提出一种并行化解决方案。Apriori算法是一种经典的关联规则挖掘算法,它的原理是通过设置最小支持度和最小...

    基于mapreduce的聚类算法研究

    基于MapReduce的聚类算法研究 MapReduce是一种分布式计算模型,基于Hadoop的云计算环境下,可以实现高效的数据处理和分析。本研究主要聚焦于基于MapReduce的聚类算法研究,旨在实现高效的聚类算法在Hadoop集群上...

    基于MapReduce的Apriori算法代码及其使用

    ### 基于MapReduce的Apriori算法代码及其使用 #### 一、Apriori算法简介 Apriori算法是一种用于频繁项集挖掘的经典算法,主要用于关联规则学习。其核心思想是通过候选生成和剪枝策略来寻找数据集中所有频繁出现的...

    云计算MapReduce实现KNN算法

    云计算MapReduce实现KNN算法,使用环境:在vmware虚拟机上安装unbuntu14系统,系统中安装hadoop。文件中包含有MapReduce以及KNN的java代码、包含训练数据的excel表格以及详细的教程文档,文档中手把手教到如何使用...

    基于机器学习的MapReduce资源调度算法.pdf

    "基于机器学习的MapReduce资源调度算法" 摘要:本文介绍了一种基于机器学习的MapReduce资源调度算法,旨在提高MapReduce集群的资源利用率和作业执行效率。该算法通过机器学习模型来预测作业的资源需求,动态地分配...

    基于MapReduce的商品推荐算法.zip

    《基于MapReduce的商品推荐算法详解》 在大数据时代,如何有效地利用海量用户行为数据,为用户提供个性化推荐,已经成为电商、社交媒体等领域的核心竞争力之一。基于MapReduce的商品推荐算法,正是解决这一问题的...

    MapReduce实现二度好友推荐算法

    在IT领域,尤其是在大数据处理和社交网络分析中,"MapReduce实现二度好友推荐算法"是一种常见的技术应用。MapReduce是Google提出的一种分布式计算模型,主要用于处理和生成大规模数据集。在这个场景下,我们利用...

    mapreduce解析网络日志文件(或从mysql数据库获取记录)并计算相邻日志记录间隔时长

    本话题主要探讨如何利用MapReduce解析网络日志文件,或者从MySQL数据库中获取记录,并计算相邻日志记录之间的间隔时长。这涉及到多个技术点,包括日志文件的处理、MapReduce的工作原理以及与关系型数据库如MySQL的...

    MapReduce下的Dijkstra并行算法研究.pdf

    本文主要探讨的是在MapReduce框架下,如何实现Dijkstra算法的并行化,以高效地解决大规模图中的最短路径问题。 Dijkstra算法是一种经典的单源最短路径算法,广泛应用于网络路由、图形理论等领域。其基本思想是从源...

    KNN分类算法的MapReduce并行化实现1

    《KNN分类算法的MapReduce并行化实现》 KNN(K-Nearest Neighbor)算法是一种基于实例的学习方法,广泛应用于数据挖掘和机器学习领域,尤其在分类问题上表现出色。然而,随着大数据时代的到来,传统的单机版KNN算法...

Global site tag (gtag.js) - Google Analytics