据我所知,Hadoop是一个分布式存储系统。但是我真正得到的是,我们可以用Hadoop替换普通的RDBMS(MySQL,Postgresql,Oracle)吗?或者Hadoop只是另一种类型的文件系统,我们可以在其上运行RDBMS吗?
此外,Django可以与Hadoop集成吗?通常,Web框架(ASP.NET,PHP,Java(JSP,JSF等))如何与Hadoop集成?
我对Hadoop与RDBMS有点混淆,我将不胜感激任何解释。 (对不起,我多次阅读文档,但可能由于我缺乏英语知识,我发现文档在大多数时候都有点混乱)
答案 0 :(得分:24)
想象一下以下挑战:你有很多数据,而且很多我的意思是至少太字节数。您希望转换此数据或提取一些信息并将其处理为以某种方式编制索引,压缩或“消化”的格式,以便您可以使用它。
Hadoop能够并行处理这样的处理作业,这里最好的部分是处理文件的冗余存储,在集群上的不同机器上分配任务等等(是的,你需要一个集群,否则Hadoop无法弥补框架的性能损失。)
如果您第一次看看Hadoop生态系统,您会发现3个大术语:HDFS(Hadoop文件系统),Hadoop本身(使用MapReduce)和HBase(“数据库”有时是列存储,它不完全适合)< / p>
HDFS是Hadoop和HBase使用的文件系统。它是主机上常规文件系统顶部的额外层。 HDFS将上传的文件分块(通常为64MB),并使其在群集中可用,并负责复制。
当Hadoop获取要执行的任务时,它会获取HDFS上输入文件的路径,所需的输出路径,Mapper和Reducer类。 Mapper和Reducer通常是在JAR文件中传递的Java类。(但使用Hadoop Streaming,您可以使用任何所需的comandline工具)。调用映射器来处理输入文件的每个条目(通常按行,例如:“如果行包含错误的F *字则返回1”),输出将传递给reducer,它将单个输出合并为所需的输出其他格式(例如:添加数字)。这是获得“坏词”计数器的简单方法。
很酷的事情:映射的计算是在节点上完成的:您以线性方式处理块,然后通过网络将半消化(通常较小)的数据移动到reducers。
如果其中一个节点死亡:另一个节点具有相同的数据。
HBase利用文件的分布式存储并存储其表,并在群集中以块的形式分割。与Hadoop相反,HBase随机访问数据。
如您所见,HBase和Hadoop与RDMBS完全不同。 HBase也缺乏很多RDBMS的概念。使用触发器,预备声明,外键等建模数据并不是HBase想要做的事情(我不是100%肯定这个,所以纠正我;-))
对于Java来说很简单:Hadoop是用Java编写的,所有的API都在那里,随时可以使用。
对于Python / Django我还不知道(但是),但我确信你可以用Hadoop streaming / Jython作为最后的手段。 我找到了以下内容:Hadoopy和Python in Mappers and Reducers。
答案 1 :(得分:7)
Hue,Hadoop的Web UI是based on Django!
答案 2 :(得分:3)
Django可以与大多数RDMS连接,因此您可以将其与基于Hadoop的解决方案一起使用。
请记住,Hadoop有很多东西,所以具体来说,你需要像HBase那样具有低延迟的东西,不要试图将它与Hive或Impala一起使用。
Python有一个基于thrift的绑定,happybase,可以让你查询Hbase。
答案 3 :(得分:1)
Django与Hadoop集成的基本(!)示例 [删除链接]
我使用Oozie REST api执行作业,并使用'hadoop cat'来获取作业结果(由于HDFS的分布式特性)。更好的方法是使用像Hoop这样的东西来获取HDFS数据。无论如何,这不是一个简单的解决方案。
P.S。我重构了这段代码并将其放入https://github.com/Obie-Wan/django_hadoop。 现在它是一个单独的django应用程序。