为什么Impala表定义不复制?

时间:2013-10-29 00:17:44

标签: hadoop hdfs impala

我创建了一个简单的四节点Hadoop集群,其中包含CDH 4.7,包括Impala 1.1。我能够将CSV文件复制到HDFS,并按照the tutorial中的描述创建和查询Impala表。但我无法在不同的数据节点上查询同一个表:

[example.com:21000] > select * from tab1;
Query: select * from tab1
ERROR: AnalysisException: Table does not exist: default.tab1

我想也许我需要在第二个节点上重新发出CREATE TABLE语句,但后来它突然知道那里的表:

[example.com:21000] > CREATE EXTERNAL TABLE tab1
                    > (
                    >    id INT,
                    >    col_1 BOOLEAN,
                    >    col_2 DOUBLE,
                    >    col_3 TIMESTAMP
                    > )
                    > ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
                    > LOCATION '/user/dwheeler/sample_data/tab1';
Query: create EXTERNAL TABLE tab1
(
id INT,
col_1 BOOLEAN,
col_2 DOUBLE,
col_3 TIMESTAMP
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/user/theory/sample_data/tab1'
ERROR: AlreadyExistsException: Table tab1 already exists

所以它知道它在那里,但我不能查询它 - 或刷新它:

[example.com:21000] > refresh tab1;
Query: refresh tab1
ERROR: AnalysisException: Table does not exist: default.tab1

我是否需要执行一些命令来获取数据节点上的所有impalad runnig以生成可查询的表?

2 个答案:

答案 0 :(得分:2)

我提交了bug report并得到了答案:

  

在Impala 1.1及更早版本中,您需要发出一个显式的“invalidate metadata”命令,以使在其他节点上创建的表对本地Impala守护程序可见。

     

从Impala 1.2开始,这不是必需的;新的目录服务将负责将元数据分发到集群中的所有impalad。

所以INVALIDATE METADATA我没有注意到。很高兴听到在2.0中没有必要。

答案 1 :(得分:1)

我认为是同样的问题,但

没有解决
invalidate metadata;

原来我的蜂巢正在访问本地德比数据库,这是impala无法看到的。

吸烟枪:

在我通过配置单元导入表格的系统上,我有

cat /etc/hive/conf/hive-site.xml
[...]
<property>
    <name>javax.jdo.option.ConnectionURL</name>
   <value>jdbc:derby:;databaseName=/var/lib/hive/metastore/metastore_db;create=true</value>
    <description>JDBC connect string for a JDBC metastore</description>
</property>
[...]

解决方案:

我从Cloudera Manager重新部署了配置单元客户端配置。

之后:

  cat /etc/hive/conf/hive-site.xml
  [...]
  <property>
    <name>hive.metastore.local</name>
    <value>false</value>
  </property>
  <property>
    <name>hive.metastore.uris</name>
    <value>thrift://[snipped-host-name]:[snipped-port]</value>
  </property>

显然Cloudera Manager应该部署客户端配置,但在某些版本中它有时无法实现。