Python3 模拟MapReduce处理分析大数据文件——《Python宝典》

最近买了一本《Python宝典》在看,此书所讲Python知识的广度明显,但是深度略显不足,所以比较适合入门及提高级的读者来看。其中对于Python大数据处理一章的内容比较有兴趣,看明白了以后,我根据书上提供的案例对源代码进行了修改,也实现了模拟MapReduce的过程。

目标:从Apache的用户访问日志access.log中统计出页面资源的访问量。我们假设这个文件体积十分巨大。

access中的信息结构:66.249.68.43 - - [04/Aug/2011:01:06:48 +0800] "GET /某页面地址 HTTP/1.1" 200 4100

含义:66.249.68.43 来源ip, [04/Aug/2011:01:06:48 +0800] 日期时间,"GET /某页面地址 HTTP/1.1" 来源方式,200 返回状态,4100 返回字节数

步骤:1、将大文件切割成多个小文件;2、计算每个小文件中的页面访问次数(map过程),每一个小文件对应一个计算结果文件;3、将每个小文件中的计算结果文件进行合并累加,统计出最终的页面资源访问量,结果保存到reduceResult.txt中。

文件结构:

其中,access.log是原始的日志文件,smallFiles中保存分割后的一组小文件,mapFiles中存入每个小文件对应的处理结果文件,reduceResult.txt保存最终的处理结果。

以下是源码:

'''
Created on 2014-12-19

@author: guoxiyue
@file:0fileSplit.py
@function:文件分割
'''
import os,os.path,time;
sourceFile=open('files/access.log','r',encoding='utf8'); #打开原始大文件
targetDir='files/smallFiles'; # 设置小文件的保存目录
smallFileSize=30; #设置每个小文件中的记录条数
tempList=[]; #临时列表,用于暂存小文件中的记录内容
fileNum=1; # 小文件序号
readLine=sourceFile.readline(); #先读一行
while(readLine): #循环
    lineNum=1
    while(lineNum<=smallFileSize): #控制每个小文件的记录条数不超过设定值
        tempList.append(readLine); #将当前行的读取结果保存到临时列表中
        readLine=sourceFile.readline(); #再读下一行
        lineNum+=1;# 行号自增
        if not readLine:break;#如果读到空,则说明大文件读完,退出内层循环
    tempFile=open('files/smallFiles/access_'+str(fileNum)+'.txt','w',encoding='utf8');#将读取到的30条记录保存到文件中
    tempFile.writelines(tempList);
    tempFile.close();
    tempList=[];#清空临时列表
    print('files/smallFiles/access_'+str(fileNum)+'.txt  创建于 '+str(time.asctime()));
    fileNum+=1; #文件序号自增
sourceFile.close();
'''
Created on 2014-12-19

@author: guoxiyue
@file:1map.py
@function:map过程,分别计算每一个小文件中的页面资源访问量
'''
import os,os.path,re,time;

sourceFileList=os.listdir('files/smallFiles/'); #获取所有小文件文件名列表
targetDir="files/mapFiles/"; #设置处理结果保存目录
for eachFile in sourceFileList: #遍历小文件
    currentFile=open('files/smallFiles/'+eachFile,'r',encoding='utf8'); #打开小文件
    currentLine=currentFile.readline(); #先读一行
    tempDict={}; #临时字典
    while(currentLine):
        p_re=re.compile("(GET|POST)\s(.*?)\sHTTP", re.IGNORECASE); #用正则表达式来提取访问资源
        match=p_re.findall(currentLine); #从当前行中提取出访问资源
        if(match):
            url=match[0][1]; #提出资源页面
            if url in tempDict: #获取当前资源的访问次数,并添加到字典中
                tempDict[url]+=1;
            else:
                tempDict[url]=1;
        currentLine=currentFile.readline(); #再读下一行
    currentFile.close();

    #以下是将当前小文件的统计结果排序并保存
    tList=[];
    for key,value in sorted(tempDict.items(),key=lambda data:data[0],reverse=True):
        tList.append(key+' '+str(value));
        tList.append('\n')
    tempFile=open(targetDir+eachFile,'a',encoding='utf8');
    tempFile.writelines(tList);
    tempFile.close()
    print(targetDir+eachFile+'.txt  创建于 '+str(time.asctime()));
    
'''
Created on 2014-12-19

@author: guoxiyue
@file:2reduce.py
@function:reduce过程,汇总最终的页面资源访问量
'''
import os,os.path,re,time;
sourceFileList=os.listdir('files/mapFiles/'); #获取小文件的map结果文件名列表
targetFile='files/reduceResult.txt'; # 设置最终结果保存文件
tempDict={}; #临时字典
p_re=re.compile('(.*?)(\d{1,}$)', re.IGNORECASE); #利用正则表达式抽取资源访问次数
for eachFile in sourceFileList:#遍历map文件
    currentFile=open('files/mapFiles/'+eachFile,'r',encoding='utf8'); #打开当前文件
    currentLine=currentFile.readline(); #读一行
    while(currentLine):
        subData=p_re.findall(currentLine) #提取出当前行中资源的访问次数
        if(subData[0][0] in tempDict): #将结果累加
            tempDict[subData[0][0]]+=int(subData[0][1]);
        else:
            tempDict[subData[0][0]]=int(subData[0][1]);
        currentLine=currentFile.readline();#再读一行
    currentFile.close();

 #以下是将所有map文件的统计结果排序并保存
tList=[];
for key,value in sorted(tempDict.items(),key=lambda data:data[1],reverse=True):
    tList.append(key+' '+str(value));
    tList.append('\n')
tempFile=open(targetFile,'a',encoding='utf8');
tempFile.writelines(tList);
tempFile.close()
print(targetFile+'   创建于 '+str(time.asctime()));
时间: 2024-08-28 04:16:23

Python3 模拟MapReduce处理分析大数据文件——《Python宝典》的相关文章

Spark大型项目实战:电商用户行为分析大数据平台

本项目主要讲解了一套应用于互联网电商企业中,使用Java.Spark等技术开发的大数据统计分析平台,对电商网站的各种用户行为(访问行为.页面跳转行为.购物行为.广告点击行为等)进行复杂的分析.用统计分析出来的数据,辅助公司中的PM(产品经理).数据分析师以及管理人员分析现有产品的情况,并根据用户行为分析结果持续改进产品的设计,以及调整公司的战略和业务.最终达到用大数据技术来帮助提升公司的业绩.营业额以及市场占有率的目标. 1.课程研发环境 开发工具: Eclipse Linux:CentOS 6

中华石杉 Spark大型项目实战:电商用户行为分析大数据平台138讲视频教程(项目实战)

38套大数据,云计算,架构,数据分析师,Hadoop,Spark,Storm,Kafka,人工智能,机器学习,深度学习,项目实战视频教程 视频课程包含: 38套大数据和人工智能精品高级课包含:大数据,云计算,架构,数据挖掘实战,实时推荐系统实战,电视收视率项目实战,实时流统计项目实战,离线电商分析项目实战,Spark大型项目实战用户分析,智能客户系统项目实战,Linux基础,Hadoop,Spark,Storm,Docker,Mapreduce,Kafka,Flume,OpenStack,Hiv

大数据文件处理

在处理大数据文件时,利用"生产者-消费者"线程模型进行处理,代码实现如下: /** * 文件处理类 * */ public class FileProcessor { /**读取文件的路径*/ private String path = ""; /**指定默认工作队列的大小*/ public static final int MAXWORKQUEUESIZE = 2 << 12; /**工作线程队列*/ private BlockingQueue<

Spark应用开发之一:Hadoop分析大数据

要学会和使用一门技术的时候,首先要弄清楚该技术出现的背景和要解决的问题.要说spark首先要了解海量数据的处理和Hadoop技术. 一个系统在运行的过程中都会产生许多的日志数据,这些日志数据包含但不局限我们平常开发中使用log4j或者logback生成的记录系统运行情况的日志.例如对于网络服务提供商,他们的设备可能会记录着用户上下线时间,访问的网页地址,响应时长等数据,这些数据文件里面记录的某些信息经过抽取分析后可以得出许多的指标信息,从而为改善网络结构和提高服务等提供数据依据.但这些数据会很大

Twitter数据挖掘:如何使用Python分析大数据 (3)

让我们来拉取Twitter账号@NyTimes的最近20条微博. 我们可以创建变量来存放待拉取的微博数量(即count),以及待拉取的用户(即name).然后用这两个参数调用user_timeline()函数.下面是更新后的代码(注意,在代码的顶部应该保持认证和API对象的创建). # 传入认证信息,并创建API对象 api = tweepy.API(auth) # 待拉取微博的用户 name = "nytimes" # 待拉取的微博数量 tweetCount = 20 # 使用上面的

phpmyadmin导入导出大数据文件的办法

在phpmyadmin的使用中,经常需要进行导入导出数据库的操作. 但是在导入导出大型数据库文件的时候经常会只是部分导出或者部分导入. 或者是导入导出不成功. 原因就是服务器和php.mysql限制了导出导入数据库文件的大小.而改相应的配置又十分繁琐,所以这里提供一个绕过导出导入有大小限制的办法. 这个思路就是直接在服务器上面进行导出导入.过程如下 将phpMyAdmin/config.sample.inc.php 文件改名为phpMyAdmin/config.inc.php并打开编辑 * Di

Twitter数据挖掘:如何使用Python分析大数据

我们可以创建变量来存放待拉取的微博数量(即count),以及待拉取的用户(即name).然后用这两个参数调用user_timeline()函数.下面是更新后的代码(注意,在代码的顶部应该保持认证和API对象的创建). # 传入认证信息,并创建API对象 api = tweepy.API(auth) # 待拉取微博的用户 name = "nytimes" # 待拉取的微博数量 tweetCount = 20 # 使用上面的参数,调用user_timeline函数 results = ap

阿里云Mysql导入大数据文件

1.查询数据到CSV文件 select * from account into outfile '/root/account.csv' fields terminated by ',' enclosed by '"' lines terminated by '\r\n' 注意:可通过终端方式查询或者服务器上连接数据查询所得. 2.将大文件数据(SQL)导入到服务器 scp -P 端口号 -i 私钥绝对路径地址 数据存放的绝对路径 [email protected]:/tmp/ 3.导入数据 lo

案例分析:大数据平台技术方案及案例(ppt)

大数据平台是为了计算,现今社会所产生的越来越大的数据量,以存储.运算.展现作为目的的平台.大数据技术是指从各种各样类型的数据中,快速获得有价值信息的能力.适用于大数据的技术,包括大规模并行处理(MPP)数据库,数据挖掘电网,分布式文件系统,分布式数据库,云计算平台,互联网,和可扩展的存储系统. ————————————————————— 免责声明:我们致力于保护作者版权,部分内容源于网络公开内容或圈友所提供,无法核实原始出处,如涉及侵权,请直接联系我们删除,抄袭本文至其它微信号者引发的一切纠纷与