通过sqoop工具从hive仓库中导出数据到mysql表中,只有部分数据导出,是什么原因
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过sqoop工具从hive仓库中导出数据到mysql表中,只有部分数据导出,是什么原因相关的知识,希望对你有一定的参考价值。
参考技术A 输入sqoop import 的目录在哪里?如果在/usr/sqoop下输入的命令,那么在/usr/sqoop下输入hive登入,然后show tables查看。本回答被提问者采纳Sqoop的安装和使用
一、概述
sqoop 是 apache 旗下一款“Hadoop 和关系数据库服务器之间传送数据”的工具。
核心的功能有两个:
导入、迁入
导出、迁出
导入数据:MySQL,Oracle 导入数据到 Hadoop 的 HDFS、HIVE、HBASE 等数据存储系统
导出数据:从 Hadoop 的文件系统中导出数据到关系数据库 mysql 等 Sqoop 的本质还是一个命令行工具,和 HDFS,Hive 相比,并没有什么高深的理论。
sqoop:
工具:本质就是迁移数据, 迁移的方式:就是把sqoop的迁移命令转换成MR程序
hive
工具,本质就是执行计算,依赖于HDFS存储数据,把SQL转换成MR程序
二、工作机制
将导入或导出命令翻译成 MapReduce 程序来实现 在翻译出的 MapReduce 中主要是对 InputFormat 和 OutputFormat 进行定制
三、安装
1、前提概述
将来sqoop在使用的时候有可能会跟那些系统或者组件打交道?
HDFS, MapReduce, YARN, ZooKeeper, Hive, HBase, MySQL
下载地址http://mirrors.hust.edu.cn/apache/sqoop
(1)上传解压缩安装包到指定目录
[hadoop@hadoop3 ~]$ tar -zxvf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz -C apps/
(2)进入到 conf 文件夹,找到 sqoop-env-template.sh,修改其名称为 sqoop-env.sh cd conf
[hadoop@hadoop3 ~]$ cd apps/ [hadoop@hadoop3 apps]$ ls apache-hive-2.3.3-bin hadoop-2.7.5 hbase-1.2.6 sqoop-1.4.6.bin__hadoop-2.0.4-alpha zookeeper-3.4.10 [hadoop@hadoop3 apps]$ mv sqoop-1.4.6.bin__hadoop-2.0.4-alpha/ sqoop-1.4.6 [hadoop@hadoop3 apps]$ cd sqoop-1.4.6/conf/ [hadoop@hadoop3 conf]$ ls oraoop-site-template.xml sqoop-env-template.sh sqoop-site.xml sqoop-env-template.cmd sqoop-site-template.xml [hadoop@hadoop3 conf]$ mv sqoop-env-template.sh sqoop-env.sh
(3)修改 sqoop-env.sh
[hadoop@hadoop3 conf]$ vi sqoop-env.sh
(4)加入 mysql 驱动包到 sqoop1.4.6/lib 目录下
[hadoop@hadoop3 ~]$ cp mysql-connector-java-5.1.40-bin.jar apps/sqoop-1.4.6/lib/
5)配置系统环境变量
[hadoop@hadoop3 ~]$ vi .bashrc
#Sqoop export SQOOP_HOME=/home/hadoop/apps/sqoop-1.4.6 export PATH=$PATH:$SQOOP_HOME/bin
[hadoop@hadoop3 ~]$ source .bashrc
(6)验证安装是否成功
sqoop version
(7)mysql连接权限配置修改
当前mysql只允许localhost连接。
需要在localhost的那台机器上登入mysql后,将 "mysql" 数据库里的 "user" 表里的 "host" 项,从"localhost"改为"%"
mysql>use mysql;
mysql>update user set host = ‘%‘ where user = ‘root‘;
mysql>select host, user from user;
mysql>flush privileges;
四、Sqoop的基本命令
基本操作
列出MySQL数据有哪些数据库
[hadoop@hadoop3 ~]$ sqoop list-databases > --connect jdbc:mysql://hadoop1:3306/ > --username root > --password root
列出MySQL中的某个数据库有哪些数据表:
[hadoop@hadoop3 ~]$ sqoop list-tables
> --connect jdbc:mysql://hadoop1:3306/mysql
> --username root
> --password root
根据MYSQL表创建HIVE前需先配置以下环境变量
sqoop create-hive-table --connect jdbc:mysql://hadoop1:3306/mysql --username root --password root --table help_keyword --hive-table hk
五、Sqoop的数据导入
“导入工具”导入单个表从 RDBMS 到 HDFS。表中的每一行被视为 HDFS 的记录。所有记录 都存储为文本文件的文本数据(或者 Avro、sequence 文件等二进制数据)
RDBMS的表必须有主键才可以导入,否则会报错
1、从RDBMS导入到HDFS中
语法格式
sqoop import (generic-args) (import-args)
使用sqoop从mysql导入数据到hive常见坑 及其解决方法
导入: 指定分隔符和导入路径
sqoop import --connect jdbc:mysql://hadoop1:3306/mysql --username root --password root --table help_keyword --target-dir /user/hadoop11/my_help_keyword1 --fields-terminated-by ‘ ‘ -m 2
导入数据:带where条件
sqoop import --connect jdbc:mysql://hadoop1:3306/mysql --username root --password root --where "name=‘STRING‘ " --table help_keyword --target-dir /sqoop/hadoop11/myoutport1 -m 1
查询指定列
sqoop import --connect jdbc:mysql://hadoop1:3306/mysql --username root --password root --columns "name" --where "name=‘STRING‘ " --table help_keyword --target-dir /sqoop/hadoop11/myoutport22 -m 1 selct name from help_keyword where name = "string"
导入:指定自定义查询SQL
sqoop import --connect jdbc:mysql://hadoop1:3306/ --username root --password root --target-dir /user/hadoop/myimport33_1 --query ‘select help_keyword_id,name from mysql.help_keyword where $CONDITIONS and name = "STRING"‘ --split-by help_keyword_id --fields-terminated-by ‘ ‘ -m 4
在以上需要按照自定义SQL语句导出数据到HDFS的情况下:
1、引号问题,要么外层使用单引号,内层使用双引号,$CONDITIONS的$符号不用转义, 要么外层使用双引号,那么内层使用单引号,然后$CONDITIONS的$符号需要转义
2、自定义的SQL语句中必须带有WHERE $CONDITIONS
指定行分隔符和列分隔符,指定hive-import,指定覆盖导入,指定自动创建hive表,指定表名,指定删除中间结果数据目录
sqoop import --connect jdbc:mysql://hadoop1:3306/mysql --username root --password root --table help_keyword --fields-terminated-by " " --lines-terminated-by " " --hive-import --hive-overwrite --create-hive-table --delete-target-dir --hive-database mydb_test --hive-table new_help_keyword
增量导入
执行增量导入之前,先清空hive数据库中的help_keyword表中的数据
truncate table help_keyword;
sqoop import --connect jdbc:mysql://hadoop1:3306/mysql --username root --password root --table help_keyword --target-dir /user/hadoop/myimport_add --incremental append --check-column help_keyword_id --last-value 500 -m 1
以上是关于通过sqoop工具从hive仓库中导出数据到mysql表中,只有部分数据导出,是什么原因的主要内容,如果未能解决你的问题,请参考以下文章