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

HDP: Make Spark RDD Tables accessible via JDBC using Hive Thrift

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

我的问题与这个问题几乎相同:

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

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),端口 10000 已被默认的 Hive Thrift 服务器使用!我登录到 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 application/ThriftServer 并将默认的 Hive ThriftServer 移动到其他端口,那么一切都应该没问题。或者,我也可以告诉我的应用程序在不同的端口上启动 ThriftServer,但我不知道这是否可行。

有什么想法吗?

补充说明: 杀死监听端口 10000 的服务没有效果。

我终于解决了如下问题:

因为我正在使用 Spark Streaming,所以我的工作是 运行 无限循环。在循环中,我有启动 Thrift Server 的行:

HiveThriftServer2.startWithContext(hiveContext)

这导致我的控制台收到 "Could not create ServerSocket" 消息的垃圾邮件。我忽略了我的代码工作正常,我只是不小心尝试启动多个服务器......尴尬。

同样重要的是: 如果您使用的是 Hortonworks HDP:请勿使用 beeline 命令启动直线。开始可以在 $SPARK_HOME/bin/beeline 中找到的 "correct" 直线。这花了我几个小时才发现!我不知道常规 beeline 有什么问题,老实说,此时我不在乎了...

除此之外:在我的 HDP 沙箱重启后,Ambari 的 ConnectionRefused 问题也消失了。