来自 Apache Spark 的外部配置单元中存在的查询表 [重复]

Posted

技术标签:

【中文标题】来自 Apache Spark 的外部配置单元中存在的查询表 [重复]【英文标题】:Query tables present in external hive from Apache Spark [duplicate] 【发布时间】:2016-11-21 13:25:06 【问题描述】:

我对 hadoop 生态系统比较陌生。我的目标是使用 Apache Spark 读取配置单元表并进行处理。 Hive 在 EC2 实例中运行。而 Spark 在我的本地机器上运行。

为了做一个原型,我按照here 上的步骤安装了 Apache Hadoop。我还添加了必需的环境变量。 我已经使用$HADOOP_HOME/sbin/start-dfs.sh开始了dfs

我已经按照here 上的步骤安装了 Apache Hive。我已经启动了 hiverserver2 和 hive 元数据存储。我已经在 hive 中配置了 apache derby db(服务器模式)。我创建了一个示例表“web_log”并使用直线在其中添加了几行。

我在hadoop core-site.xml下面添加了

  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://localhost:9000</value>
  </property>

并在hdfs-site.xml下面添加

<property>
        <name>dfs.client.use.datanode.hostname</name>
        <value>true</value>
</property>

我在本地 spark 实例的 $SPARK_HOME/conf 中添加了 core-site.xml、hdfs-site.xml 和 hive-site.xml

core-site.xml 和 hdfs-site.xml 为空。即

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
</configuration>

hive-site.xml 有以下内容

<configuration>
  <property>
    <name>hive.metastore.uris</name>
    <value>thrift://ec2-instance-external-dbs-name:9083</value>
    <description>URI for client to contact metastore server</description>
  </property>
</configuration>

我已经启动了 spark-shell 并执行了以下命令

scala> sqlContext
res0: org.apache.spark.sql.SQLContext = org.apache.spark.sql.hive.HiveContext@57d0c779

看来 spark 已经创建了 HiveContext。 我已经使用以下命令执行了 sql

scala> val df = sqlContext.sql("select * from web_log")
df: org.apache.spark.sql.DataFrame = [viewtime: int, userid: bigint, url: string, referrer: string, ip: string]

列及其类型与我创建的示例表“web_log”相匹配。 现在当我执行scala&gt; df.show 时,花了一些时间并抛出错误

16/11/21 18:46:17 WARN BlockReaderFactory: I/O error constructing remote block reader.
org.apache.hadoop.net.ConnectTimeoutException: 60000 millis timeout while waiting for channel to be ready for connect. ch : java.nio.channels.SocketChannel[connection-pending remote=/ec2-instance-private-ip:50010]
    at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:533)
    at org.apache.hadoop.hdfs.DFSClient.newConnectedPeer(DFSClient.java:3101)
    at org.apache.hadoop.hdfs.BlockReaderFactory.nextTcpPeer(BlockReaderFactory.java:755)

似乎 DFSClient 正在使用 EC2 实例内部 IP。 AFAIK,我没有在端口 50010 上启动任何应用程序。

我需要安装和启动任何其他应用程序吗?

如何确保 DFSClient 使用 EC2 实例外部 IP 或外部 DNS 名称?

是否可以从外部 spark 实例访问 hive?

【问题讨论】:

【参考方案1】:

将下面的代码 sn-p 添加到您正在运行的程序中,

hiveContext.getConf.getAll.mkString("\n") 这将打印它连接到哪个配置单元元存储...您可以查看所有不正确的属性。

如果它们不是您想要的,并且您无法调整... 由于某些限制,然后如link 所述。你可以试试 像这样指向正确的uris ...等

hiveContext.setConf("hive.metastore.uris", "thrift://METASTOREl:9083");

【讨论】:

它有助于摆脱所发布的错误。现在我在 hiveContext 中设置 hive.metastore.uris。但是现在,我收到了这个错误 java.net.ConnectException: Call From delhi/127.0.1.1 to localhost:9000 failed on connection exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 。似乎 spark 正在尝试使用 localhost 访问 hdfs。我已经尝试在 hiveContext 中设置fs.defaultFS,但没有用。请帮助我 以上错误是因为无法连接到指定主机 但是为什么我将 Metastore uri 设置为 EC2 实例,但它却试图访问 localhost?如何配置使用 EC2 实例主机?

以上是关于来自 Apache Spark 的外部配置单元中存在的查询表 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 spark 中创建带有模式的配置单元外部表

Spark Scala创建外部配置单元表不使用位置作为变量

使用 Java 将数据存储为 Apache Spark 中的配置单元表

Spark实例-spark读取外部配置文件之--files

从 spark 插入到集群配置单元表

无头模式下 HDP 3.1 上的 spark 3.x 与配置单元 - 未找到配置单元表