天天看点

使用 Sqoop 将 30W+ MySQL 数据导入 Hive

本实验完成的是,使用 Sqoop 从 MySQL 导出数据到 Hive.

整体步骤分为:

  1. 初始化 MySQL 的 30W+ 数据
  2. 安装配置 Sqoop
  3. 在 Hive 中初始化目标表
  4. Sqoop 脚本实现导入

1 初始化 MySQL 的 30W+ 数据

MySQL 安装在本机 centOS 上面。

使用 MySQL 官网的表结构创建语句和 30W+ 数据导入语句,初始化数据。

MySQL 官网的数据结构与数据导入语句,都可以从他们的 github 项目上找到:

https://github.com/datacharmer/test_db

2 安装配置 Sqoop

可以从这里下载到最新版本的 sqoop.

官方文档指出, sqoop 1.99 还有些 bug. 除非不得已要使用它的新特性,否则还是安装 sqoop 1.4.7.

我们遵从官网的建议,安装 sqoop 1.4.7.

下载地址:

http://mirrors.shu.edu.cn/apache/sqoop/1.4.7/

安装和配置简单流程如下:

2.1 解压文件安装文件 -> 设置 .bash_profile 的环境变量 SQOOP_HOME -> 设置 .bash_profile 的环境变量 path 使其包含 SQOOP_HOME/bin

2.2 将 MySQLConnector.jar 放到 $SQOOP_HOME/lib 下面。

sqoop 要导出 MySQL 的数据,必须使用 MySQL JDBC Jar 包, MySQLConnector.jar。

2.3 配置 sqoop-env.sh

这份文件是用来指定 Hadoop HDFS, Hive , Hive Conf 等路径信息,尤为重要。

底下两个 bug 都是因为这个文件的配置错误而引起的,后面细说

配置详单如下:

#Set path to where bin/hadoop is available
export HADOOP_COMMON_HOME=/opt/hadoop/hadoop-

#Set path to where hadoop-*-core.jar is available
export HADOOP_MAPRED_HOME=/opt/hadoop/hadoop-

#set the path to where bin/hbase is available
#export HBASE_HOME=

#Set the path to where bin/hive is available
export HIVE_HOME=/opt/hive/apache-hive--bin

#Set the path for where zookeper config dir is
#export ZOOCFGDIR=
           

针对 HBASE_HOME, ZOOCFGDIR 这里特意留空,暂不使用,用 # 注释掉了。

2.4 测试 sqoop 是否安装并能够使用: sqoop version

执行上述命令的时候,报错:

解决方法如下:

参考:

http://blog.csdn.net/shantaodaoshik852/article/details/77266831

复制一份 sqoop.jar 到 $HADOOP_HOME/yarn下面即可:

cp /opt/sqoop/sqoop--cdh5/sqoop--cdh5.jar $HADOOP_HOME/share/hadoop/yarn/sqoop--cdh5.jar
           

其实 sqoop 1.4.7已经在安装目录下有 sqooop.1.4.7.jar文件了,因此不需要重新复制到yarn下。

所以建议大家安装 sqoop 1.4.7

3 在 Hive 中初始化目标表

具体怎么初始化目标表,这里不展开,参考前文即可:

http://blog.csdn.net/wujiandao/article/details/79057089

因为创建语句比较复杂,将语句写入一个文件,以便随时更改,而不用反复在 hive cli 里面敲命令,可以节省不少时间。在 hive cli 里面,执行命令 source 你的创建表结构语句文件 即可。

例如

hive> source employee_table_schema.hql
           

这里 employee_table_schema.hql 就可以存放了创建表结构的语句

4 Sqoop 脚本实现导入

sqoop 的 import 语句比较长, 适合放一个脚本文件,方便修改。

最后使用 source 命令来执行这个脚本,如:

$>source employee_import_from_Mysql.sqp
           

employee_import_from_Mysql.sqp 编辑的就是导入 hive 的脚本:

sqoop import \
--connect jdbc:mysql://localhost:3306/test \
--username HiveAdmin \
--table employees \
--fields-terminated-by ';' \
--delete-target-dir \
--num-mappers  \
--hive-import \
--hive-database default \
--hive-table employees
           

这里我将‘\’ 列出来,如果不是用脚本文件执行导入操作,而是采用命令行格式,那么 ‘\’ 就必不可少了。

因此大家可以直观看到,作为脚本文件的便利性。

这里也参考了一篇文章,写的比较具体,也有原理性的解释:

https://www.cnblogs.com/xuyou551/p/7998846.html

在导入的时候,遇到 3 个问题:

4.1 Exception in thread “main” java.lang.NoClassDefFoundError: org/apache/avro/LogicalType

4.2 ERROR hive.HiveConfig: Could not load org.apache.hadoop.hive.conf.HiveConf. Make sure HIVE_CONF_DIR is set correctly.

4.3 INFO conf.HiveConf: Found configuration file null.

INFO hive.HiveImport: Exception in thread “main”

org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient

4.1 针对 NoClassDefFoundError: org/apache/avro/LogicalType 的问题,解决方法:

问题不在sqoop 1.4.6 与1.4.7 上。而在安装的时候,必须安装 sqoop1.4.7_hadoop2.6.0版本。而不是纯净的sqoop1.4.7版本。可能这个版本里面少了对hadoop的支持。

也就是说, 必须选择编译包含了对 hadoop 支持库的 sqoop 版本。

4.2 Could not load org.apache.hadoop.hive.conf.HiveConf. 问题的解决方法:

ln -s $HIVE_HOME/lib/hive-exec-.jar hive-exec-.jar
           

解决方案在这里:就是找不到hive-exec.jar。还是google有用

Essentially the issue boiled down to Sqoop at runtime not finding Hive

libraries as well as executables.

— one way to fix this issue – create a link from sqoop lib to hive lib where hive-exec.jar is located in every node If we open sqoop

source code, the first thing class HiveConfig mentioned above does, is

it derives the Hive home from “/usr/bin/hive”. So, in HDP 2.5.3, sqoop

just needs to find the “hive-exec.jar” which in turn contains class

HiveConfig, which in turn will connect everything else. su root cd

/usr/hdp/2.5.3.0-37/sqoop/lib ln -s

/usr/hdp/2.5.3.0-37/hive/lib/hive-exec.jar hive-exec.jar

—another way to fix this issue, Usually the ‘HOME’ variables in sqoop script dictates how sqoop finds hive. we can add HIVE_HOME to

/usr/hdp/2.5.3.0/sqoop/bin/sqoop and make sure classpath for hive libs

exists at run time when sqoop executes the relevant import

4.3 INFO conf.HiveConf: Found configuration file null.

这个错误主要的原因是没有配好 Hive-site.xml 的路径。

这个路径是通过HIVE_CONF_DIR来指定的,如果没有指定则需要 HIVE_HOME 定义好。

正确的配置是 HIVE_CONF_DIR=/opt/hive/conf 一定要定义到 conf 文件夹。

而定义这个HIVE_CONF_DIR的变量文件是 SQOOP_HOME/conf/sqoop-env.sh。

继续阅读