hive.HiveImport:失败:SemanticException [错误 10072]:数据库不存在:

hive.HiveImport: FAILED: SemanticException [Error 10072]: Database does not exist:

我正在尝试将 MySQL 数据库导入 Hive 以根据 Blog 分析大型 MySQL 数据有几种方法这样做

  1. 非实时:Sqoop
  2. 实时:MySQL
  3. 的 Hadoop 应用程序

所以我决定采用“非实时”方法,我已经设置了具有 4 个节点的 Hadoop 集群、Sqoop 和 Hive,它们在以下版本中运行良好

名称 版本

Apache Hadoop 2.6.0

Apache Hive hive-0.14.0

Apache Sqoop sqoop-1.4.5.bin__hadoop-2.0.4-alpha

现在,当我尝试使用以下命令导入数据时

导入命令

sqoop-import-all-tables --verbose --connect jdbc:mysql://X.X.X.X/edgeowt --username root -P --hive-import --warehouse-dir /user/hive/warehouse --hive-database edgeowt.db  --hive-overwrite

然后我收到以下错误

错误

INFO hive.HiveImport: FAILED: SemanticException [Error 10072]: Database does not exist: edgeowt.db
15/04/16 13:32:09 ERROR tool.ImportAllTablesTool: Encountered IOException running import job: java.io.IOException: Hive exited with status 88

我使用 Hiveserver2 登录并检查数据库,但我可以看到给定的数据库

$HIVE_HOME/bin>beeline
beeline> !connect jdbc:hive2://localhost:10000 scott tiger org.apache.hive.jdbc.HiveDriver
0: jdbc:hive2://localhost:10000> show databases;
+----------------+--+
| database_name  |
+----------------+--+
| default        |
| edgeowt        |
+----------------+--+

查看 HDFS 文件系统 Web 界面后 我意识到 DB 的所有者是不同的

Permission  Owner   Group       Size    Replication Block Size  Name
drwxr-xr-x  hduser  supergroup  0 B 0       0 B     candidate
drwxr-xr-x  scott   supergroup  0 B 0       0 B     edgeowt.db
drwxr-xr-x  scott   supergroup  0 B 0       0 B     hd_temperature

因为我正在尝试使用 hduser 导入数据,并且数据库是使用 scott 用户创建的。 我尝试使用以下命令[=20]在edgeowt.db上将ALL权限授予hduser =]

0: jdbc:hive2://localhost:10000>GRANT ALL ON DATABASE edgeowt TO USER hduser;

并检查

0: jdbc:hive2://localhost:10000> SHOW GRANT ON DATABASE edgeowt;
+-----------+--------+------------+---------+-----------------+-----------------+------------+---------------+----------------+----------+--+
| database  | table  | partition  | column  | principal_name  | principal_type  | privilege  | grant_option  |   grant_time   | grantor  |
+-----------+--------+------------+---------+-----------------+-----------------+------------+---------------+----------------+----------+--+
| edgeowt   |        |            |         | admin           | ROLE            | ALL        | false         | 1429170366000  | scott    |
| edgeowt   |        |            |         | hduser          | USER            | ALL        | false         | 1429170906000  | scott    |
+-----------+--------+------------+---------+-----------------+-----------------+------------+---------------+----------------+----------+--+

但是无法解决这个错误,那么我该如何解决这个问题呢?或者解决这个问题的任何一点都会有所帮助。

~/.bashrc

# Set JAVA_HOME (we will also configure JAVA_HOME directly for Hadoop later on)
export JAVA_HOME=/usr/lib/jvm/java-7-oracle
# Set Hadoop-related environment variables
export HADOOP_INSTALL=/opt/hadoop
export PATH=$PATH:$HADOOP_INSTALL/bin
export PATH=$PATH:$HADOOP_INSTALL/sbin
export HADOOP_MAPRED_HOME=$HADOOP_INSTALL
export HADOOP_COMMON_HOME=$HADOOP_INSTALL
export HADOOP_HDFS_HOME=$HADOOP_INSTALL
export YARN_HOME=$HADOOP_INSTALL
export HADOOP_HOME=$HADOOP_INSTALL

# Set hive home 
export HIVE_HOME=/opt/hive
export PATH=$PATH:$HIVE_HOME/bin

# Set HCatlog home 
export HCAT_HOME=$HIVE_HOME/hcatalog
export PATH=$PATH:$HCAT_HOME/bin

# Set Sqoop home
export HADOOP_OPTS="$HADOOP_OPTS -Djava.library.path=$HADOOP_HOME/lib/native"
export SQOOP_HOME=/opt/sqoop
export SQOOP_CONF_DIR="$SQOOP_HOME/conf"
export SQOOP_CLASSPATH="$SQOOP_CONF_DIR"
export PATH=$PATH:$SQOOP_HOME/bin

编辑

尝试了以下命令仍然有同样的错误

sqoop-import-all-tables --verbose --connect jdbc:mysql://X.X.X.X/edgeowt --username root -P --hive-import --warehouse-dir /user/hive/warehouse --hive-database edgeowt --hive-overwrite

您是否在 hive-env.sh

中导出 hive_conf_dir

export HIVE_CONF_DIR="/etc/hive/conf" ---你的hive配置路径

sqoop-import-all-tables --verbose --connect jdbc:mysql://X.X.X.X/edgeowt --username root -P --hive-import --warehouse-dir /user/hive/warehouse --hive-database edgeowt.db --hive-overwrite

--hive-database edgewot.db 更改为 --hive-table edgewot.db,其中 edgewot 是您的 Hive 数据库名称,db 是您的 Hive 表名。

sqoop-import-all-tables --verbose --connect jdbc:mysql://X.X.X.X/edgeowt --username root -P --hive-import --warehouse-dir /user/hive/warehouse --hive-table edgeowt.db  --hive-overwrite

NOTE: There is no --hive-database options in sqoop-1.4.5. Please refer table 8 Hive Arguments of Section 7.2.11 in http://sqoop.apache.org/docs/1.4.5/SqoopUserGuide.html

--替代方法--

如果 sqoop import-all-tables 失败,请尝试以下步骤:

1./usr/local(本地文件系统)中创建一个名为 hivetables 的文件夹。更改文件夹 sudo chmod -R 777 /usr/local/hivetables.

的权限

2./usr/local/hivetables 中创建名为 sqoop-hive.sh 的 shell 脚本并更改此文件的权限 sudo chmod -R 777 /usr/local/hivetables/sqoop-hive.sh

3. 将此粘贴到 sqoop-hive.sh 文件中:

#!/bin/sh
#tabfold="/usr/local/hivetables"
#cd $tabfold
mysql -u  -p -N information_schema -e "select table_name from tables where table_schema = ''" > /usr/local/hivetables/tables.txt
HOSTFILE="/usr/local/hivetables/tables.txt"
for host in $(cat $HOSTFILE)
do
   $SQOOP_HOME/bin/sqoop import --connect jdbc:mysql://localhost:3306/ --table $host --username  --password  --hive-import --hive-table .$host --warehouse-dir /user/hive/warehouse
done

4. 执行 shell 脚本作为 sh /usr/local/hivetables/sqoop-hive.sh MYSQLUSERNAME MYSQLPASSWORD MYSQLDATABASE HIVEDATABASE

NOTE: The mysql command exports the table names in mysql databse into a text file. For loop reads the tables file and executes sqoop command for each table name.

最后我在阅读论坛关于同一问题的讨论时自己得到了答案here.

问题出在 Hive Metastore 配置,Hive Metastore 配置有三种类型

  1. 嵌入式 Metastore(默认 Metastore 部署模式)。
  2. 本地 Metastore。
  3. 远程 Metastore。

我的 Hive Metastore 配置是默认配置。正如 Configuring the Hive Metastore 的 cloudera 文档中提到的那样, 我将 Metastore 配置从 Embedded (Default) 更改为 Remote Metastore 并开始为我工作。

有关 Metastore 配置的更多信息,请使用以下 Cloudera 文档。

Configuring the Hive Metastore

Sqoop 命令

sqoop-import-all-tables --connect jdbc:mysql://X.X.X.X/edgeowt --username root -P --hive-import --hive-database edgeowt --hive-overwrite -m 4

我在 cloudera 使用包裹模式的 quickstart VM 上遇到了完全相同的错误。

我复制了 hive-site.xml 到 sqoop conf 目录:

sudo cp /etc/hive/conf/hive-site.xml /etc/sqoop/conf/

这个技巧解决了问题。