看到了Hadoop的官方文档的what Hadoop is not 觉得写的很好,作为Hadoop笔记的开篇吧。
Hadoop不是万金油
很多人都去给apche写信询问一些关于Hadoop的问题,他们感觉Hadoop应该是能他们的程序和数据中心问题的万金油。诚然,是可以解决一些公司的特定的一些问题,这建立在他们了解这项技术到底适用于什么场景之上。如果你想当然的认为Hadoop可以代替你的数据库和文件局域网系统,那么估计你就要失望了。
知其然还没达到就更不要说知其所以然了。
Hadoop不是数据库的替代品
Database有着自己的特点,利用SQL执行select在几秒内可以获得被索引或者被规划好的数据,利用update可以进行修改,而Hadoop则不会。
Hadoop存储数据到文件中,但是不会建立索引。如果你要找点什么,你需要运行MapReduce程序,这是要花费时间的哦,意味着你无法使用Hadoop代替你的数据库。Hadoop工作在什么情况下?比如你的数据量超级大(假设你遇到了一个研究的极限问题,已经不是你不舍得掏钱更新数据库设备那种级别的问题了)。大规模的数据导致你修改索引的代价太高以至于无法直接修改。更多的机器同时去写你的数据库,而你根本无法进行locking。这种场景,也许才是分布式文件系统可以发挥特长的地方。
当然,高效的面向列的在HDFS生态系统中的HBase是一个很好的选择,它可以作为从你的原生数据中提取并存放结果的地方。
MapReduce不一定是最好的算法
MapReduce很深。的确,看过盗梦空间的人都觉得里面的一层层的循环和一层层的kick让人迷幻的无法喘息。其实MapReduce就是酱的一个模型。它提供一个简单的编程模型来实现,并且可以并发处理GB甚至TB的数据。就像海的女儿中公主想靠近王子需要用嗓子来交换一样,任何事物好的一面都是有其代价的。大并发中,你需要保证你的MapReduce和其他的处理是独立的。你想要知道在做什么,之前都发生了什么。所以就产生了一些问题:
迭代:你的MapReduce的ouput应该可以成为其他MR 的input
共享信息。Hbase是一个处理方式,包括其他的一些缓存模型机制。
不要记录本该在某一个JVM的生命周期中处理的数据到你的共享区域(比如不安全的全局变量等等),在大并发的处理场景中这个是大忌。
Hadoop和MR不是学习java coding技巧的地方
在Hadoop的api和一些文档当中都有一个假设,假设你是一个对java了解并且能处理简单错误信息的技术人员。如果不不知道classpath,不知道如何编译和debug那么奉劝你先别玩Hadoop,回去好好学好基本功吧。
Hadoop不是一个网络知识的理想之地
当你有些网络经验的时候你会发现工作做起来轻松简单一点,比如Connection Refused是啥意思,又比如它和No Route to Host有啥区别。
很多人都来问一些上面这两个错误的问题,或者一些很简单的TCPIP层面的问题。这些经常是一些集群配置的问题,一些集群的机器并没有成功启动,或者机器间根本就还没建立经由LAN的通信。回答者无法去check你的网络问题,那是你的网络问题不是人家的。回答者可能会告知你去用一些工具去测试一下,但是来来回回的确认会让你发现这不是一个有效的确认方式。
在Hadoop的圈子里没有人故意地去刁难谁让事情难做,只是在一个巨大的分布系统中常见的一些问题罢了。当然,如果你可以帮助我们来改进网络上面的一些错误信息和帮助使用诊断信息,我们很期待与你合作。
Hadoop不是一个学习Linux的地方
你需要知道如何玩Unix/Linux系统。如何安装,在/etc/下面的各种文件都是干啥用的,如何安装网络环境,一个好的主机table是啥,如何去解决DNS问题,为什么要独立于root空间来保存log文件。一台机器你都搞不定的话,你更不可能玩转80台。
你需要知道的知识:
1.SSH 如何建立authorized_keys如何使用ssh和scp
2.ifconfig, nslookup 以及其他网络配置诊断工具
3.如何让你的平台数据最新化
4.你的机器生成的各种各样的log都是啥,有什么意义
5.如何安装本地系统如何嵌入
这个是很重要的。如果不知道这些,你最好不要安装Hadoop直到你有一些对于Linux的基本知识和认识,可以让你的ssh相互访问不需要密码,知道相互的hostname等等。Hadoop的安装文档都会呈现出这些操作,但是不会去解释为什么。
Hadoop不是一个完全的POSIX 文件系统
编外:POSIX在Hadoop中的接口状况不太清楚这部分暂时没有翻译。