使用 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-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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dbLenis

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值