【问题标题】:hive.HiveImport: FAILED: SemanticException [Error 10072]: Database does not exist:hive.HiveImport:失败:SemanticException [错误 10072]:数据库不存在:
【发布时间】:2015-04-16 09:38:22
【问题描述】:

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

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

所以我决定采用“非实时”方法,并且我已经设置了具有 4 个节点、Sqoop 和 Hive 的 Hadoop 集群,可以在以下版本中正常工作

名称 版本

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 用户创建的。 我尝试使用以下命令在 edgeowt.db 上向 hduser 授予 ALL 特权

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

【问题讨论】:

    标签: mysql hadoop hive sqoop hadoop2


    【解决方案1】:

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

    问题在于 Hive Metastore 配置,Hive Metastore 配置分为三种类型

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

    我的 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
    

    【讨论】:

      【解决方案2】:

      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
      

      注意: sqoop-1.4.5 中没有 --hive-database 选项。请参考http://sqoop.apache.org/docs/1.4.5/SqoopUserGuide.html中第 7.2.11 节的表 8 Hive 参数

      --替代方法--

      如果 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 $1 -p$2 -N information_schema -e "select table_name from tables where table_schema = '$3'" > /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/$3 --table $host --username $1 --password $2 --hive-import --hive-table $4.$host --warehouse-dir /user/hive/warehouse
      done
      

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

      注意: mysql 命令将 mysql 数据库中的表名导出到文本文件中。 for 循环读取表文件并为每个表名执行 sqoop 命令。

      【讨论】:

      • 尝试仍然相同的错误错误失败:SemanticException [错误 10072]:数据库不存在:edgeowt
      • sqoop-import-all-tables --verbose --connect jdbc:mysql://192.168.1.49/edgeowt --username root -P --hive-import --warehouse-dir /user /hive/warehouse --hive-table edgewot.db --hive-overwrite -m 4 错误失败:SemanticException [错误 10072]:数据库不存在:edgewot
      • 您得到的错误可能是由于sqoop import-all-tables 命令。我已经使用sqoop import 命令用替代方法更新了我的答案。试试看。
      • $ sh sqoop-hive.sh root ``edgeowt edgeowt ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2 )
      • 以hduser 而非root 运行它。
      【解决方案3】:

      你是否在 hive-env.sh 中导出 hive_conf_dir

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

      【讨论】:

      • 感谢回复我尝试不使用 .db 扩展名仍然得到相同的错误失败:SemanticException [错误 10072]:数据库不存在:edgeowt
      • 是的,我在 $HOME/.bashrc 文件中设置了 HIVE_CONF_DIR 检查我的更新
      【解决方案4】:

      我在 cloudera 使用包裹模式的快速启动虚拟机上遇到了完全相同的错误。

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

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

      这个技巧解决了问题。

      【讨论】:

        猜你喜欢
        • 2015-07-28
        • 1970-01-01
        • 2021-05-24
        • 1970-01-01
        • 2015-04-16
        • 2021-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多