Hadoop学习之路(一)理论基础和逻辑思维
三个题目
第一题
问题描述
统计出当前这个一行一个IP的文件中,到底哪个IP出现的次数最多
解决思路
//必须要能读取这个内容 BufferedReader br = new BuffedReader(new FileInputStream(new File("c:/big.txt")));// 每次读取一行String line = null;while( (line=br.readLine()) != null){// 处理这读取到的一行内容的代码 }//最简单的一种思路: 初始化一个hashmap//hashmap中存储的键值对的 key : IP value : 次数int count = 0; // 就是用来进行存储当前出现次数最多的那个IP的次数String maxip = null;Set<String> ips = hashmap.keySet();for(String ip : ips){int ipcount = hashmap.get(ip)if(ipcount > count){count = ipcountmaxip = ip;}}System.out.println(maxip + " : " +count);
问题难点
1、当读取的文件的大小超过内存的大小时,以上的解决方案是不可行的。
2、假如说你的内存足够大,能装下这个文件中的所有ip,整个任务的执行效率会非常低,消耗的时间会非常的长。
1GB -- 5分
1TB --- 1024 * 5 分
3、最终整个任务就使用一台机器,那么最终整个任务执行完成所消耗的时间是和数据的大小成正比。提升服务器的执行性能来提高数据的处理速度。
当前这一台机器的执行性能: 5分钟/GB
提升服务器的执行性能: CPU :i3 ---> i7 1分钟/GB
在最开始的服务器领域:提升服务器对外提供服务的效率手段就是纵向提升服务器性能。理想是丰满的,现实是骨感的,但是服务器性能提升有瓶颈。
摩尔定律:每隔18-24个月,服务器的性能提升一倍。
如果说数据的增长是每隔18-24个月就增长一倍,工作量增加了一倍。工作效率也增加了一倍,那么最终完成同一个任务所花费的时间是一样的。
但是数据的增长速度是远远超过服务器性能的提升。在数据不断增长的情况下,单位时间内,服务器所需要处理的数据量是越来越大。
假如:
服务器的性能提升 速率 和 数据的增长速率一样: 在18-24个月
10GB --- 性能: 1分钟/GB --- 10分钟
20GB --- 性能: 1分钟/2GB --- 10分钟
假如:
服务器的性能提升 速率 和 数据的增长速率不一样: 在18-24个月
10GB --- 性能: 1分钟/GB --- 10分钟
100GB --- 性能: 1分钟/2GB --- 50分钟
最终的结论: 靠 纵向提升服务器性能的手段 在理论上有 瓶颈的。
最终解决方案:纵向不可取,所以采取横向扩展。
所谓的横向扩展:就是增加服务器的数量。
一个庞大的复杂任务就应该 平均分配给所有的服务器做处理10GB 一台服务器 10分钟100GB 一台服务器 100分钟100GB 10台服务器 10分钟10000GB 1000台 10分钟在理论上 有上限么??没有
两种情况下:
1、在数据量比较小的情况下,单台服务器就可以再用户可接受的时限范围内完成任务。
2、当数据量变大时,如果用户也想在可接受的时限范围内完成任务,那么可行的方案就是进行服务器的横向扩展。
核心思想: 大事化小 分而治之
终极解决方案:
1、先把文件切碎成很多的小文件。
2、每一个服务器节点去处理一个小文件。
3、再把所有服务器的处理结果汇总到一起。
4、再把所有的数据合并到一起求出出现次数最多的那个ip。
只要是通过网络传输数据,就一定存在丢失数据的可能。
第二题
问题描述
在两个庞大文件中,文件也都是存储的URL地址(每行一个),比如文件名叫做file1和file2, 找出这两个文件中的交集(相同的URL)?
以上问题等同于SQL:select url from file1 a join file2 b on a.url = b.url
问题分析
概念:出现在在file1中的元素也出现在file2中。这些元素的集合就是交集
需求:求2个文件的交集
文件中的元素:URL
解决方案
1.当2个文件都比较小的时候
步骤:
1. 编写一个程序可以去读文件的内容,把文件中的所有元素都放置在一个set1中
编写一个流处理取读取文件内容,逐行读取,每次读取到的一行放入set1中
2. 运行相同的程序处理另外一个文件的内容,把文件中的所有元素都放置在一个set2中
3. 先遍历一个集合,每次遍历出来的元素都去另外一个集合中判断存在不存在。如果存在,就是共同元素,这个共同元素就存储在某个集合中resultSet;如果不存在,就不是共同元素。
4. 结果集:集合resultSet
2.当2个文件都比较大的时候
第一种思路:采取跟第一个题目一样的大事化小的策略
第二种思路:改良第一种思路。避免第一种思路中的很多无效匹配 a1 * a2
必须做到合理的数据分区,数据分区的两种最基本的思路:
1.先排序,然后分段==分区
2.hash散列 -- 求hash值,然后利用hash值求和分区个数的余数,如果余数相同,就证明这些元素在同一个分区中
改良了实现思路之后,可以让原来应该执行16个小任务的大任务。只需要执行4个小任务即可。
终极解决方案:
1.先指定一个分区策略:hash散列
2.预估预估一下数据要被切分成多少个块,一定要保证两个文件切分出来的小文件个数成倍数
3.根据hash散列的策略,对两份文件分别进行操作
4.根据原来指定的策略,寻找对应的两个大文件中的对应小文件进行求交集操作
5.所有的结果,根本就不用再进行去重了。直接进行拼接即可。
学到的东西:
整个大数据生态系统中的很多技术软件的底层处理数据的分区时,默认的策略都是hash散列。
第三题
问题描述
现在有一个非常庞大的URL库(10000E),然后现在还有一个URL,(迅速)判断这个URL是否在这个URL库中?
问题分析
需求:判断一个元素在不在某个集合中
解决方案
1、计数排序
1、初始化一个数组 数组的长度 就是 集合中元素的区间长度
2、遍历集合,把每个元素放入数组中 寻找对应的下标位置,找出值,然后重新设置成+1的值
3、按序遍历即可
array[0] = 1, array[1] = 2, array[2] = 0, array[3] = 3,
0 1 1 3 3 3
2、改进需求:
求出某个元素在不在这个数组(数据结构改良之前的集合)中
array[5] = count if count > 0
3、既然是判断存在不存在。
所以结果其实就是一个状态 : 要么存在 要么不存在
存在 : 1
不存在: 0
把int数组进化成 为位数组
优势:把数组所要消耗的内存降低到原来的 1/32
改良了之后这种数据结构: BitMap
真正的结构: 一个位数组 + 一个hash函数
4、BitMap再次进行进化
解决的问题: BitMap 中非常容易出现 hash碰撞的问题
咱们可以结合使用多个hash函数来搞定
缺点: 存在一定的误判率
1、如果这种数据结构(BloomFilter) 告诉你说你要验证的那个元素不在这个 BloomFilter 中
那就表示 这个元素一定不在这个 BloomFilter 中
2、如果它告诉你这个元素存在, 它告诉你的这个存在的结果 有可能是假的
真正的组成:
一个位数组 + 一组hash函数
如果要做工程实现:不管是什么变种的BloomFilter, 都一定要实现两个方法:
1、第一个方法是往BloomFilter中存入一个元素
2、第二个方法是验证一个元素是否在这个BloomFilter 中
误判率的估计:
1、位数组的长度 m
2、总元素的个数 n
3、hash函数的个数 k
hash函数的个数 并不是越多越好
在误判率最低的情况下。 这三个参数应该满足的一个公式: k = 0.7 * m / n
Hadoop学习之路(一)理论基础和逻辑思维相关推荐
- 3台云腾讯云开始hadoop学习之路笔记二
3台云腾讯云开始hadoop学习之路笔记二(接上) 大三党开始学习hadoop之路了,菜鸟学习hadoop,有啥错误请大佬指教.由于自己电脑配置不够,只能买3台腾讯云服务器来学习了.以下笔记都是记录我 ...
- 我的hadoop学习之路
Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS.HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上. Ha ...
- Hadoop学习之路一 Single Node Setup
从研究生入学到现在,快一年的时间了.和很多人一样,我迷茫着,一直没想明白自己想要干什么.年轻的时候真的想和所有人不一样,直到最后选择了大数据方向,更多的也是感觉.青春的魅力在于可能性.没有过多的犹豫纠 ...
- hadoop学习之路(3)
重新系统化学习hadoop 虽然官方对centos6已经停止维护,但还是硬着头皮沿用之前的centos6,并解决了一点小疑惑. 1.修改ip地址的文件 /etc/sysconfig/network-s ...
- Hadoop学习之路(二)Hadoop发展背景
Hadoop产生的背景 1. HADOOP最早起源于Nutch.Nutch的设计目标是构建一个大型的全网搜索引擎,包括网页抓取.索引.查询等功能,但随着抓取网页数量的增加,遇到了严重的可扩展性问题-- ...
- Hadoop学习之路(三)Hadoop-2.7.5在CentOS-6.7上的编译
下载Hadoop源码 1.登录官网 2.确定你要安装的软件的版本 一个选取原则: 不新不旧的稳定版本 几个标准: 1)一般来说,刚刚发布的大版本都是有很多问题 2)应该选择某个大版本中的最后一个小版本 ...
- Hadoop学习之路(九)HDFS深入理解
HDFS的优点和缺点 HDFS的优点 1.可构建在廉价机器上 通过多副本提高可靠性,提供了容错和恢复机制 服务器节点的宕机是常态 必须理性对象 2.高容错性 数据自动保存多个副本,副本丢失后,自动 ...
- Hadoop学习之路(十三)MapReduce的初识
MapReduce是什么 首先让我们来重温一下 hadoop 的四大组件: HDFS:分布式存储系统 MapReduce:分布式计算系统 YARN:hadoop 的资源调度系统 Common:以上三大 ...
- hadoop学习之路(5)
HadoopHA 1.zookeeper配置 zoo.cfg # The number of milliseconds of each tick tickTime=2000 # The number ...
- hadoop学习之路(2)
1.本地安装hadoop(不安装本地hadoop会报错,虽然并不影响远程的环境,但会报错:Failed to locate the winutils binary in the hadoop bina ...
最新文章
- 解决softmax后列和不为1的bug记录 :问题原因为 s为1维的,来除torch.exp(x)(64x10)时候,维数不对应,需要将s也要转换为2维的即维数为(64x1),才可以广播按行对应相除
- linux shell sshpass 远程服务器 批量修改密码
- bash/shell的字符串trim实现
- java 1.7升级到1.8_CentOS openJdk1.7升级1.8
- leetcode 35 Search Insert Position(二分法)
- linux系统 opt扩容,Linux系统扩容根目录磁盘空间的操作方法
- mysql 导出 没有函数_没有MYSQL FILE函数的CSV导出
- 评论:索尼爱立信能否重振雄风?
- 【Es】es deep paging问题
- 【C++】递归 课后习题3-13、3-14
- Spring boot with Hive
- pandas 修改 DataFrame 列名 1
- springboot - 应用实践(3)springboot的核心
- indesign用于产品排班_2019年机器人行业十大新品盘点,过去一年最受关注的产品都在这...
- Centos6.5下搭建nagios详解
- 基于Java的旅游门票管理系统JAVA MYSQL
- python地理位置聚类_python实现地理位置的聚类
- uvaLive 4490 Help Bubu 帮助布布 等价转化+DP
- 模数转换器ADC的常用术语和主要技术s指标(完)
- educoder平台哪里有答案_2020青骄第二课堂登陆平台地址入口 青骄第二课堂禁毒知识竞赛入口...
热门文章
- 决策树 结构_如何快速简单的理解决策树的概念?
- 微型计算机主机作用,微型计算机的主机包括()。
- aes加密c语言实现,基于C语言实现的aes256加密算法示例
- 大疆机器学习算法岗笔试
- 安卓实现tcp连接(安卓作为客户端,电脑作为服务端)
- 【从线性回归到BP神经网络】第四部分:BP神经网络
- 【ML小结12】隐马尔科夫模型HMM
- 【ML小结2】信息论
- win10开启文件共享服务器,墨涩网 - Windows10开启局域网文件共享功能——墨涩网...
- android手机和荣耀哪个版本好,【求测评】荣耀v40轻奢版与荣耀X10哪款更好?图文爆料分析...