Hadoop分布式环境下的数据抽样
来源:互联网 发布:贪吃蛇算法 编辑:程序博客网 时间:2024/06/04 20:13
http://dongxicheng.org/data-mining/hadoop-sampling/
1. 问题由来
Google曾经有一道非常经典的面试题:
给你一个长度为N的链表。N很大,但你不知道N有多大。你的任务是从这N个元素中随机取出k个元素。你只能遍历这个链表一次。你的算法必须保证取出的元素恰好有k个,且它们是完全随机的(出现概率均等)?
这道题的解法非常多,网上讨论也非常热烈。本文要讨论的是,这个问题是从何而来,有什么实用价值?
自从有了Hadoop之后,该问题便有了新的应用载体。随着数据量的增多,很多数据挖掘算法被转移到MapReduce上实现,而数据挖掘中有个基本的问题是怎样对数据进行抽样。在Hadoop中,每个job会被分解成多个task并行计算,而数据的总量事先是不知道的(知道job运行结束才能获取数总数,而数据量非常大时,扫描一遍数据的代价非常高),用户知道的只是要获取的样本量,那怎样在类似于Hadoop的分布式平台上进行数据抽样?
回过头来看google的这道面试题,是不是正好时Hadoop平台上海量数据抽样问题?
2. 在Hadoop上编写抽样程序
2.1 解法一
(1) 设计思想
蓄水池抽样:先保存前k个元素, 从第k+1个元素开始, 以1/i (i=k+1, k+2,…,N) 的概率选中第i个元素,并随机替换掉一个已保存的记录,这样遍历一次得到k个元素,可以保证完全随机选取。
(2) MapReduce实现
要实现该抽样算法,只需编写Mapper即可。在Map函数中,用户定义一个vector保存选中的k个元素,待扫描完所有元素后,在析构函数中将vector中的数据写到磁盘中。
用户运行job时,需指定每个map task的采样量。比如,用户该job的map task个数为s,则每个map task需要采集k/s个元素。
- Hadoop分布式环境下的数据抽样
- Hadoop分布式环境下的数据抽样
- Hadoop分布式环境下的数据抽样
- Hadoop分布式环境下的抽样技术
- linux环境下的伪分布式的hadoop基本搭建
- linux平台下的hadoop环境搭建(伪分布式)
- 【大数据】开发环境搭建(三):hadoop伪分布式集群环境搭建(下)
- Hadoop--Hadoop的伪分布式环境搭建
- Unbuntu下Hadoop伪分布式环境搭配
- mac下搭建hadoop伪分布式环境
- Docker环境下Hadoop分布式集群搭建
- centos7下配置Hadoop全分布式环境
- centos下搭建单机和伪分布式hadoop环境-(3)配置hadoop的伪分布式模式
- 大数据环境下的高性能分布式计算&存储系统
- VirtualBox环境下基于多台ubuntu虚拟机的Hadoop分布式计算环境搭建
- VirtualBox环境下基于多台ubuntu虚拟机的Hadoop分布式计算环境搭建
- VirtualBox环境下基于多台ubuntu虚拟机的Hadoop分布式计算环境搭建
- Ubuntu环境下Hadoop集群/分布式环境配置
- UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)
- ShopEX更换域名后批量修改商品详细描述中的图片地址
- mysql 全备+binlog 自动恢复shell脚本
- C++的类型转换:static_cast、dynamic_cast、reinterpret_cast和const_cast
- Windows 8 Metro开发疑难杂症——导航
- Hadoop分布式环境下的数据抽样
- 图像处理里面调色板(Palette)是什么意思?
- Mdl内存实现之原理1
- c++ stl library 学习(3)
- spring ioc原理 (很经典不错的一篇关于spring的文章)
- 教你怎么教你怎么在word主动创立备份文件
- 六、读取 个体变量 和 数据封装
- 童话 谢幕了。梦也该醒了:伤感日志
- Hibernate 检索方式