上传 Spark RDD 到 REST webservice POST 方法

Posted

技术标签:

【中文标题】上传 Spark RDD 到 REST webservice POST 方法【英文标题】:Upload Spark RDD to REST webservice POST method 【发布时间】:2016-02-24 23:08:59 【问题描述】:

坦率地说,我不确定这个功能是否存在?很抱歉

我的要求是每天将spark分析的数据发送到文件服务器,文件服务器支持通过SFTP和REST Webservice post call进行文件传输。

最初的想法是将 Spark RDD 保存到 HDFS 并通过 SFTP 传输到文件服务器。 我想知道是否可以通过从 spark 驱动程序类调用 REST 服务直接上传 RDD 而无需保存到 HDFS。 数据大小小于2MB

对不起,我的英语不好!

【问题讨论】:

【参考方案1】:

Spark 没有特定的方法可以做到这一点。对于这种数据大小,通过 HDFS 或其他类型的存储是不值得的。您可以在驱动程序的内存中收集该数据并直接发送。对于 POST 调用,您可以使用普通的旧 java.net.URL,它看起来像这样:

import java.net.URL, HttpURLConnection

// The RDD you want to send
val rdd = ???

// Gather data and turn into string with newlines
val body = rdd.collect.mkString("\n")

// Open a connection
val url = new URL("http://www.example.com/resource")
val conn = url.openConnection.asInstanceOf[HttpURLConnection]

// Configure for POST request
conn.setDoOutput(true);
conn.setRequestMethod("POST");

val os = conn.getOutputStream;
os.write(input.getBytes);
os.flush;

关于使用java.net.URL 的更完整的讨论可以在this question 找到。您还可以使用 Scala 库为您处理丑陋的 Java 内容,例如 akka-http 或 Dispatch。

【讨论】:

我想指出的是,您实际上并不需要 collect() 将结果发布到 Web 服务。如果使用的是 RDD——而不是结果的集合——每个执行器都会为它的分区进行 Web 服务调用。在某些情况下可能需要并行 Web 服务请求。 好吧,就我而言,我无法收集 rdd 否则 OutOfMemoryError)【参考方案2】:

Spark 本身不提供此功能(它不是通用的 http 客户端)。 您可以考虑使用一些现有的 REST 客户端库,例如 akka-http、spray 或其他一些 java/scala 客户端库。

也就是说,在对数据进行操作之前,您没有义务将数据保存到磁盘。例如,您可以结合 REST 客户端库在 RDD 上使用 collect()foreach 方法。

【讨论】:

以上是关于上传 Spark RDD 到 REST webservice POST 方法的主要内容,如果未能解决你的问题,请参考以下文章

Spark RDD案例:计算总成绩

Spark程序进行单元测试-使用scala

从 Apache Spark 分段上传到 Amazon S3

Spark 广播连接将数据加载到驱动程序

Spark RDD理解

Spark核心-RDD