mapr-fs 架构
MapR Streams和MapR-DB都是MapR融合数据平台中非常激动人心的开发。 在这篇博客文章中,我将向您展示如何获取Ruby代码以与MapR-DB和MapR Streams进行本机交互。 我是Ruby开发人员,并且HBase和Kafka的现有Ruby客户端/库在MapR等效项下无法正常工作。 因此,我着手寻找一种方法来使Ruby代码与这两种MapR技术进行本地对话。 我决定探索将Java示例移植到JRuby的方法,效果很好。 这篇文章中包含几个Java示例,因此我还将引导您逐步了解如何将Java代码移植到JRuby(Ruby的全线程Java实现)。 让我们开始吧!
这篇文章的源代码可以在https://github.com/rvictory/MapR-JRuby-Demos中找到,并且受https://github.com/mapr-demos/maprdb-ojai-101和https的影响很大: //github.com/mapr-demos/mapr-streams-sample-programs
基础知识–加载MapR客户端库
JRuby尽最大努力保持Ruby约定,同时允许您与Java代码和库进行接口。 但是,为了使其“查找” Java类,您需要像加载Gem或另一个Ruby源文件一样加载它们的JAR。 为了加载所有内容,我采取了非常笨拙的方法(据我所知,这不会影响性能)。 基本上,我准备了脚本,以能够引用任何MapR JAR,并且在每个Ruby脚本的顶部都包含以下几行:
包含Java
Dir["/opt/mapr/lib/\*.jar"].each { |jar| require jar }
显然,这仅在MapR安装在/ opt / mapr中时才有效; 但是,如果您不在该默认配置下运行,那么更改就足够容易了。
在JRuby中使用MapR-DB
既然我们已经引用了适当的JAR,现在就可以将代码从Java移植到Ruby了。 在大多数情况下,这是一项无缝的任务-只需采用Java中使用的结构并将其制成“ Ruby”即可。 例如,这是MapR-DB演示中的以下代码:
Table table;
if (!MapRDB.tableExists(tableName)) { table = MapRDB.createTable(tableName); // Create the table if not already present } else { table = MapRDB.getTable(tableName); // get the table
}
成为:
table = nil
if !MapRDB.tableExists(tableName)table = MapRDB.createTable(tableName)
elsetable = MapRDB.getTable(tableName)
end
需要注意的一件事是,您需要调用构造函数的实例将按照您可能期望的方式进行处理,即以下Java代码:
Test test = new Test("arguments");
成为以下Ruby代码:
test = Test.new("arguments")
另外,Java泛型在JRuby中也不是“物”(因为无论如何都会推断类型),因此在大多数情况下(至少我发现的情况),您可以简单地忽略它们。 在某些情况下,JRuby编译器/解释器无法确定类型-我还没有遇到过这种情况,但是我敢肯定有一种解决方法。
至于使用MapR-DB,我们可以简单地使用与Java中相同的API:
( http://maprdocs.mapr.com/apidocs/maprdb_json/51/com/mapr/db/MapRDB.html )。 要创建新文档,我们可以采用以下两种方法之一:
document = MapRDB.newDocument().set("_id", "jdoe").set("first_name", "John").set("last_name", "Doe").set("dob", ODate.parse("1970-06-23"))
table.insertOrReplace(document)
或者我们可以使用JSON格式而不是API:
document = MapRDB.newDocument('{"_id" : "test", "first_name" : "John", "last_name" : "Doe", "dob" : "1970-06-23"}')
table.insertOrReplace(document)
对于使用JRuby的MapR-DB的基础知识来说,这差不多了。 请查看源代码文件“ maprdb.rb”以获取完整示例。 值得一提的是,默认情况下,针对当前用户,创建的表存储在MapR-FS的用户目录中。 如果您以不是mapr的用户身份运行,请确保在MapR-FS中为用户创建目录/users/
在JRuby中使用MapR流
现在,我们已经为将Java代码移植到Ruby奠定了基础,Streams代码与MapR-DB代码一样简单。 唯一的区别是原始Java Streams示例使用“属性”文件存储配置,因此我们将这些文件放到与Ruby脚本相同的目录中,它们就会被代码拾取。
除了轻微的更改(使用props文件)之外,该代码还是Java示例中非常简单的端口。 在我的Github页面上查看实际代码,以查看生产者和消费者。 确保使用以下MapR命令创建流(并对执行代码的用户具有适当的权限):
maprcli stream create -path /sample-stream
并使用以下命令创建主题:
maprcli stream topic create -path /sample-stream -topic fast-messages
要允许所有用户与流进行交互,请使用以下命令:
maprcli stream edit -path /sample-stream -produceperm p -consumeperm p -topicperm p
就是这样-示例代码应该可以正常运行。 生产者创建100条消息并将其写到流中,而消费者则选择所看到的任何消息。 Stream的其余操作与Java API的文档相同。 我建议在Stream上移动JSON消息,它允许任何使用者/语言使用数据。
下一步是什么
现在您知道了如何让Ruby与MapR-DB和MapR Streams交互。 我对在未来的项目中使用融合数据平台的前景感到非常兴奋。 可能性是无限的。 展望未来,我打算将Streams和MapR-DB API包装到一个更具“ Ruby风格”的程序包中,并将其作为一般消费的Gem提供。 我还打算编写一个模仿MongoDB使用的查询语法的MapR-DB查询API(基于JSON的查询,而不是基于API的查询)。 完成后,Gem的来源将发布到我的GitHub。 如果您有任何问题,疑问或投诉,请随时与我联系。
谢谢阅读!
翻译自: https://www.javacodegeeks.com/2016/07/integrating-mapr-ruby-getting-started-mapr-db-mapr-streams-jruby.html
mapr-fs 架构