本实验完成的是,使用 Sqoop 从 MySQL 导出数据到 Hive.
整体步骤分为:
- 初始化 MySQL 的 30W+ 数据
- 安装配置 Sqoop
- 在 Hive 中初始化目标表
- 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-2.8.2
#Set path to where hadoop-*-core.jar is available
export HADOOP_MAPRED_HOME=/opt/hadoop/hadoop-2.8.2
#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-2.2.0-bin
#Set the path for where zookeper config dir is
#export ZOOCFGDIR=
针对 HBASE_HOME, ZOOCFGDIR 这里特意留空,暂不使用,用 # 注释掉了。
2.4 测试 sqoop 是否安装并能够使用: sqoop version
执行上述命令的时候,报错:
找不到主类 org.apache.sqoop.sqoop
解决方法如下:
参考:
http://blog.csdn.net/shantaodaoshik852/article/details/77266831
复制一份 sqoop.jar 到 $HADOOP_HOME/yarn下面即可:
cp /opt/sqoop/sqoop-1.4.6-cdh5.5.2/sqoop-1.4.6-cdh5.5.2.jar $HADOOP_HOME/share/hadoop/yarn/sqoop-1.4.6-cdh5.5.2.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 1 \
--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-2.2.0.jar hive-exec-2.2.0.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。