为啥 Impala 表定义不复制?

Posted

技术标签:

【中文标题】为啥 Impala 表定义不复制?【英文标题】:Why Don't Impala Table Definitions Replicate?为什么 Impala 表定义不复制? 【发布时间】:2013-10-29 00:17:43 【问题描述】:

我使用 CDH 4.7(包括 Impala 1.1)创建了一个简单的四节点 Hadoop 集群。我能够将 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

是否需要执行一些命令才能让所有 impalads 在数据节点上运行以创建可查询的表?

【问题讨论】:

【参考方案1】:

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

在 Impala 1.1 和更早版本中,您需要发出明确的“使元数据无效”命令,以使在其他节点上创建的表对本地 Impala 守护进程可见。

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

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

【讨论】:

【参考方案2】:

我也遇到了同样的问题,但没有被解决

invalidate metadata;

原来我的蜂巢正在访问一个本地 derby 数据库,而 impala 看不到该数据库。

确凿证据:

在我通过 hive 导入表的系统上,我有

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 重新部署了 hive 客户端配置。

之后:

  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 应该部署客户端配置,但在某些版本中它有时会失败。

【讨论】:

以上是关于为啥 Impala 表定义不复制?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Impala 不能在 hbase 表上工作?

如果无效元数据可以做同样的事情,为啥需要在 Impala 中刷新

为啥从 BigDecimal 转换为 DECIMAL 时 impala-jdbc 会抛出异常?

为啥数组值出现在 impala 中而不是 hive 中?

为啥 Cloudera 的 Impala 还在“孵化”?

为分区数据定义 Impala 表模式