|
2013年9月17日
一个杰出的讲话关于 Pig vs. MapReduce, DonaldMinerspoke to the NYC Data Science Meetup 关于在数据科学方面使用 Hadoop . 如果你能留出时间看, 这是一个精彩而又详细的谈话. However,如果你缺少时间的话, 你可以使用总结跳转至特定的章节. (Quick note: The video ran out towards the end of the Q&A, but the audio is still perfect.)
、这里是Don的讲话的重点总结, 带有视频、PPT, 下面是完整的文字记录:
- Don的背景(0:10)
- 主题讨论 (2:21)
- 介绍 Hadoop, HDFS, MapReduce等技术和其他在 Hadoop 生态系统中的技术 (4:07)
- Pig (also see Don’s talk on Pig vs. MapReduce) (12:43)
- Mahout (14:57)
- 在数据科学中使用Hadoop的4个原因 (16:23)
- 一些例子 (28:50)
- 数据挖掘(29:18)
- 过滤和采样 (31:18)
- 摘要 (34:57)
- 评估数据清洁 (38:33)
- 分类(47:11)
- 训练集的数据量 (51:52)
- 自然语言预处理 (70:21)
- NLP(自然语言处理)工具: Python, NLTK, Pig; OpenNLP MapReduce (70:58)
- TF-IDF 应用到 NLP (72:42)
- 推荐系统 (75:26)
- 协同过滤 (77:25)
- 图 (81:26)
- 聚类(84:33)
- R 和Hadoop (85:06)
- Q&A 问题&回答 (86:30)
- SQL 和键值存储 vs. Hadoop 在 数据科学中的应用 (86:48)
- 为什么不使用一个 graph database? (88:39)
- 和一个科学团队工作 (90:36)
一下是手稿:
Don的背景介绍
(0:10) 我今天演讲的题目是 “Hadoop for Data Science,” 我将会花一些时间谈论这意味着什么, 但是我首先要介绍下我自己. 我工作的这家公司叫做 ClearEdge IT Solutions. 我们是专门做 Hadoop data science 的小精品店. 我们为政府做许多工作. 我们也在别的地方做工作, 我们已经使用Hadoop工作很长时间了, 所以我们经常被叫来做这种工作.
(00:33) 我毕业的学校是 UMBC 位于 Maryland, 我在这里获得了我的机器学习的博士学位. 当我毕业的时候, 我花了几年的时间来说机器学习就是因为我喜欢它, 但是我做机器学习并不能找到一份工作, 所以我决定去找一份真正意义上的工作, 他们第一天就问我, “你知道怎样使用 Hadoop吗?” 然后我说不, 然后剩下的就都是历史了, 但是巧的是到头来两个都用到. 我不知道这是否是运气, 但是我所知道的是我现在正在做这些东西.
(1:08) 我一直居住在马里兰州. 我是摩乌鸦队迷(摩乌鸦队,美国橄榄球队),但是我爸爸是巨人对球迷(棒球队), 所以我也喜欢棒球队. 如果你想在Twitter上粉我, 这是我的账号名@donaldpminer. 我不经常推特的, 但我常常会说些深入的话题. 如果你想联系我的话,这是我的电子邮件 (dminer@clearedgeit.com). 我非常喜欢上这个网站 Stack OverflowI(IT技术问答网站) .我喜欢回答 Hadoop 和 Pig 标签下的问题. 我写了一本书叫做 《MapReduce Design Patterns 》,这与这次谈话毫无关系, 但是我这次带来了几本书.我不知道怎样把他们送出去,但是我带了大约20本.
(1:42) I wrote this book; 这本书是关于使用Hadoop过程中的相关问题的解决, 所以我假设你已经掌握了一些 Hadoop 方面的知识,然后你想去解决一些更复杂的问题.
(1:54) 在最后我列举了一些我喜欢用的一些技巧. 我是Python我长期用户. 我非常喜欢Hadoop. 我非常喜欢 Pig . 我将会多讲一些关于 Pig 的事情, 我所用的这门技术叫做 Accumulo, 它是 BigTable 的实现,有点像 HBase . 那就像我每天所用的, 我将会谈论作为一名数据科学家我每天所用的一些其他的技术.
主题讨论
(2:21) 这是一个幻灯片. 我不确定这是否是陈词滥调 – 是吗?
The Step 1: 收集underpants(底裤?),
Step 2: ??? – 这是陈词滥调了, 对吗? 我不确定这是否是一个转变. 那就是这次演讲所要谈论的. 不是关于collecting underpants, but more about – more than often, 你经常看见 Hadoop 和 data science 因为某些原因总是一起出现, but nobody ever talks about what that thing in between is. It’s like ok, I’m trying to do data science,and I’m trying to do Hadoop, 但是那究竟意味着什么?我猜我在这次演讲上所要着重的是 那些问题标记的是什么, 不是像 Hadoop 是什么这类问题, 更为必要的是我会多讲讲数据科学是什么, 如果那个奏效的话. 我将会讲讲两者的区别是什么.
(3:10) 我将以一段 Hadoop 的简介开始因为这是一个数据科学的回忆, 所以我假设并不是所有人都知道Hadoop.我将会尝试并使你确信为什么Hadoop 很酷, 然后我将会谈论并通过一些在Hadoop上数据科学的例子来使这些故事更有趣.
(3:24) 首先我想警告的一件事情是这也许是我写过的最难的演讲之一, 坐在我的桌子旁, 删除幻灯片, 创建新的幻灯片. 在写这次演讲中我意识到的是这真的,真的是一次复杂的讨论. 我要以此来警告 – 我确实有一些紧张关于出现并谈论我所做的一些事情, 我很确定要打开心扉来讨论, 像那样做出你们自己的结论. 这像我看过的快照.
Hadoop, HDFS, MapReduce简介, 在 Hadoop 生态系统中的其他技术
(4:07) 让我们深入的讲讲, 让我们谈论下 Hadoop . So, very high level of Hadoop is just like 分布式平台, 工作在成千个节点上, 成百个节点上, 几十个节点上, 不管怎样. 它包括两部分. 一个是数据存储平台也是分析平台. It’s kind of two pieces. 我猜你把HDFS 用作一个存储平台 或者MapReduce 当做一个计算平台, or you can swap out HDFS for like S3, things likethat.
(4:34) 下一个大事情就是它是开源的. 是雅虎公司开源的! – 或者它是开源的,然后由雅虎发起组织的, 它这你的很酷. 任何人都能使用它. Hadoop is unseating technology’s like Enterprise Technology’s Oracle from organizations, 对于一个开源技术来说是很大的一件事情. 下个大事情是它运行在“普通的硬件"上. Hadoop 本身是个软件; 没有硬件与之联系. 你可以使用通用的硬件.我的意思是说, I’ve built Hadoopclusters out of workstations before, 它仅仅能工作. 但工作的不好, but it’ll work, so that’s kind of neat. 我真的不喜欢这个词 “日常硬件,” because you can spend like 20K a node on really nice Hadoop nodes, but it is what it is.
(5:23) 第一件事我要讲的就是 HDFS 非常简洁. HDFS 并不是那么神奇. 它所做的全部就是将文件存储在文件夹中; 你可以读文件, 你可以写文件. 你不能修改文件, 但是你可以删除它们. 你能做的事情上有一些限制. It’s got really big block files – 或者,真的很大块. So, 我也许有一个 100MB 的文件也许要分成两块, 意味着那块大文件要存储在一起. 下一个重大的事情是每个文件要弄三个备份, 如此的有效率, 你运行在33% 的存储效率上. A storageguy would be kind of like, “oh my God, that’s awful,” but it is what it is, 那样做也是有原因的. And two, 文件块被分散四处. 这很有趣 – 我要把我的文件分成块 然后将它们相对平均的方式随机的分散在集群中. 这不像我在分区我知道它就在这里或者不再, 有很多基础设施支撑着这个机制. 但是这为下一件事情提供了一个存储层——那就是MapReduce.
(6:32) MapReduce 的工作是分析 HDFS中的原始数据, 它在数据的所在地做此项工作. 这点很重要;
这会需要你写一些java代码,
it’s going to ship it over to all the different nodes,
它将处理本地的数据.主要思想就是给你很多好东西, 这些好东西我们接下来说.
(6:51) MapReduce 这个名字来源于一个事实 jobs 被分解为 Mappers 和 Reducers . Mappers 和Reducers 来自函数语言术语. Map 的意思是读入记录/读出记录. 一个记录进来, 我要做一些事情, 然后它出去. 然后一个 reducer 接受一系列的对象然后把他缩减为独立的数字.
(7:24) 如果你想想MapReduce 能够做什么, Mappers 的工作是把数据从 HDFS拿出来以一种相对来说数据本地化的方式. 你在这里所作的事情也许是过滤, 转化, 你也许做分析的工作. 在数据科学的范畴里, 你做了许多清洁工作 或者一些关于自然语言处理 或 词汇单元化的准备工作. 你做的事情也许是从记录中过滤,那些记录也许是你不想要的垃圾数据, 所有种类的事情. 然后轮到 Mapper了, 一旦它完成了这些记录的事情, 它将输出一个键值对, 我开始了解到那意味着什么.
(8:01) But look at what the Mapper does; for each record, it does this – one record doesn’t care what the other record is doing, right? There’s a couple things. One record doesn’t care what the next record is doing; he doesn’t care how the next record is transformed;he doesn’t care how the record on the other node was transformed, and it doesn’t care about the order, either, of which things are transformed. That’s where the parallelism comes from. The fact that I don’t care about any of those things means that I canjust run things wherever I want, whenever I want, and I don’t have to worry about synchronization and all that crap. I put up this key value pair, and what the Mapper’s framework is going to do is something that I like to call the Magic Step, which is theshuffled sort. What it does is it takes the keys and it groups your stuff by key.
(8:49) 如果键就像美国的一个州, 你将会聚集所有和键联系的值, . 我想要按州来分组, 我的值就是公民. 在 Reducer 中, I would get – 现在我们有纽约, 现在我们就拥有了在纽约记录的所有公民. 然后来看看 Reducer – 想想现在 Reducer 有什么; Reducer拥有这个分组, 在那个分组中, 你要想想像聚集、计数这种东西. 你可以做数据分析, 标准偏差, 中位数, 所有这种东西都在你所分组的数据子集里. Reducer的工作一旦做完, 它将会输出数据到 HDFS.现在, 最优雅的事情是用 Mappers 和Reducers做的事情.
(9:31) 我所想的是 MapReduce 有点像一个游戏. 如果你能找出如何正确的玩这个游戏, 你就能做许多事情. 我有一个朋友他在做视频赌博的事情, 他告诉我 – 我不知道这是不是正确的– 一切都成功了; 对于那些你不懂的事情,像NP完全性这种东西。基本上,to gamble on Bingo is okay,所以如果你能做出一个游戏,是有效的宾果游戏,那么游戏是合法的。这几乎就像在这里,把你的问题弄成MapReduce,那么它只是需要照顾剩下的。这就是他这样,但你可以想象那是很难的,所以如果我不能使我的问题适合Mappers和 Reducers,而我尝试做其他事情,那么用MapReduce解决事情的是很难的。
(10:24) Hadoop有两个核心组件。还有个东西叫Hadoop的生态系统,以及由于某种原因,他们都以动物命名。来看看Hadoop生态系统的两个主要的东西 - 一个是猪(Pig),一个是蜂巢(Hive)。Pig是一种更高层次的语言,它被称为数据流语言,你基本上是描述数据流转换。我会花一些时间谈论Pig。
(10:47) Hive是在Hadoop之上,它类似于SQL的语言,所以,如果你有某种逗号分隔的数据文件,我可以写这个SQL语言。如果你已经写的Oracle SQL长达20年了,你会对与你能写的SQL的数量而失望,但它能够完成任务。因为MapReduce,那些SQL语句有存在的必要,你通常用Java编写,并且你写这些东西在Java中,这非常冗长,而且它是非常书面化。 Pig和Hive提供给你这个更高级的数据语言,你可以得到更快地完成工作,但问题是,你有较少的控制。这就是所做的交易。
(11:20) 下一个是 —— 还有一直是建立在HDFS之上这些数据的系统,像HBase和Accumulo。我不打算花太多时间谈论这些,但这些都已经在数据科学方面对我很有用。这些基本上是大型的键值存储。他们有序映射,所以如果你知道一个有序映射是什么,这很好。但基本上,你可以通过键抓取的东西非常快,你可以写的东西非常快,所以它解决了很多实时问题,这些问题你可能会使用Hadoop,这些都是很好的交易。
(12:08) 那么你已经有了这一大堆只是随机的废话,这似乎仅仅说明用Hadoop做些说明东西的,像Zookeeper这样一个东西,你可以保持信息的小花絮,并有一定的同步性。它实际与Hadoop无任何关系,但由于某种原因被认为是Hadoop的生态系统的一部分。Flume 和Storm 是流数据收集框架。 Cassandra是另一个键值存储,但不一定使用HBase的,然后的Avro就像是一种数据格式。所以,你可以想像,有这些项目,不断冒出来,而且他们这个生态系统的一部分。你有很多提供给你的工具。
Pig (推荐观看Dong的演讲关于 Pig vs. MapReduce)
(12:43) 一,我想深入讲一点点是Pig,我想这样做的原因是因为我经常用Pig做关于数据科学的事情。用Pig来做数据探索真的很好。便于数据分组。它也是非常好的粘合剂 ——所以,如果我想使用一个外部库像OpenNLP或NLTK或Weka的,或类似的东西,只要那个东西的得到了一个API,不管是Java或Python或类似的东西,我可以使用Pig将它粘合进MapReduce。这是一个我用的很多的东西。这是一个很好的基础。我真的很喜欢使用Pig做数据科学。Pig所做的是它为您提供了一些更高层次的概念。你将拥有GROUPBY和DISTINCT,和foreach,和FILTER。
(13:30) 像你看到的那样, 我不是在这谈论 Mappers 和Reducers . Pig所做的是它着眼于的事情,比如说,FILTER 和GROUP BY,它建立查询计划,我将如何用MapReduce解决这个问题?这就是很巧妙 - 它可以节省大量的时间。如果你想学习的Hadoop,我几乎可以说写Word Count,这就好比的Java中的Hello World ,但随后马上进入Pig,然后可能随后再回到Java的MapReduce。这通常是我的建议。
(13:56) Pig也很酷,因为你可以编写自定义加载器和存储函数,以及让你有很大的灵活性在你工作的何种的数据,就像我说的,我用了很多。这里有一个Pig脚本的例子(见幻灯片八),它会加载这个数据——在HDFS中的这个文本文件。我得到了名字,我已经得到了年龄,我得到了活在它里面的人的状态。我要由状态来分组,所以我要说根据state收集所有的人,就像我说的 - 那是在我在我前面的例子中的的Mapper 的键,然后为每个分组的,我去运算然后输出分组,这是state。所以,也许这将输出马里兰州,纽约或什么的。它会计算有多少项目是在该组中,然后它会给我在该组的年龄平均。这将是类似- 想象一下,如果这是聚会网站的数据库。可以说,在美国马里兰州聚会网站成员平均年龄27 ,而同时在纽约,平均年龄是29 。我不知道这是否将是有益的,但是这样的事情,你可以用Pig轻而易举的做出了。
Mahout
(14:57) 下一个我真的想指出的是Mahout。Mahout被认为是Hadoop的生态系统的一部分,而Mahout是一个机器学习库。Mahout是一种事实上的对Hadoop的机器学习库,但我真的很喜欢四处折腾它。我认为这是一个机器学习库,恰巧y有时使用Hadoop。在Mahout中很多事情根本不使用的Hadoop,在本地做所有的事情。在否是Hadoop库指尖,它是一种奇怪的混种,但如果你正在寻找一个Hadoop的机器学习库,你应该先看看Mahout 。
(15:33) 三大类,它试图处理的是一个是推荐系统,我可能已使用的最多了。如果你只想使用一个非常基本的推荐系统,你想要把你先尝试一下吧,我会强烈建议Mahout。你很可能得到持续的时间很短。我想大多数人的采取建议是有点严肃的,虽然,在某种程度上开始变得有点沮丧,I think that’s true of most libraries in general。当你初步解决了问题,你碰到了你的框架不会做的东西,那么你必须写一切从头开始。这是一种同样的情形。它也处理聚类和分类。它有一些分类和聚类,我会更晚的时候讲一点点。
在数据科学上使用 Hadoop 的4个原因
(16:23) 此时现在,我将试图说服你的关于Hadoop的所有这些很酷的事情,也讲要讲为什么它和数据科学有关系,我要去讲四个很酷的事情。
(16:35) 第一个很酷的事情是线性扩展(linear scalability)。线性扩展是个一般规则的地方,如果我有工作了,让我们花10分钟说 - 如果我加倍的计算机数量,保持相同的数据大小和同样的工作,这项工作现在应该需要五分钟。如果我加倍数据量,就应该花两倍的时间来运行。如果我加倍数据量并且加倍节点的数量,应该花费同样的时间。这是一般规则,这实际上是不可能的情况下,但在大多数情况下,它实际上是相当不错的。当你没有缩减,像在非常高的规模下 - 如果我说的是500个节点和700节点之间的区别,线性扩展保持真实性,但是当我们谈论像5个节点与2个节点,也许看不到区别,但在更高的数据规模下,你一定会看到线性可扩展性。
(17:34) 这对数据科学很重要,因为你可以用硬件解决问题。如果我希望我的数据探索是想快,然后我就可以购买更多的计算机。如果我想存储更多的数据,我只需要购买更多的计算机。它的规模是为什么我们谈论这个在数据科学Meetup。 Hadoop和MapReduce的一般都不是很好技术来进行数据科学使用,在我看来。我更喜欢是在原始的环境下工作,起码环境是互动的,该工具是可视化的 - Hadoop更像是一种工具,这某个特定点你不得不使用的工具,其实这是数据科学以外,这也是成立的。如果你不必使用Hadoop,没有理由。MapReduce不是一个功能,MapReduce就像是一个制约因素。Hadoop的一切都是是制约。我有约束HDFS上,我有约束在MapReduce上,在Pig上的约束,这些都没有让你的生活更轻松,它使你的生活困难。权衡你正在做的是,好吧,通过使用该系统我让我的生活更困难了,但它为我照顾一堆东西。我真的想把它开回家。这四个很酷的事情我要讲的是,为什么它是好的和原因,为什么你应该使用它。如果你不必使用它,就不要用。
(18:48) 下一个很酷的事情是schema on read。这大概是我最喜欢事情的之一。我有这两张图片在这里对比(见幻灯片11)。试想一下,美国国会对比一个牛仔。这就像使用Hadoop之前和之后的区别。所以,当我在做数据项目之前,我们会与很多人开回,在那里我们将决定模式是什么样的,我们将决定ETL process ,然后我们离开开始做项目,然后事情会变成这样,哦,这个不管用,我们必须开更多的会议。你之前必须做很多规划,如果你在模式选择上犯了一个错误,这对于项目在未来取得成功可能是灾难性的。你不得不提前做很多思考工作。
(19:32) 使用Hadoop有点技巧,因为你首先加载数据,然后Hadoop会随后提问,因为一些原因这真的很酷。首先,我可以保持原有的数据,而不是真正关心。以前,当我们坐在会议室,我们在地板上放置数据。如果我不能将它列入我的SQL数据库,该记录是不会去任何地方,我们就得放弃它。我们可以开始数据流,并开始设置数据并保持原始数据,并有很多很好的理由。首先,很明显,我没有做任何的转化过程来获取数据,另一个好处之一就是ETL processes 是软件,它们可能会出错。如果你正在处理的原始数据,你是安全的。你不必回去去修复ETLprocesses 的错误。
(20:33) 另一个很酷的事情是,对于相同数据你可以有多个视图。我有原始数据,然后Schema on Read意味着我应用的结构或模式,或在运行时数据的理解的结构。这也就意味着,我可以每次我运行作业时对结构有不同的诠释。好的,说一个很好的例子,让我们说我对书的一些分析。在我的文集里我有很多的书,我读书。我可能要构建我的数据,以不同的方式,根据我在干的是什么工作。也许一个“记录(record)”对我来说是整本书,也许一个记录是一章,也许一个记录是一个段落,也许是一个句子,也许是一个字,也许是一个字符。取决于我想要做什么,所以结构应该是不同的。这是一种技巧,因为如果我想以不同的方式构建数据,我可能要以不同的方式存储数据,这很逊。我不打算这样做。另一个很酷的事情是,我可以用非结构化数据来工作,接下来我会谈论更多。非结构化数据使得一个问题更令人讨厌,一个令人讨厌的ETL问题。这意味着我可以- 我可以放弃它的,我可以叫我的数据科学家出来说,嘿,数据就在那里,用它去做点什么吧。就像我说的,最重要的一点就是首先存储,弄清楚以后用它做什么。直到你找出你将用你的数据做什么的时候,你已经拥有了一个月份的数据了,很梦幻吧。
(21:54) 下一个很酷的事情是透明并行性(transparent parallelism)。我的意思是这是你不必担心任何的事情,你通常会担心的是当你正在处理的并行性的问题的时候,或并行系统,像接下来所说的这类东西,如何扩展系统,需要网络编程吗,我必须打开套接字其他什么东西吗,我需要发送数据包吗,我必须处理同步和锁定,进程间通信,数据存储,容错,线程,RPC(远程方法调用),消息传递,分布式的东西。这些都是我没有去关心了。我不必成为一个精通分布式系统的人来做这类东西。因此,我前面提到的交易,是我必须做的 -我喜欢想象当我得到了这个又大,又凌乱的解决方案,它是你的工作,把它放入这个小箱,这就是MapReduce的小箱子。如果你能在MapReduce中执行它,那么你就不必担心这些事情。但是,如果你想在箱子外尝试做一些事情 - 我试图做一些事情,不一定MapReduce的,然后你就要开始担心这些事情了。
(22:56) 我想告诉你我有一个问题 - 我试图解决一个流问题,在我有拥有Flume (水槽)和Storm(风暴)这类事情之前。Streaming 是我有一点记录流中,当这些数据进来我要分析这些数据,在我们无穷的智慧,我们有这么一个小Perl脚本,将运行,处理这些数据,然后做处理这些记录什么的。我们想并行化它,对不对?所以,我们只是通过SSH登录到一个随机的节点,然后执行该脚本。当时的情况是就是我们遇到了一个锁定的问题,那脚本只是停滞不前,开始不断的循环运行,然后它一直运行子程序,整个事情就是运行了一堆的Perl,并且集群是死了。所以,我们遇到了问题是,我们走出了这个MapReduce的小盒子,我们忽略了一个事实,我们不得不处理的锁定问题、同步问题和进程间通信问题。如果你的程序一直在MapReduce箱体的内部,你几乎可以说Hadoop会照顾它。这是用Hadoop做数据科学中最困难的部分,我得弄清楚我该如何解决这个问题,有很多方法,你想今天要解决的Hadoop之外的问题,都不会以适应,实话实说。
(24:25) 第四个很酷的事情是非结构化数据。出于某种原因,非结构化数据通常与Hadoop联系起来。很酷的事情是我可以把数据存储在HDFS中,而我也不必在乎 - 就像我说的,它只是一个文件,对不对?它可以是任何东西,它可能是一个压缩文件,它可能是一个加密的文件,它可能是一个文本文件,CSV文件,图像,等等。然后,所有我需要做的就是写一些Java代码来读取该文件。很酷的事情是 - 非结构化数据的一些可能是媒体文本,自由形式,如医疗表格。日志数据是特别的,它也许有结构,但可根据上下文不同行有不同的含义。我最喜欢的非结构化数据的形式是一堆的结构化数据,这些数据不是相同结构的数据。因此,有人可能给你- 在这里就像我们所有的数据,并有90种不同格式的结构化数据,这我称之为非结构化的数据。不幸的是,像SQL和Pig或HIve这种高级语言,需要到某种结构。每次你提出job和Schema on Read,那么你就需要说OK ,嗯,这是该数据意味的东西。但有一点要明白的是MapReduce是在Java的MapReduce仅仅是Java 。你写的Java方法,让你在使用的真正的JVM 。基本上,任何Java可以做的事情,你可以在MapReduce中做。这未必是一个好主意,但你可以做到这一点。如果我想读取图像文件或音频文件或类似的东西,如果我想要做的OCR- 如果我能在Java中做到这一点,我至少可以尝试在MapReduce 中做。还有人不相信 Hadoop 很酷?好吧。滚出去。我只是在开玩笑,你可以留下来。
Example use cases(样例)
(28:50) 谈话的其余部分 - 我实际上并不想谈论这四件事情(见幻灯片14,数据探索,分类,自然语言处理,推荐系统),所以我决定只谈论一些实际的东西,希望在这个过程中我会提出一些要点。这就是这次谈话的剩余部分如何进行的,我要去谈谈数据探索,我要谈谈分类,而我要谈谈自然语言处理和推荐系统,然后我会简单介绍一下其他一些什么东西。
Data exploration(数据探索)
(29:18) 第一件事情就是数据探索。我认为Hadoop是居然真的在数据探索方面很在行。如果我有一堆的数据,我不明白,我想弄明白,Hadoop是真的很不错。有许多原因。其一是,很明显,我可以存储数据就像我刚才说的那样。我并不需要先了解数据,这就是探索的关键——我不明白的数据的含义。如果我需要了解,以获得数据中的数据,这是很糟糕。 这时用Hadoop就很好,因为我不必担心。另一件事,也就是这显然快,从“我要处理大量的数据”的观点。所以,有时候大的数据集,探索大型数据集,这是很好的。当我进入一个咨询项目 - 例如,我要做一些数据科学的工作,我想列出第一周我要做的一些事情。正如一般的经验法则,如果我在一个为期四周的项目上,我想花大约50%的时间在做探索工作。根据我的经验,探索是真的真的很重要,并记录它是非常重要的。我想可惜的是我的大部分客户不同意我的看法,对不对?于是我被聘用来解决,建立一些神奇的机器学习分类器的东西来解决他们所有的问题,他们不知道的是,我真的应该首先做一些数据的探索,然后告诉他们可能会得到什么样的结果。有点像这样的步骤,你需要去率先拿到结果。我认为数据探索是非常重要的。通常发生的事情是,我会说是的,好吧,我会建立分类器来解决您的问题,我们做数据探索,我告诉他们什么是他们的原始数据,铁的事实,而且他们就像说, OK在接下来的两个星期里我们可以按你所说的做。对,这就是通常会发生的情景。这样的事情我会多说一点- 一个是过滤,另一种是抽样,汇总和评估数据清洁性。
Filtering and sampling(过滤&抽样)
(31:18) 过滤 - 我喜欢用这个比喻 - 很像一个显微镜。过滤是这样的,我想看看以它真实的形式的记录,但我只希望看到他们中的一些数据,我不想看全部数据。我不会通过10十亿条记录来观察,我只是想看看100条记录。在MapReduce的,它很容易。在Mapper中,我只是说:我是否想保存这个记录,如果我不想,那么我把它扔掉,如果我想,我说是的,然后我就输入了,然后我只要看看输出。一些例子,可能是我唯一想看看关于纽约的数据 - 这范围可能是太广了吧?也许我只是想看看关于在纽约人们30年代是否结婚的数据。另一件事是,当你筛选,你可能会从一堆混乱不清的数据开始挑选,数据都是脏的,那些数据不应该存在,那些数据都是没用的。Twitter的似乎是一个非常流行的数据集,但我想 - 我在推特上关注的人对比推特的大量用户,你会惊讶存在多少无用的话语。字面上零信息。就像你必须努力去写140个字符,并没有给出任何信息。当你开始过滤数据的时候,有很多这种数据,你只是坐在那里然后开始过滤数据,而你开始写删除垃圾数据的规则,因为它是废话。另一方面你也可以通过时间切片。
(32:59) 过滤是真的是一件很酷的事情,因为你可以在数据块上获得它们的微观表现,当我在做与Hadoop的过滤的时候,我寻找的东西是我可以建立一个分类器或什么的。我会说,我对所有的数据建立一个分类器,这是非常罕见的。我要做的就是我会取数据的一个子集去解决特定的问题。
(33:25) 下一个是采样。抽样是相当多的过滤,但我不能在一个幻灯片讲完这一切。 Hadoop是不是真的那么善于交互式分析。已经有大量的如雨后春笋般涌现的项目做交互分析做的更好,但在大多数情况下,我们不是在谈论把这个东西放到Excel中,然后做像数据透视表之类的东西,或者甚至把它放到SQL数据库和运行针对它的SQL查询。我们目的不是那样。
(33:45) 我喜欢做的某种不同类型的抽样是一种随机样本。像这样,我随机拉出来的一个万条记录,或者记录中随机的10%的记录。也许我会做子图提取。说我在做某种形式的社交媒体分析。我会从个体中随机挑选1%,然后我会在他们的朋友中去随机挑选1%,然后朋友的朋友中随机挑选1%,这样,所以我至少建立完整的社会网络,但它的社交网络的一个子集。存在另一种模式的采样,我也可以做的过滤器。采样是好事,因为你可以得到一个关于什么方法可能奏效的感觉,是有什么种类的数据。因为如果你刚开始和任意取前100条记录,我找到的数据是,只是数据的方式写的,你会发现很多类似的记录放在一起,然后你不会得到一个好的视图。Pig有一个很酷的句子:采样有用的数据,使用这些数据你可以缩减记录数。
Summarization(摘要)
(34:57) 下一个是总结。总结有点像过滤相反的过程。总结像是对数据的鸟瞰图。过滤是像我挑剔的看看我的数据,汇总就像我全局的,我在整体的看待数据。 MapReduce的是为汇总而生的,这也正是它的作用。Reducers 汇总数据,mappers 获得数据,然后汇总是很容易的。很多我喜欢做的事情像是- 对于不同的列或不同的数据片段,我想看看有多少记录在那里。为记录计数是有蛮有趣的。很多事情,如标准差,得到的平均值,这样做我就可以感觉得到我的数据是什么样的。如果我想要得到真正的进步,也许我会看看是否有适合某种曲线。获取最小/最大记录是很酷的一件事情,在列计算空值。几乎我每次去在一些采用数据库的系统上工作的时候,特别是老技术的数据库技术,出于某种原因,大概一半以上的列都只是总是空。我不知道为什么。然后我的最爱事情之一是抓取前10名名单。我特别喜欢前10名名单。建立一个前10名名单你就能了解到了。我已经为我的客户得到这么多的价值在前10名名单这个事情上。像可能比所有的时髦机器学习的东西,我做的更多,前10名列表可能更有价值。我应该让这个演讲的主题是关于前10名名单。
(36:32) 有一个例子,当时我正在为一家电信公司工作,我们正在查看他们的呼叫数据记录,他们希望降低漫游。他们知道他们对漫游失去了一堆钱,基本上他们正想解决呢,哎,如果我在这里放置手机信号塔,那么我会失去更少的钱在漫游。他们基本上是想做的是放置信号发射塔的自动化成本/效益分析。我抓起了一个前10名名单——呼叫记录中排在前10名的手机号码。有一个家伙,比别人高8个数量级。在一天的中这个呼叫次数是个荒谬的数字。就好像这个家伙一分钟的时间里将有30到40次通话,这基本上是不可能是。因此,他们跑了出去,去看看,他们所发现的是- 我忘了它是什么系统,但在每辆车里都有个好像OnStar的东西或者每个人都有一个不同的 - 据说如果你间没有订阅,它将使用这个默认的号码,而不是使用一个专门为您的汽车定制的号码。我不知道,但我想,如果他们删除了,那么他们可以节省一些钱。
(38:07) Some other top 10 list things I’ve done, things with cybersecurity type use cases. I’ve seen number of packets in and out, like who is the most chatty person on the network. That’s always interesting. That’s probably been useful to the people everytime I’ve done that with cybersecurity use case, the top 10 list of packets. There’s usually nine of them, they’re like, yeah, I understand that one, but that guy, I’m not sure why that guy is there.
Evaluating data cleanliness(评估数据情节性)
(38:33) 接下来要讲的清洁度评估。你永远不知道你的数据情节性将是如何。你永远不知道你将会面对什么问题,而且有一件事我要说的是我从来没有被数据完整性问题困扰过两次。我总是把这个名单记在我的脑袋里,因为当你碰到这些东西,你就会有一个非常痛苦的经历。你永远不会忘记它。即使我知道我可能永远不会再看到它,我还是来看看它。一个是在我的数据集中寻找1970年。我因为这个非常糟糕的事情而惹火上身。基本上,无论出于何种原因,而不是抛出“空”,他们将UNIX时间复位为零,不管是什么日期,1970年都是世界的开始(1970UNIX系统被创造,所有1970被定为系统开始时间)。而且扭曲了我所有的计数和所有的一切,当然,所以我总是检查1970这个时间,这个问题。
(39:41) 我检查的事情:不应该是空,像日期,用户ID之类的东西不能为空 。有些对象不应该是空,通常是空的是又一些原因的。其实我花了很多时间在寻找出来的数据是如何复制的。这是非常重要的,因为如果你在训练一个模型什么的,有时重复会搞砸某些对象的权重。因此,摆脱重复的是非常重要的。许多方法可以完成这项工作,你可以在Pig中做“distinct” ,你可以在MapReduce中做专门的Droop By。我花了很多时间看重复数据,而且我在寻找的度量后,我曾经删除多少条重复记录,并且我得到的数据集有多少百分比的记录是重复的。有一次我发现数据是坏的,我看看为什么数据是重复的,因为你会感到惊讶。也许这仅仅是所有空行是重复的,在这种情况下,这是真的太不有趣了。
(40:38) 有一次在网络安全使用例子中,我发现了重复,我计算出事情是重复的 - 这是另一件事我观察重复数据得到的 - 好吧,记录是重复的,我删除了其中的30%,但这些的,是哪一个重复2倍,4倍重复,重复5倍,是否是有道理的。这个记录我看了三次,这个纪录我看了四次,我数着。在这一个情况下,我发现有很多2倍重复的数据,这并不令人感到意外。有相当数量的三倍重复的数据,有没有四倍,五倍,但也有大量的6倍重复的数据。现在,这是奇怪的。究竟为什么会没有重复4倍和5倍的数据?嗯,事实证明 - 我没有完全理解网络,但他们告诉我的是- 我拉出6倍重复数据,这仅是该数据集的一个非常小的一部分,但他们发现,路由规则有一些错误,数据重复的做路由循环 - 数据到达他们所需的地方之前重复的做一些路由循环。所以,他们发现这个办公室有一个重大的路由问题,并希望在别的公室的那些人现在有更快的网速。
(41:50) 我寻找的其他东西:数据应该规范化,就像我处理的字符串,要么是大写,要么是小写的字符串。如果你正在处理的数据像是人的名字,如果它的拼写形式是自由的,这可能真的很糟糕。所以你要处理的姓氏、逗号、名字。你开始获得人们的名字。你怎么处理呢?有各种疯狂的事情,你可以看看,应该是标准化的,那是另一回事。有时你可以看看,有些事情并不需要规范化。
(42:24) (See slide 19) 这是一个我最近碰到的。这是一个六位代码的唯一标识符,并且出于某种原因,在一些列的还有空格。所以,当你做排序分组(group by),我要根据数据排序,实际上对于计算机来说,空格使它看起来像一个不同的键值。所以,我不得不去去掉这些空格。我注意到它,因为我的推荐系统为我推荐“abc”和“abc”,这到底是什么的建议。然后我修复它了,然后我的推荐系统就好多了。评估清洁性是挖掘的一个重要部分,因为你不知道你的数据如何直到你到达那里。就像我说的,我做数据科学服务。因此,数据探索- 我使我的客户在两个量上为我付款,像在我数据挖掘的结束的时候,那种然后你可以决定是否要付给我更多的钱,因为我作为一个顾问,我不得不去猜测什么我要去寻找。比方说,他们要我写一个分类器预测他们下个月会流失多少客户,他们给我一堆很糟糕的数据。那这种情况下我该怎么做?这是我的恶梦。
(43:42) 这些东西要讲的是什么?这些跟做Hadoop和数据科学有关系吗?这里的要点是,Hadoop很善于做这些事情。其实,这是你应该使用Hadoop的一种一个例子,因为如果我要做我跟你所说的搜有的挖掘的事情,我会在R语言中做这个工作,让我在我的本地机器或我的笔记本电脑上来说这件事情,这可能需要一段时间。相反,如果我有一个10节点的Hadoop集群,20节点的Hadoop集群,我的查询会在一,二,五分钟或差不多的时间返回结果。
(44:23) 接下来的事情是,你可能有大量的数据,而且其中很多是垃圾数据。我的意思是你并不真的需要大量的数据,但你拥有这些数据。你不知道什么样的数据是有价值的直到你开始挖掘数据的时候,所以你不得不首先收集所有的数据,如果你没有首先做这项工作,那你就真的不知道它是什么,Hadoop就是应对这种情况的。我的下一个问题是 - 真的,我希望我已经研究这个技术足够了;真正花时间做这个,因为这将让您的生活轻松了许多。当我谈到这个原始数据的科学环境,我想象自己在一个未来的电影里,所有的可视化结果都飞向我,在那里我已打印出数据,返回结果,我按下Enter键,结果返回真快。就像我迫不及待有一个电影里的数据科学家,他运行一个查询并且它返回答案,而实际中,你坐在那里等,“好吧,你想要去吃午餐?我不得不等我的MapReduce结束运行“所以,我想,如果你花了很多时间在数据清洗和数据探索的事情上,你可以搭建这个环境了。您可以建立这些较小的环境,他们稍微快一些。你可以在HBase快速的搭建环境。
(45:50) 然后接下来的事情,用没有用Hadoop这很明显吧,这很难告诉你应该用什么方法,直到你探索你的数据,所以它是非常重要的。
视频地址 http://vimeo.com/73893378(需翻墙)PPT地址 http://pan.baidu.com/s/1hq5fxn2
原文地址 http://blog.mortardata.com/post/61501767090/hadoop-for-data-science
|
|