我使用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的服务无效。
答案 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问题也消失了。