从Apache Spark

时间:2016-11-21 13:25:07

标签: hadoop apache-spark amazon-ec2 hive apache-spark-sql

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

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

启动了dfs

我已按照here上的步骤安装了Apache Hive。我已经开始了hiverserver2和hive metadatastore。我在配置单元中配置了apache derby db(服务器模式)。我已经创建了一个示例表' web_log'并使用beeline在其中添加了几行。

我在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]

列及其类型与示例表&#39; web_log&#39;匹配。我创造了。 现在当我执行scala> 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实例访问配置单元?

1 个答案:

答案 0 :(得分:2)

将以下代码段添加到您正在运行的程序

hiveContext.getConf.getAll.mkString("\n")这将打印出哪个hive metastore连接到......你可以查看所有不正确的属性。

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

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