JRuby Proof of concept:在 Ruby 里面用 spark

liprais · 2017年08月04日 · 最后由 whitewoodcity 回复于 2017年08月04日 · 6507 次阅读

最近失业在家,搞点好玩的,于是看看能不能给 apache spark 做个 ruby 的 api, 毕竟 python 都有了,ruby 应该也能做,何况还有 JRuby.

因为用 spark-sql 比较多,就先试试 spark-sql 这个模块

一开始想走捷径,直接在 jruby 里面 java_import Spark 的类,发现不行,报错。

还是先研究了一下 python api 是怎么做的:

看了几天代码,发现是用 py4j 这个模块做的,仔细研究了一下,发现是用 p4yj 的 javagatewayServer 在 Java 这边开了个 server,然后 python

那边通过 socket 来传递消息,这样暴露了一些 spark 的内部类和对象给 python 这边调用。

于是打算实现一下 py4j 的机制,只要我用 ruby 给 py4j 的 GatewayServer 发消息就好啦。

然而还是懒

于是刚才去面试完回来想着没准我自己实现一个 java 类,把 spark 的方法包起来就能调用了,于是赶紧实验了下:

这是 java 的类

import org.apache.spark.sql.DataFrameReader;
import org.apache.spark.sql.SparkSession;

public class Proof {

    public SparkSession Initial(String[] args) {
        SparkSession spark = SparkSession.builder().master("local[*]").getOrCreate();
        return spark;
    }

    public DataFrameReader reader(SparkSession spark) {
        DataFrameReader reader = spark.read();
        return reader;
    };

    ;
}

这是 ruby 调用的代码

require 'java'
require './jruby_spark_bridge_jar/jruby-spark-bridge.jar'

java_import 'Proof'


a = Proof.new
puts spark = a.Initial([])
puts spark.methods.sort
df = spark.sql("select 1")

好像这样就暴露出来 sparksession 上的一些方法,我试了下是可以读取一个 csv 文件返回一个 dataset 对象的。

貌似这样就可以在 jruby 里面写 spark 了

啥,你问我有啥实际意义?

并没有,只是为了好玩

好玩吧?在 vert.x 上写 ruby 更好玩,可以跟其他语言几乎是无缝集成

需要 登录 后方可回复, 如果你还没有账号请 注册新账号