最近失业在家,搞点好玩的,于是看看能不能给 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 了
啥,你问我有啥实际意义?
并没有,只是为了好玩