当前位置: 首页 > 工具软件 > MapR > 使用案例 >

将MapR与Ruby集成:JRuby上的MapR-DB和MapR流入门

孟征
2023-12-01

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-101https的影响很大: //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)
else
    table = 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/<username/ ,并且您的用户有权读写该目录。

在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

 类似资料: