HDP:使用Hive Thrift通过JDBC访问Spark RDD表

时间:2015-11-13 14:10:27

标签: jdbc apache-spark hive thrift spark-streaming

我使用Spark Streaming在滑动窗口中分析推文。由于不想保存所有数据而只保存窗口的当前数据,我希望直接从内存中查询数据。

我的问题与此问题非常相似:

How to Access RDD Tables via Spark SQL as a JDBC Distributed Query Engine?

这是我的代码的重要部分:

sentimentedWords.foreachRDD { rdd =>
  val hiveContext = new HiveContext(SparkContext.getOrCreate())
  import hiveContext.implicits._
  val dataFrame = rdd.toDF("sentiment", "tweet")

  dataFrame.registerTempTable("tweets")
  HiveThriftServer2.startWithContext(hiveContext)
}

我发现HiveThriftServer2.startWithContext(hiveContext)行启动了一个新的ThriftServer,它应该通过JDBC提供对tempTable的访问。但是,我在控制台中收到以下异常:

org.apache.thrift.transport.TTransportException: Could not create ServerSocket on address 0.0.0.0/0.0.0.0:10000.
    at org.apache.thrift.transport.TServerSocket.<init>(TServerSocket.java:93)
    at org.apache.thrift.transport.TServerSocket.<init>(TServerSocket.java:79)
    at org.apache.hive.service.auth.HiveAuthFactory.getServerSocket(HiveAuthFactory.java:236)
    at org.apache.hive.service.cli.thrift.ThriftBinaryCLIService.run(ThriftBinaryCLIService.java:69)
    at java.lang.Thread.run(Thread.java:745)

由于我使用的是Hortonworks数据平台(HDP),默认的Hive Thrift服务器已经在使用端口10000了!我登录Ambari并按如下方式更改了端口:

<property>
  <name>hive.server2.thrift.http.port</name>
  <value>12345</value>
</property>

<property>
  <name>hive.server2.thrift.port</name>
  <value>12345</value>
</property>

但这让事情变得更糟。现在Ambari表明,由于一些ConnectionRefused错误,它无法启动服务。像10001这样的其他港口也不起作用。重启Hive后,端口10000仍在使用中。

我假设如果我可以将端口10000用于我的Spark应用程序/ ThriftServer并将默认的Hive ThriftServer移动到其他端口,那么一切都应该没问题。或者我也可以告诉我的应用程序在另一个端口上启动ThriftServer,但我不知道这是否可能。

有什么想法吗?

补充评论: 杀死侦听端口10000的服务无效。

1 个答案:

答案 0 :(得分:1)

我最终解决了以下问题:

当我使用Spark Streaming时,我的工作是在无限循环中运行。在循环中,我有了启动Thrift服务器的行:

HiveThriftServer2.startWithContext(hiveContext)

这导致我的控制台被发送垃圾邮件&#34;无法创建ServerSocket&#34;消息。我忽略了我的代码工作正常,我只是意外地尝试启动多个服务器......尴尬。

还有一点值得一提: 如果您使用的是Hortonworks HDP:请勿使用beeline命令启动直线。启动&#34;更正&#34;可以在$SPARK_HOME/bin/beeline中找到的直线。这花了我几个小时才发现!我不知道常规beeline有什么问题,而且此时我不再在乎诚实......

除此之外:重新启动HDP Sandbox后,Ambari的ConnectionRefused问题也消失了。