sqoop将mysql数据导入hbase、hive的常见异常处理

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: sqoop将mysql数据导入hbase、hive的常见异常处理一、需求:1、将以下这张表(test_goods[id,goods_name,goods_price])数据导入Hbase由此,编写如下sqoop导入命令sqoop import -D sqoop.

sqoop将mysql数据导入hbase、hive的常见异常处理
一、需求:
1、将以下这张表(test_goods[id,goods_name,goods_price])数据导入Hbase

由此,编写如下sqoop导入命令

sqoop import -D sqoop.hbase.add.row.key=true --connect jdbc:mysql://192.168.1.9/spider --username root --password root --table test_goods --hbase-create-table --hbase-table t_goods --column-family cf --hbase-row-key id -m 1
一切看着都很正常,接下来开始执行命令,报如下错误:

Error during import: No primary key could be found for table *

报错原因就是指定的mysql表名不是大写,所以mysql表名必须大写

Could not insert row with null value for row-key column

报错原因是没有指定mysql的列名,所以必须指定列名,并且hbase-row-key id 中的id,必须在–columns中显示。 --columns ID,GOODS_NAME, GOODS_PRICE

Error parsing arguments for import Unrecognized argument

报错原因是在指定mysql的列名时,用逗号隔开的时候我多加了空格,所以在
Columns后显示的列名只能用逗号隔开,不要带空格

将以上三个问题排除后:我的最新导入命令变为如下:

sqoop import -D sqoop.hbase.add.row.key=true --connect jdbc:mysql://192.168.1.9:3306/spider --username root --password root --table TEST_GOODS --columns ID,GOODS_NAME,GOODS_PRICE --hbase-create-table --hbase-table t_goods --column-family cf --hbase-row-key ID --where "ID >= 5" -m 1
注意:这里有个小问题:记得将id>=5引起来,ok,查看hbase,数据已经成功导入!!!

2、将导入命令写成一个脚本来执行(通过sqoop –options-file xxx.file 执行导入命令)
错误写法如下:

import
-D sqoop.hbase.add.row.key=true
--connect jdbc:mysql://192.168.1.9:3306/spider
--username root
--password root
--table TEST_GOODS
--columns ID,GOODS_NAME,GOODS_PRICE
--hbase-create-table
--hbase-table test_goods
--column-family cf
--hbase-row-key ID
--where "ID >= 5"
-m 1
错误原因:参数的名称和参数的值没有进行回车换行

正确写法:

import
-D
sqoop.hbase.add.row.key=true
--connect
jdbc:mysql://192.168.1.9:3306/spider
--username
root
--password
root
--table
TEST_GOODS
--columns
ID,GOODS_NAME,GOODS_PRICE
--hbase-create-table
--hbase-table
tt_goods
--column-family
cf
--hbase-row-key
ID
--where
ID>=5
-m
1
注:参数含义解释

-D sqoop.hbase.add.row.key=true 是否将rowkey相关字段写入列族中,默认为false,默认情况下你将在列族中看不到任何row key中的字段。注意,该参数必须放在import之后。
--connect 数据库连接字符串
--username –password mysql数据库的用户名密码
--table Test_Goods表名,注意大写
--hbase-create-table 如果hbase中该表不存在则创建
--hbase-table 对应的hbase表名
--hbase-row-key hbase表中的rowkey,注意格式
--column-family hbase表的列族
--where 导入是mysql表的where条件,写法和sql中一样
--split-by CREATE_TIME 默认情况下sqoop使用4个并发执行任务,需要制订split的列,如果不想使用并发,可以用参数 --m 1
二、定时增量导入
1、Sqoop增量导入
sqoop import -D sqoop.hbase.add.row.key=true --connect jdbc:mysql://192.168.1.9:3306/spider --username root --password root --table TEST_GOODS --columns ID,GOODS_NAME,GOODS_PRICE --hbase-create-table --hbase-table t_goods --column-family cf --hbase-row-key ID --incremental lastmodified --check-column U_DATE --last-value '2017-06-27' --split-by U_DATE

--incremental lastmodified 增量导入支持两种模式 append 递增的列;lastmodified时间戳。
--check-column 增量导入时参考的列
--last-value 最小值,这个例子中表示导入2017-06-27到今天的值
2、Sqoop job
sqoop job --create testjob01 --import --connect jdbc:mysql://192.168.1.9:3306/spider --username root --password root --table TEST_GOODS --columns ID,GOODS_NAME,GOODS_PRICE --hbase-create-table --hbase-table t_goods --column-family cf --hbase-row-key ID -m 1
设置定时执行以上sqoop job
使用linux定时器:crontab -e
例如每天执行

0 0 * /opt/local/sqoop-1.4.6/bin/sqoop job ….
--exec testjob01
三、数据从mysql导入hive中后,出现数据不一致情况
我们运行hadoop fs -cat /user/hadoop/student/part-m-00000,可以看到原来字段与字段之间都用‘,’分隔开,这是sqoop默认的,这时候,如果一个字段值当中包含‘,’,再向hive中插入数据时分隔就会出错。因为hive也是用‘,’分隔的。

解决方法:建议用‘001'来进行sqoop 导入数据时的 分割。也就是--fields-terminated-by 参数。
例子:

sqoop import --connect "jdbc:oracle:thin:@//localhost:1521/student" --password "" --username "" --query "select * from student where name='zhangsan' and class_id='003' and $CONDITIONS" --target-dir "/user/hadoop/student" --fields-terminated-by "001" --verbose -m 1
四、总结
这些只是工作中一些小问题的解决,希望对大家有所帮助~~
原文出处https://www.cnblogs.com/baixianlong/p/10700700.html

相关实践学习
云数据库HBase版使用教程
  相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情: https://cn.aliyun.com/product/hbase   ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
8天前
|
SQL 关系型数据库 MySQL
基于Hive的天气情况大数据分析系统(通过hive进行大数据分析将分析的数据通过sqoop导入到mysql,通过Django基于mysql的数据做可视化)
基于Hive的天气情况大数据分析系统(通过hive进行大数据分析将分析的数据通过sqoop导入到mysql,通过Django基于mysql的数据做可视化)
|
24天前
|
SQL 分布式计算 关系型数据库
使用 Spark 抽取 MySQL 数据到 Hive 时某列字段值出现异常(字段错位)
在 MySQL 的 `order_info` 表中,包含 `order_id` 等5个字段,主要存储订单信息。执行按 `create_time` 降序的查询,显示了部分结果。在 Hive 中复制此表结构时,所有字段除 `order_id` 外设为 `string` 类型,并添加了 `etl_date` 分区字段。然而,由于使用逗号作为字段分隔符,当 `address` 字段含逗号时,数据写入 Hive 出现错位,导致 `create_time` 值变为中文字符串。问题解决方法包括更换字段分隔符或使用 Hive 默认分隔符 `\u0001`。此案例提醒在建表时需谨慎选择字段分隔符。
|
24天前
|
SQL 存储 关系型数据库
Hive 和 HDFS、MySQL 之间的关系
Hive是Hadoop上的数据仓库工具,用HiveQL进行大数据查询;HDFS是分布式文件系统,用于存储大规模数据,常与Hive结合,提供数据存储和高可靠性。MySQL是RDBMS,适用于结构化数据管理,在大数据环境里可存储Hive的元数据,提升查询效率和元数据管理。三者协同处理数据管理和分析任务。
|
28天前
|
缓存 关系型数据库 MySQL
Centos7 mysql和sqoop数据迁移
Centos7 mysql和sqoop数据迁移
|
1月前
|
SQL 分布式计算 关系型数据库
Ubuntu上安装MySQL以及hive
Ubuntu上安装MySQL以及hive
30 1
|
1月前
|
SQL 关系型数据库 MySQL
Sqoop【付诸实践 01】Sqoop1最新版 MySQL与HDFS\Hive\HBase 核心导入导出案例分享+多个WRAN及Exception问题处理(一篇即可学会在日常工作中使用Sqoop)
【2月更文挑战第9天】Sqoop【付诸实践 01】Sqoop1最新版 MySQL与HDFS\Hive\HBase 核心导入导出案例分享+多个WRAN及Exception问题处理(一篇即可学会在日常工作中使用Sqoop)
125 7
|
1月前
|
分布式计算 关系型数据库 MySQL
Sqoop【部署 01】CentOS Linux release 7.5 安装配置 sqoop-1.4.7 解决警告并验证(附Sqoop1+Sqoop2最新版安装包+MySQL驱动包资源)
【2月更文挑战第8天】Sqoop CentOS Linux release 7.5 安装配置 sqoop-1.4.7 解决警告并验证(附Sqoop1+Sqoop2最新版安装包+MySQL驱动包资源)
130 1
|
9月前
|
关系型数据库 MySQL 大数据
大数据Sqoop将mysql直接抽取至Hbase
大数据Sqoop将mysql直接抽取至Hbase
103 0
|
9月前
|
SQL 分布式计算 分布式数据库
大数据Sqoop借助Hive将Mysql数据导入至Hbase
大数据Sqoop借助Hive将Mysql数据导入至Hbase
182 0
|
SQL 分布式计算 关系型数据库
大数据 | (五)通过Sqoop实现从MySQL导入数据到HDFS
大数据 | (五)通过Sqoop实现从MySQL导入数据到HDFS
241 0