将Mongodb的表导入到Hive中

Posted lshao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将Mongodb的表导入到Hive中相关的知识,希望对你有一定的参考价值。

1.官方文档:https://docs.mongodb.com/ecosystem/tools/hadoop/

2.Hive介绍:

  Hive特点:

  1.hive是一个数据仓库,和oracle,mysql等数据仓库相比,它底层依赖于hdfs。

  2.hive是sql解析引擎,将sql语句转换成Map/Reduce任务,然后在hadoop hdfs上执行

  3.hive的表其实就是一个目录,hive中表的数据就在文件中

  Hive元数据:

  Hive将元数据存储在数据库中( metastore),支持mysql,derby(默认),oracle

  元数据:包括表的名字,表的列,分区,及属性,表的属性(是否为外部表),以及表的存放目录,不包括任何数据

3.Hive安装:

  Hive运行模式:

    1.嵌入模式:hive的元数据保存在其自带的derby中,同一时间只允许一个连接,多用于demo

    2.本地模式:元数据库在mysql中,mysql与hive在同一物理机器上。

    3.远程模式:同2,只是mysql运行在别的机器上。

  本地模式的安装:用mysql存储元数据

    1.安装mysql(参考官网)

    2.将mysql java-driver放入$Hive_HOME/lib中

    3.创建hive-site.xml,如下,注意文件名强制是这个。  

     同时注意&在xml中需要转义处理,即&

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
  <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&amp;connectTimeout=10000</value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>hivemeta</value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>hivemeta</value>
  </property>
</configuration>

  注意你在xml种写的user应该在mysql种有远程登录的权限

    创建mysql用户并赋予全部权限,先root账户登录,再执行

    grant all privileges on *.* to [email protected]"%" identified by "testhive"  // *.*代表所有表,“%“代表出本机以外的所有ip,testhive为用户名和密码

    grant all privileges on *.* to [email protected]"localhost" identified by "testhive"

    flush privileges

  3.启动mysql.

  4.执行bin/hive,输入show tables,输出OK,则安装成功。

    如果出现 FAILED: SemanticException org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient,或是hive中输入任何命令都无反应,则说明metastore启动失败,表示你的元数据连接方面失败。此时执行

    hive -hiveconf hive.root.logger=debug,console -service metastore 启动mestore并设置错误信息级别,根据错误信息排错。

    还可netstat -an|grep 3306查看mysql端口连接情况,如果hive元数据库连接成功,连接状态应该是established.

4.开始导入数据 

   1.确保hive可以正常使用。

   2.参考https://github.com/mongodb/mongo-hadoop/wiki/Hive-Usage

   3.如果你的hive版本和我一样也是2.3.x,那么恭喜你,因为会遇到许多的classNotfoundException

   4.具体步骤:

      1.下载3个包:core, hive, and the Java driver,导入到lib中

      2.根据自己的业务规则编写sql。

      3.执行hive -hiveconf hive.root.logger=debug,console -f xxx.sql。

      4.如果返回ok,恭喜,你的整套流程执行成功,如果失败,别急,其实你只是缺少了某些包。

      5.以我hive2.3.3+mongodb4.x的环境来说,遇到了很多问题:

        1.sql解析失败,sql文件中需要‘;‘作为行结束符

        2.类..serde2未找到,然后我看了MongostorageHandler代码并发现这个类只在1.x的hive中才有,就只能下载并拿到jar包

        3.总之缺什么类就给什么包,用jar -vtf|grep 看包内是否有那个类,然后确定有之后导入到lib中即可。

5.完成简单的hello world流程

    


以上是关于将Mongodb的表导入到Hive中的主要内容,如果未能解决你的问题,请参考以下文章

sparkSQL来完成对Hive的操作

如何通过单击适配器类中代码的项目中的删除按钮来删除列表视图中的项目后重新加载片段?

怎样用sqoop把navicat for mysql 里的表导入到hive中

MongoDB数据导入Hive

如何把hive导出到本地的表导入mysql中

Sqoop hive导出到mysql[转]