sqoop安装和使用

本文详细介绍了如何安装和配置Sqoop,包括下载解压、修改配置文件、拷贝JDBC驱动、验证安装、测试数据库连接,以及提供了一些简单的导入导出案例和常见问题解答。
摘要由CSDN通过智能技术生成

1 下载并解压

  1. 下载地址:http://mirrors.hust.edu.cn/apache/sqoop/1.4.6/

  2. 上传安装包sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz到虚拟机中

  3. 解压sqoop安装包到指定目录,如:

$ tar -zxf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz -C /opt/module/

2 修改配置文件

Sqoop的配置文件与大多数大数据框架类似,在sqoop根目录下的conf目录中。

1) 重命名配置文件

$ mv sqoop-env-template.sh sqoop-env.sh

2) 修改配置文件


export HADOOP_COMMON_HOME=/opt/hadoop-2.7.2
export HADOOP_MAPRED_HOME=/opt/hadoop-2.7.2
export HIVE_HOME=/opt/hive-1.2.1
export ZOOKEEPER_HOME=/opt/zookeeper-3.4.10
export ZOOCFGDIR=/opt/zookeeper-3.4.10/conf
export HBASE_HOME=/opt/hbase-1.3.1

3 拷贝JDBC驱动

拷贝jdbc驱动到sqoop的lib目录下,如:

$ cp mysql-connector-java-5.1.27-bin.jar /opt/module/sqoop-1.4.6/lib/

3 验证Sqoop

我们可以通过某一个command来验证sqoop配置是否正确:

$ bin/sqoop help

出现一些Warning警告(警告信息已省略),并伴随着帮助命令的输出:


Available commands:

codegen Generate code to interact with database records

create-hive-table Import a table definition into Hive

eval Evaluate a SQL statement and display the results

export Export an HDFS directory to a database table

help List available commands

import Import a table from a database to HDFS

import-all-tables Import tables from a database to HDFS

import-mainframe Import datasets from a mainframe server to HDFS

job Work with saved jobs

list-databases List available databases on a server

list-tables List available tables in a database

merge Merge results of incremental imports

metastore Run a standalone Sqoop metastore

version Display version information

5 测试Sqoop是否能够成功连接数据库

$ bin/sqoop list-databases --connect jdbc:mysql://hadoop102:3306/ --username root --password 000000

出现如下输出:

information_schema

metastore

mysql

oozie

performance_schema

6.简单案例

(1)mysql导入到hdfs

bin/sqoop import \
--connect jdbc:mysql://spark01:3306/company \	#指定JDBC连接字符串
--username root \
--password root \
--table staff \		#mysql的源表表名
--target-dir /user/company \	# 导入HDFS的目标路径
--delete-target-dir \	#如果指定目录存在,则先删除掉
--num-mappers 2 \	#使用n个map任务并行导入数据  几个分片
--split-by id \		#指定按照哪个列去分割数据
--fields-terminated-by "\t" #导入到hdfs文件的分隔符

(2)mysql导入到hdfs 部分导入

bin/sqoop import \
--connect jdbc:mysql://spark01:3306/company \
--username root \
--password root \
--table staff \
--columns id,name \ 	#从表中导出指定的一组列的数据
--where 'id >=10 and id <= 16' \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 2 \
--split-by id \
--fields-terminated-by "\t"

(3)mysql导入到hdfs 部分导入 通过query

bin/sqoop import \
--connect jdbc:mysql://spark01:3306/company \
--username root \
--password root \
--query 'select * from staff where $CONDITIONS and id < 10' \ 	#$CONDITIONS为solit-by占位符
--target-dir /user/company \
--delete-target-dir \
--num-mappers 2 \
--split-by id \
--fields-terminated-by "\t"

(4)#向hive导入数据 --query

bin/sqoop import \
--connect jdbc:mysql://spark01:3306/company \
--username root \
--password root \
--query 'select * from staff where $CONDITIONS and id < 10' \
--hive-import \
--hive-overwrite \
--hive-table staff_hive \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 2 \
--split-by id \
--fields-terminated-by "\t"

(5) hive向mysql导入数据

bin/sqoop export \
--connect jdbc:mysql://spark01:3306/company \
--username root \
--password root \
--table staff \
--num-mappers 2 \
--export-dir /user/hive/warehouse/staff_hive \
--input-fields-terminated-by "\t"

(6) hive向mysql导入数据2

/opt/module/sqoop/bin/sqoop export \
--connect "jdbc:mysql://hadoop102:3306/bmall?useUnicode=true&characterEncoding=utf-8"  \
--username root \
--password 000000 \
--table user \
--num-mappers 1 \
--export-dir /warehouse/bmall/ads/user \
--input-fields-terminated-by "\t" \
--update-mode allowinsert \
--update-key "tm_id,category1_id,stat_mn,stat_date" \ #这些字段相同视为一条是数据执行修改
--input-null-string '\\N'    \
--input-null-non-string '\\N'

(7)常见问题

)1关于导出update还是insert的问题
–update-mode:
updateonly 只更新,无法插入新数据
allowinsert 允许新增
2)按照那个字段判断是否为同一条
–update-key:允许更新的情况下,指定哪些字段匹配视为同一条数据,进行更新而不增加。多个字段用逗号分隔。
–input-null-string和–input-null-non-string:
分别表示,将字符串列和非字符串列的空串和“null”转换成’\N’

3)Sqoop数据导出一致性问题
Hive中的Null在底层是以“\N”来存储,而MySQL中的Null在底层就是Null,为了保证数据两端的一致性。在导出数据时采用–input-null-string和–input-null-non-string两个参数。导入数据时采用–null-string和–null-non-string。
4)Sqoop数据导出一致性问题
处理 由于线程的并发性,一个导入操作可能并不是原子性的。
如Sqoop在导出到Mysql时,使用4个Map任务,过程中有2个任务失败,那此时MySQL中存储了另外两个Map任务导入的数据.为避免这种情况

-–staging-table #tableName
--clear-staging-table #清空临时表

该参数是用来保证在数据导入关系数据库表的过程中事务安全性的,因为在导入的过程中可能会有多个事务,那么一个事务失败会影响到其它事务,比如导入的数据会出现错误或出现重复的记录等等情况,那么通过该参数可以避免这种情况。创建一个与导入目标表同样的数据结构,保留该表为空在运行数据导入前,所有事务会将结果先存放在该表中,然后最后由该表通过一次事务将结果写入到目标表中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值