`
edr_
  • 浏览: 169814 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

笔试题:海量日志中提取访问次数前100的IP

阅读更多
大数据时代是一个信息量爆炸的时代,利用数据分析将会产生不可估量的价值,基金,证券,电商以及现在越来越火的O2O。当然作为一个热点,企业的笔试与面试中当然少不了关于大数据的问题。

今天就写写之前的一道笔试题:每个用户访问,系统都会记录用户的IP到日志中,一个小时产生1G的日志文件,请分析日志文件获取当天访问次数前100的IP(大概是这样)。

由于IP是32位的,最多有个2^32个IP,也就是4G,所以不能完全加载到内存中处理;可以采用映射的方法,按照IP地址的Hash(IP)%1024值,把整个大文件映射为1024个小文件,再依次分析每个小文中出现频率最大的前100个IP及相应的频率,因为涉及到排序,所以使用到了TreeSet。
画图应该好理解一点:

具体代码如下:
package test.bigdata;
import java.io.*;
import java.security.SecureRandom;
import java.util.*;
public class LogAnalysis {
	//保存每个文件的流对象
	public final Map<Integer,BufferedWriter> bwMap = new HashMap<Integer,BufferedWriter>();
	//分隔文件用-存储相当数量之后再存入某个文件
	public final Map<Integer,List<String>> dataMap = new HashMap<Integer,List<String>>();
	//存储访问次数前100的IP
	public Set<IP> set = new TreeSet<IP>();
	
	// 生成日志文件
	public void creatLog(File log,long logNums) throws Exception{
		FileWriter fw = new FileWriter(log,true);
		BufferedWriter bw = new BufferedWriter(fw);
		SecureRandom random = new SecureRandom();
		for (int i = 0; i < logNums; i++) {
			bw.write("192."+random.nextInt(255)+"."+random.nextInt(255)+"."+random.nextInt(255)+"\n");
			if((i+1) % 1000 == 0){
				bw.flush();
			}
		}
		bw.flush();
		fw.close();
		bw.close();
	}
	
	// 分割日志文件
	public void splitLog(File logflie,int fileNums) throws Exception{
		FileReader fr = new FileReader(logflie);
		BufferedReader br =new BufferedReader(fr);
		String ip = br.readLine();
		//先创建文件及流对象方便使用
		for(int i=0;i<fileNums;i++){
			File file = new File("D:\\javasoft\\TempTest\\BigData\\logSplit\\"+ i + ".txt");
			bwMap.put(i, new BufferedWriter(new FileWriter(file,true)));
			dataMap.put(i, new LinkedList<String>());
		}
		while(ip != null){
			int hashCode = ip.hashCode();
			hashCode = hashCode < 0 ? -hashCode : hashCode;
			int fileNum = hashCode % fileNums;
			List<String> list = dataMap.get(fileNum);
			list.add(ip + "\n");
			if(list.size() % 1000 == 0){
				BufferedWriter writer = bwMap.get(fileNum);
				for(String line : list){
					writer.write(line);
				}
				writer.flush();
				list.clear();
			}
			ip = br.readLine();
		}
		for(int fn : bwMap.keySet()){
			List<String> list = dataMap.get(fn);
			BufferedWriter writer = bwMap.get(fn);
			for(String line : list){
				writer.write(line);
			}
			list.clear();
			writer.flush();
			writer.close();
		}
		bwMap.clear();
		fr.close();
		br.close();
	}
	
	//分析统计,找出次数前100的IP
	public void analysis(File logSplit) throws Exception{
		FileReader fr = new FileReader(logSplit);
		BufferedReader br =new BufferedReader(fr);
		String ip = br.readLine();
		//临时temp1存储当前文件所有IP
		Set<IP> temp1 = new TreeSet<IP>();
		while(ip != null){
			ip = ip.trim();
			temp1.add(new IP(ip,1));
			ip = br.readLine();
		}
		br.close();
		fr.close();
		//提取temp1存储当前文件访问次数前100的IP并将其与set合并
		int i=0;
		for (IP o : temp1) {
			set.add(o);
			if (i>100) {
				break;
			}
			i++;
		}
		//临时temp2截取已经合并的set中前100的IP
		Set<IP> temp2 = new TreeSet<IP>();
		for (IP o : set) {
			temp2.add(o);
			if (i>100) {
				break;
			}
			i++;
		}
		//使得set一直存储目前已经分析访问次数前100的IP
		set = temp2;
		temp2=null;
		temp1=null;
	}
}

IP对象类:
class IP implements Comparable<IP>{
	public String ip;
	public int nums;
	public IP(){}
	public IP(String ip,int nums){
		this.ip = ip;
		this.nums = nums;
	}
	@Override
	public int compareTo(IP o) {
		if (this.ip.equals(o.ip)) {
			o.nums=this.nums+o.nums;
		}else {
			if (this.nums > o.nums) {
				return -1;
			}else{
				return 1;
			}
		}
		return 0;
	}
}

测试代码:
package test.bigdata;
import java.io.*;
public class TestIP {
	public static void main(String[] args) throws Exception{
		//生成模拟日志文件
		LogAnalysis logAnalysis = new LogAnalysis();
		File log = new File("D:\\javasoft\\TempTest\\BigData\\ip.txt");
		log.createNewFile();
		logAnalysis.creatLog(log, 10000);//节省时间
		
		//分割日志文件
		logAnalysis.splitLog(log, 1024);
		
		//分析文件
		File logSplits = new File("D:\\javasoft\\TempTest\\BigData\\logSplit");
		for (File logSplit : logSplits.listFiles()) {
			logAnalysis.analysis(logSplit);
		}
		for (IP o : logAnalysis.set) {
			System.out.println(o.ip+"---"+o.nums);
		}
	}
}

有一篇博文说得好,扎实的基础跟开阔的视野才是企业所看重的。
关注时代的发展,学习能力强,愿意接受新事物才是企业所喜欢的,当然双向选择,一个创新,有挑战,能快,高,长大的企业也是雇员所喜欢的。加油~

Have a nice day~


  • 大小: 46.2 KB
分享到:
评论

相关推荐

    名企面试笔试真题:TI 笔试题.rar

    这份"名企面试笔试真题:TI 笔试题.rar"文件,通过模拟数字应用工程师和MCU助理应用工程师的笔试题目,为求职者提供了一次了解和准备TI面试的机会。 1. **模拟电路与数字电路**: - 模拟电路涉及电阻、电容、电感...

    C++面试题笔试题C++ 数据结构算法笔试题资料合集.zip

    C++面试题笔试题C++ 数据结构算法笔试题资料合集: 50个C、C++面试题.pdf C++ 数据结构、算法笔试题.docx C++基础面试题.docx C++开发工程师面试题库.docx C++技能测试试卷一及答案.docx C++技能测试试卷二及答案....

    2015阿里巴巴笔试题:产品经理及运营篇.pdf

    2015阿里巴巴笔试题:产品经理及运营篇.pdf

    嵌入式软件笔试题合集.zip

    嵌入式软件笔试题合集嵌入式软件笔试题合集嵌入式软件笔试题合集嵌入式软件笔试题合集嵌入式软件笔试题合集嵌入式软件笔试题合集嵌入式软件笔试题合集嵌入式软件笔试题合集嵌入式软件笔试题合集嵌入式软件笔试题合集...

    thoughtworks笔试题:Conference Track Management

    thoughtworks的笔试题:会议安排。本人使用Java实现,把会议封装成对象,再调用工具类安排会议。下载后的代码里面包含本人姓名,记得改正!附件有运行成功截图!代码能够完美运行,如不能运行我被车撞死!!请放心...

    中兴笔试题 中兴笔试题 中兴笔试题 中兴笔试题

    中兴笔试题 中兴笔试题 中兴笔试题 中兴笔试题 v中兴笔试题 中兴笔试题 ...中兴笔试题 中兴笔试题 中兴笔试题 中兴笔试题中兴笔试题 中兴笔试题 中兴笔试题 中兴笔试题 中兴笔试题 中兴笔试题 中兴笔试题 中兴笔试题

    java笔试题笔试题

    java笔试题 java笔试题 java笔试题 java笔试题 java笔试题 java笔试题 java笔试题 java笔试题 java笔试题 java笔试题 java笔试题 java笔试题 java笔试题 java笔试题 java笔试题 java笔试题 java笔试题 java笔试题 ...

    华信笔试题笔试题笔试题

    大连华信去年的笔试题,可以给各位即将工作的同学一些参考

    中广核在线笔试试题及答案

    【中广核在线笔试试题解析】 中广核的在线笔试试题主要涵盖数学推理和演绎推理两大类,旨在测试应聘者的逻辑思维能力和快速解决问题的能力。以下是对部分试题的详细解答和知识点解析: 1. 数字推理题: 这类题型...

    C#笔试题大全C#笔试题大全C#笔试题大全.

    C#笔试题大全C#笔试题大全.C#笔试题大全.C#笔试题大全.C#笔试题大全.C#笔试题大全.C#笔试题大全.C#笔试题大全.C#笔试题大全.C#笔试题大全.C#笔试题大全.C#笔试题大全.C#笔试题大全.C#笔试题大全.C#笔试题大全.,让你...

    算法笔试题:(Python实现)—— 算法面试题汇总

    算法笔试题:(Python实现)—— 算法面试题汇总算法笔试题:(Python实现)—— 算法面试题汇总开始之前Python实现只出现一次的数字多数元素搜索二维矩阵 II合并两个有序数组鸡蛋掉落字符串Python实现验证回文串...

    数据结构算法笔试题汇总.docx

    数据结构算法笔试题汇总 本资源摘要信息是关于数据结构和算法的笔试题汇总,涵盖了数据结构和算法的基础知识、常见题型和解题思路。 数据结构基础知识 数据结构是一门计算机科学中研究数据的逻辑结构、对各种数据...

    阿里巴巴多岗位校园招聘笔试真题汇总-2021.zip

    阿里巴巴多岗位校园招聘笔试真题汇总-2021 包含多个岗位方向的校园招聘笔试真题: 交互设计师岗 产品运营岗 技术web前端开发岗 技术岗位通识 游戏运营岗 用户体验实习生岗 研发工程师岗 营销专员岗 视觉设计师岗 ...

    2012-2015历年中国移动笔试真题资料移动招聘合集.zip

    2012-2015历年中国移动笔试真题资料移动招聘合集: 2010年中国移动北京分公司校园招聘网申测试题.doc 2010江苏移动招聘笔试完整试卷.doc 2011年中国移动广东公司招聘笔试试题及答案---.doc 2011年江苏移动招聘笔试...

    4399-游戏开发笔试题

    《4399游戏开发笔试题:探索游戏开发的核心技术与面试策略》 4399,作为国内知名的游戏平台,其2015年校园招聘的笔试题无疑是对潜在游戏开发者的一次全面考验。这份笔试题集不仅揭示了游戏开发的基本技能要求,也...

    2023-4-8 笔记-第一阶段-第2节 分支和循环语句-3.2.5 一道笔试题:-2024.4.15

    2023-04-08 项目笔记-...循环语句 3.1while循环 3.1.1while语句中的break和continue 3.2for循环 3.2.1语法 3.2.2break和continue中 3.2.3for语句的循环控制变量 3.2.4一些for循环的变种 3.2.5一道笔试题:- 2024-04-15

    2010-2013华为历年笔试题大汇总-31.pdf

    "华为历年笔试题大汇总-31" 本资源汇总了华为历年来的笔试题目,涵盖了多种类型的岗位和领域,包括通信基础、软件工程师、硬件、财经、会计等。以下是对该资源中包含的知识点的详细解释: 一、通信基础知识点 1. ...

    华三交换机笔试题

    通过这些笔试题,招聘方可以全面评估应聘者的网络理论知识、实践经验和问题解决能力,以确保他们能够在实际工作中胜任华三交换机的管理和维护工作。对于备考者来说,深入学习并掌握上述知识点,不仅有助于通过考试,...

    100家大公司JAVA笔试题汇总

    - 在提供的代码示例中,`aMethod()` 方法尝试访问静态变量`i`,但由于该方法被声明为非静态,所以不能直接访问静态成员。这会导致编译失败,故答案为**D**。 ### 3. 实例方法调用 **知识点概述:** - 实例方法是指...

Global site tag (gtag.js) - Google Analytics