1 下载并解压
-
上传安装包sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz到虚拟机中
-
解压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 #清空临时表
该参数是用来保证在数据导入关系数据库表的过程中事务安全性的,因为在导入的过程中可能会有多个事务,那么一个事务失败会影响到其它事务,比如导入的数据会出现错误或出现重复的记录等等情况,那么通过该参数可以避免这种情况。创建一个与导入目标表同样的数据结构,保留该表为空在运行数据导入前,所有事务会将结果先存放在该表中,然后最后由该表通过一次事务将结果写入到目标表中。
本文详细介绍了如何安装和配置Sqoop,包括下载解压、修改配置文件、拷贝JDBC驱动、验证安装、测试数据库连接,以及提供了一些简单的导入导出案例和常见问题解答。
3780

被折叠的 条评论
为什么被折叠?



