HBase/Hadoop的流式作业与Java使用相比是否有功能损失?
抱歉如果这个问题听起来很基础。我正在读一本关于HBase的书,正在学习,但书中的大部分例子(以及网上的例子)都倾向于使用Java(我想是因为HBase是用Java开发的)。虽然有一些Python的例子,我知道可以通过Python访问HBase(使用Thrift或其他模块),但我想知道还有哪些额外的功能?
举个例子,HBase有一个叫“协处理器”的功能,可以把数据推送到你进行计算的地方。请问这种功能在Python或者其他使用流式Hadoop作业的应用中能用吗?看起来在Java中,它可以知道你在做什么,并相应地管理数据流,但在流式处理时,这种功能是怎么运作的?如果不能用,有没有办法在不换语言的情况下实现这种功能?
也许换个问法就是……非Java程序员在流式处理时,如何才能获得Hadoop的所有功能优势?
提前谢谢你!
2 个回答
是的,你应该通过流式处理来实现本地代码执行。也就是说,你不是把数据推送到程序所在的地方,而是把程序推送到数据所在的地方。流式处理就是把本地输入的数据通过标准输入(stdin)传递给你的Python程序。这样,每个映射(map)就不是在Java任务里运行,而是启动一个Python程序的实例,然后把输入数据直接传递给它。
不过,如果你真的想要快速处理数据,还是应该学习Java。因为把所有东西都通过标准输入和标准输出(stdout)传递,会增加很多额外的负担。
据我所知,你提到的其实是两个(或更多)完全不同的概念。
“Hadoop Streaming”是用来通过你的可执行文件来处理数据的,这和你选择的编程语言无关。使用流处理时,功能不会丢失,因为基本上就是对从Hadoop流中获取的数据进行简单的映射和归约。
在Hadoop的部分,你甚至可以使用像Pig或Hive这样的“大数据查询语言”来高效地完成任务。最新版本的Pig甚至允许你用Python编写自定义函数,并在Pig脚本中使用它们。
虽然有一些工具可以让你使用自己熟悉的语言,但别忘了Hadoop框架主要是用Java写的。有时候你可能需要编写一个特定的输入格式,或者在Pig中写一个用户定义的函数(UDF)等。这时,掌握一些Java知识会很有帮助。
你提到的“HBase协处理器”例子和Hadoop的流处理功能有点不相关。HBase协处理器分为两部分:服务器端和客户端。我相信在HBase的发布版本中会有一些有用的服务器端协处理器,但除此之外,你可能需要自己编写协处理器(坏消息是:这也是用Java写的)。至于客户端,我相信你可以通过Thrift用你喜欢的编程语言来使用它们,问题不大。
所以,针对你的问题:你可以选择不学习Java,依然可以充分利用Hadoop(使用第三方库或应用)。但当遇到问题时,了解底层内容会更好,这样你才能用Java进行开发。掌握Java会让你对Hadoop/HBase环境有更全面的控制。
希望这些信息对你有帮助。