<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>liprais</title>
    <link>https://ruby-china.org/liprais</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>Proof of concept：在 Ruby 里面用 spark</title>
      <description>&lt;p&gt;最近失业在家，搞点好玩的，于是看看能不能给 apache spark 做个 ruby 的 api, 毕竟 python 都有了，ruby 应该也能做，何况还有 JRuby.&lt;/p&gt;

&lt;p&gt;因为用 spark-sql 比较多，就先试试 spark-sql 这个模块&lt;/p&gt;

&lt;p&gt;一开始想走捷径，直接在 jruby 里面 java_import Spark 的类，发现不行，报错。&lt;/p&gt;

&lt;p&gt;还是先研究了一下 python api 是怎么做的：&lt;/p&gt;

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

&lt;p&gt;那边通过 socket 来传递消息，这样暴露了一些 spark 的内部类和对象给 python 这边调用。&lt;/p&gt;

&lt;p&gt;于是打算实现一下 py4j 的机制，只要我用 ruby 给 py4j 的 GatewayServer 发消息就好啦。&lt;/p&gt;

&lt;p&gt;然而还是懒&lt;/p&gt;

&lt;p&gt;于是刚才去面试完回来想着没准我自己实现一个 java 类，把 spark 的方法包起来就能调用了，于是赶紧实验了下：&lt;/p&gt;

&lt;p&gt;这是 java 的类&lt;/p&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.apache.spark.sql.DataFrameReader&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.apache.spark.sql.SparkSession&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Proof&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;SparkSession&lt;/span&gt; &lt;span class="nf"&gt;Initial&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;SparkSession&lt;/span&gt; &lt;span class="n"&gt;spark&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SparkSession&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;master&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"local[*]"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getOrCreate&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;spark&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;DataFrameReader&lt;/span&gt; &lt;span class="nf"&gt;reader&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;SparkSession&lt;/span&gt; &lt;span class="n"&gt;spark&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;DataFrameReader&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;spark&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;read&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;};&lt;/span&gt;

    &lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这是 ruby 调用的代码&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'java'&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'./jruby_spark_bridge_jar/jruby-spark-bridge.jar'&lt;/span&gt;

&lt;span class="n"&gt;java_import&lt;/span&gt; &lt;span class="s1"&gt;'Proof'&lt;/span&gt;


&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Proof&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;spark&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Initial&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;spark&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;spark&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sql&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"select 1"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;好像这样就暴露出来 sparksession 上的一些方法，我试了下是可以读取一个 csv 文件返回一个 dataset 对象的。&lt;/p&gt;

&lt;p&gt;貌似这样就可以在 jruby 里面写 spark 了&lt;/p&gt;

&lt;p&gt;啥，你问我有啥实际意义？&lt;/p&gt;

&lt;p&gt;并没有，只是为了好玩&lt;/p&gt;</description>
      <author>liprais</author>
      <pubDate>Fri, 04 Aug 2017 17:01:01 +0800</pubDate>
      <link>https://ruby-china.org/topics/33730</link>
      <guid>https://ruby-china.org/topics/33730</guid>
    </item>
    <item>
      <title>HiveQL ast visualizer</title>
      <description>&lt;p&gt;做了个 hiveQL 内部的 Abstract Syntax Tree 的 visualizer，方便自己进一步的了解 hive 的 query processing. 
用了 JRuby &amp;amp; Sinatra &amp;amp; D3 &lt;/p&gt;

&lt;p&gt;github: &lt;a href="https://github.com/liprais/hive_ast_tree_vis" rel="nofollow" target="_blank"&gt;https://github.com/liprais/hive_ast_tree_vis&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;另外还部署在了 herouku 上 
heroku 链接：&lt;a href="https://afternoon-refuge-4404.herokuapp.com/" rel="nofollow" target="_blank"&gt;https://afternoon-refuge-4404.herokuapp.com/&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;暂时展示页面还比较简陋，会慢慢完善 
欢迎吐槽&lt;/p&gt;</description>
      <author>liprais</author>
      <pubDate>Tue, 19 May 2015 21:50:38 +0800</pubDate>
      <link>https://ruby-china.org/topics/25655</link>
      <guid>https://ruby-china.org/topics/25655</guid>
    </item>
  </channel>
</rss>
