【问题标题】:Getting started with massive data海量数据入门
【发布时间】:2010-05-30 04:04:28
【问题描述】:
我是一名数学家,偶尔会做一些统计/机器学习分析咨询项目。我可以访问的数据通常较小,最多几百兆字节(而且几乎总是少得多),但我想了解更多关于处理和分析千兆字节/兆兆字节规模的数据。我需要知道什么?有哪些好的资源可以学习?
- Hadoop/MapReduce 是一个明显的开始。
- 是否有我应该学习的特定编程语言? (我现在主要使用 Python、Ruby、R,偶尔使用 Java,但似乎 C 和 Clojure 经常用于大规模数据分析?)
- 我对整个 NoSQL 运动并不十分熟悉,除了它与大数据相关。有什么好的地方可以了解它,是否有我应该熟悉的特定实现(Cassandra、CouchDB 等)?
- 在哪里可以了解如何将机器学习算法应用于海量数据?我的数学背景主要是理论方面,绝对不是数值或近似方面,而且我猜大多数标准 ML 算法并不能真正扩展。
- 任何其他关于学习内容的建议都会很棒!
【问题讨论】:
标签:
hadoop
mapreduce
nosql
large-data-volumes
【解决方案1】:
- Apache Hadoop 确实是一个好的开始,因为它是免费的、拥有庞大的社区并且易于设置。
- Hadoop 是用 Java 构建的,因此可以选择这种语言。但是也可以在 Hadoop 中使用其他语言(“管道”和“流”)。我知道,例如经常使用 Python。
- 如果您愿意,可以避免将数据保存在数据库中。最初,Hadoop 使用(分布式)文件系统上的数据。但您似乎已经知道,有可用的 Hadoop 分布式数据库。
- 你看过Mahout吗?我认为这对您来说是一个打击;-) 您需要的许多工作可能已经完成了!?
- 读取Quick Start and set up您自己的(伪分布式?)集群并运行word-count example。
如果您有任何问题,请告诉我 :-) 评论会提醒我这个问题。
【解决方案2】:
我已经完成了一些大规模机器学习(3-5GB 数据集),所以这里有一些见解:
首先,存在大规模的物流问题。您可以将所有数据加载到内存中吗?使用 Java 和 64 位 JVM,您可以访问尽可能多的 RAM:例如,命令行参数 -Xmx8192M 将允许您访问 8GB(如果您有那么多)。 Matlab 作为一个 Java 应用程序,也可以从中受益并处理相当大的数据集。
更重要的是,您对数据运行的算法。标准实现可能会期望内存中的所有数据。您可能必须自己实现一个工作集 方法,在该方法中将数据进出磁盘交换,并且一次只处理一部分数据。这些有时被称为 chunking、batch 甚至 incremental 算法,具体取决于上下文。
您怀疑很多算法实际上无法扩展是对的,因此您可能必须寻求一个近似解决方案。好消息是,对于几乎任何算法,您都可以找到处理近似和/或讨论大规模解决方案的研究论文。坏消息是您很可能必须自己实施这些方法。
【解决方案3】:
Hadoop 很棒,但设置起来可能很麻烦。这是迄今为止我读过的关于 Hadoop 设置的最佳文章。我强烈推荐它:
http://www.michael-noll.com/wiki/Running_Hadoop_On_Ubuntu_Linux_%28Single-Node_Cluster%29
Clojure 构建在 Java 之上,因此它不可能比 Java 更快。但是,它是少数几种可以很好地共享内存的语言之一,这可能有用,也可能没有帮助。我不是数学专家,但似乎大多数数学计算都非常可并行化,几乎不需要线程共享内存。无论哪种方式,您都可能想查看Incanter,它是 Clojure 的统计计算库,以及 clojure-hadoop,它可以让编写 Hadoop 作业变得不那么痛苦。
就语言而言,我发现性能上的差异最终是不变的因素。最好只找到一种你喜欢的语言并专注于改进你的算法。然而,根据cited by Peter Norvig 的一些枪战(向下滚动到彩色表格,您可能想要回避 Python 和 Perl,因为它们在数组方面很糟糕。
简而言之,NoSQL 非常适用于非结构化/任意结构化数据,而 SQL/RDBMS 则适用于(或至少可以容忍)结构化数据。在 RDBMS 中更改/添加字段的成本很高,因此如果经常发生这种情况,您可能希望避开它们。
但是,在您的情况下,您似乎要批量处理大量数据,然后返回答案,而不是定期询问相关问题的数据?您可能只在 Hadoop 中处理 CSV/文本文件。除非您需要一种高效的方式来动态访问有关数据的任意信息,否则我不确定 SQL 或 NoSQL 是否有用。