最近在使用sqoop的时候遇到了一些坑,在此就sqoop做一些介绍并且记录自己的爬坑过程,希望对看到的朋友有所帮助
作用: 在Hadoop和RDBMS之间高效传输数据: 1.hadoop大数据存储平台:hdfs,hbase,hive 2.rdbms关系型数据库 : mysql,oracle,postgresql,mssql 原理: 把用户的指令解析编译成MR任务,发布到yarn上分布式执行 MR任务把输入和输出分别对接RDBMS和Hadoop就能完成数据的转移 版本 sqoop1 核心组件:TaskTranslator,解析编译用户指令,生成mr任务发布到yarn cli、api :和用户交互,从用户接受命令,把命令发送给TaskTranslator 优点:简单、灵活、易用,不需要做什么配置,指令即配置,指令可以马上执行 缺点:支持shell和java等语言,对于其他语言无法支持 sqoop2 server端: 核心组件:TaskTranslator,解析编译用户指令,生成mr任务发布到yarn Connector连接存储系统的中间组件 Metadata: 存储用户跟存储系统的连接信息:link 存储数据导入导出的指令信息:Job RestServer: 对外接受客户端的服务 接受客户端的连接,接受客户端的指令,把指令发送给TaskTranslator UiServer:对外接受客户端的服务 client端: cli、api、webui 优点: 通用更强 会记录元数据包括存储系统连接信息和任务配置信息等 缺点: 步骤稍显麻烦 对记录的连接需要使用Connector来连接
主要介绍使用sqoop在hive和MySQL之间的数据传输
1.从MySQL中将数据传入hive表中 MySQL表test_table2数据 需求1.将MySQL表test_table2中的数据全量导入Hive表 test_table表中 sqoop命令如下:
sqoop import \ "-Dorg.apache.sqoop.splitter.allow_text_splitter=true" \ --connect jdbc:mysql://${HOSTNAME}:${PORT}/${ADDRESSDB} \ ##数据库连接的驱动 --username ${USERNAME} \ ##数据库用户名 --password ${PASSWORD} \ ##数据库密码 --table test_table2 \ ##mysql中的表名 --fields-terminated-by '\001' \ ## 设置字段分割符 --lines-terminated-by '\n' \ ##设置行尾割符 --input-null-string '\\N' \ ##要为字符串列的空值写入的字符串 --input-null-non-string '\\N' \ ##要为非字符串列的空值写入的字符串 --split-by id \ ##切分字段 --hive-database dw_cre_member \ ##hive数据库 --hive-table test_table \ ##hive表hive表test_table插入数据后的结果: 需求2.将MySQL表test_table2中的数据覆盖导入Hive表 test_table表中 sqoop命令如下:
sqoop import \ "-Dorg.apache.sqoop.splitter.allow_text_splitter=true" \ --connect jdbc:mysql://${HOSTNAME}:${PORT}/${ADDRESSDB} \ ##数据库连接的驱动 --username ${USERNAME} \ ##数据库用户名 --password ${PASSWORD} \ ##数据库密码 --table test_table2 \ ##mysql中的表名 --fields-terminated-by '\001' \ ## 设置字段分割符 --lines-terminated-by '\n' \ ##设置行尾割符 --input-null-string '\\N' \ ##要为字符串列的空值写入的字符串 --input-null-non-string '\\N' \ ##要为非字符串列的空值写入的字符串 --split-by id \ ##切分字段 --hive-import \ ##向hive导入数据必须参数 --hive-overwrite \ ##覆盖hive表中的数据 --hive-database dw_cre_member \ ##hive数据库 --hive-table test_table \ ##hive表hive的参数介绍
--hive-import 必须参数,指定导入hive --hive-database default hive库名 --hive-table people hive表名 --fields-terminated-by hive的分隔符 --hive-overwrite 重写重复字段 --create-hive-table 帮创建好 hive 表,但是表存在会出错。不建议使用这个参数,因为到导入的时候,会与我们的字段类型有出入。 --hive-partition-key “dt” 指定分区表的字段 --hive-partition-value “2018-08-08” 指定分区表的值*导出没有主键的表
可以使用两种方式: --split-by 指定切分的字段 --m 1 : 设置只使用一个map进行数据迁移过滤条件导出
--where “age>18” 匹配条件 --columns “name,age” 选择要导入的指定列 --query ‘select * from people where age>18 and $CONDITIONS’: sql语句查询的结果集 不能 --table 一起使用 需要指定 --target-dir 路径在数据库中为空时的处理
--input-null-non-string ‘0’ 当不是字符串的数据为空的时候,用 0 替换 --input-null-string ‘string’ 当字符串为空的时候,使用string 字符替换增量导入
* check-column id 用来指定一些列 * 这些被指定的列的类型不能使任意字符类型,如char、varchar等类型都是不可以的,常用的是指定主键id. * --check-column 可以去指定多个列 last-value 10 从哪个值开始增量 incremental 增量的模式 append id 是获取大于某一列的某个值。 lastmodified “2016-12-15 15:47:30” 获取某个时间后修改的所有数据 –append 附加模式 –merge-key id 合并模式注意:增量导入不能与 –delete-target-dir 一起使用,还有必须指定增量的模式
2.hive中将数据传输到MySQL表中 Mysql中的表test_table3 Hive中的表test_table 需求1.将Hive表test_table中的数据导入到MySQL表test_table3中,采用更新导入的方式
sqoop命令如下:
sqoop export \ --connect jdbc:mysql://${HOSTNAME}:${PORT}/${ADDRESSDB}?characterEncoding=UTF-8 \ #数据库连接 --username ${USERNAME} \ #数据库用户名 --password ${PASSWORD} \ #数据库密码 --table box_member_geo_new \ #需要导入的mysql表 --update-key skey \ #匹配键 --update-mode allowinsert \ #更新模式,如果有未匹配到的则插入表中 --columns "skey,address" \ #匹配更新的列名 --export-dir ${HDFSADDRESS} \ #hdfs地址 --input-fields-terminated-by '\001' #指定换行符后续再更新
详见:官方文档
