Sqoop使用,mysql,hbase,hive等相互转换
Sqoop 是一款用来在不同数据存储软件之间进行数据传输的开源软件,它支持多种类型的数据储存软件。
安装 Sqoop
1.下载sqoop并加mysql驱动包
http://mirror.bit.edu.cn/apache/sqoop/,下载,如下载sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz,
要从 MySQL 导数据需要安装 MySQL driver。如 mysql-connector-java-5.1.38.tar.gz,解压以后把 jar 包放到 Sqoop 目录下的 lib 目录下。
2.配置环境变量
要把HADOOP_MAPRED_HOME添加到系统环境,否则会报错/usr/software/sqoop/bin/../../hadoop/mapreduce does not exist!
需要 vi /etc/profiles加
SQOOP_HOME=/usr/software/hadoop
export HADOOP_MAPRED_HOME=/usr/software/hadoop export SQOOP_HOME=/usr/software/hadoop

从 MySQL 到 HDFS
mysql测试表 bbb 为例
sqoop import --connect jdbc:mysql://<dburi>/<dbname> --username <username> --password <password> --table <tablename> --check-column <col> --incremental <mode> --last-value <value> --target-dir <hdfs-dir> --fields-terminated-by '\t'
例子:
sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password admin --table bbb --check-column id --incremental append --last-value '1' --target-dir output_hb --fields-terminated-by '\t'
参数说明:
参数说明: dburi:数据库的访问连接,例如: jdbc:mysql://192.168.1.124:3306/ 如果您的访问连接中含有参数,那么请用单引号将整个连接包裹住,例如’jdbc:mysql://192.168.1.124:3306/mydatabase?useUnicode=true’
dbname:数据库的名字,例如:user。
username:数据库登录用户名。
password:用户对应的密码。
tablename:MySQL 表的名字。
col:要检查的列的名称。
mode:该模式决定Sqoop如何定义哪些行为新的行。取值为append或lastmodified。
value:前一个导入中检查列的最大值。
hdfs-dir:HDFS 的写入目录,例如:/user/hive/result。
–check-column,用来指定一些列,这些列在导入时用来检查做决定数据是否要被作为增量数据,在一般关系型数据库中,都存在类似Last_Mod_Date的字段或主键。注意:这些被检查的列的类型不能是任意字符类型,例如Char,VARCHAR…(即字符类型不能作为增量标识字段)
–incremental,用来指定增量导入的模式(Mode),append和lastmodified
–last-value,指定上一次导入中检查列指定字段最大值
--fields-terminated-by 行分隔符 ,如 '\t'
--lines-terminated-by 列分隔符,hive只支持'\n'作为行分隔符,默认也是'\n'
更加详细的参数使用请参考 Sqoop Import。
从 HDFS 到 MySQL
需要先创建好对应 HDFS 中的数据结构的 MySQL 表,然后在集群的 Master 节点上执行如下命令,指定要导的数据文件的路径。
sqoop export --connect jdbc:mysql://<dburi>/<dbname> --username <username> --password <password> --table <tablename> --export-dir <hdfs-dir>
从 MySQL 到 Hive
在集群的 Master 节点上执行如下命令后,从MySQL数据库导入数据的同时,也会新建一个 Hive 表。
sqoop import --connect jdbc:mysql://<dburi>/<dbname> --username <username> --password <password> --table <tablename> --check-column <col> --incremental <mode> --last-value <value> --fields-terminated-by "\t" --lines-terminated-by "\n" --hive-import --target-dir <hdfs-dir> --create-hive-table --hive-table <hive-tablename>
报错处理:若报错“Hive does not support the SQL type for column GoodsPic” ,解决:对那列名指定类型,如 --map-column-hive GoodsPic=string
例子:
sqoop import -Dorg.apache.sqoop.splitter.allow_text_splitter=true --connect jdbc:postgresql://192.168.101.4:5432/postgres --username postgres --password 'admin' --table t_acc_master --hive-import --target-dir venus --hive-table venus.t_acc_master --hive-overwrite -m 1
参数说明:
--hive-table:对应的 Hive 中的表名,可以是 xxx.yyy 代表 数据库.表 。
--hdfs-dir:将源数据导入到HDFS上的那个文件夹下
--create-hive-table:没表就自动创建(默认是textfile的,不是parquet的)
--hive-overwrite 覆盖同步
从 Hive 到 MySQL
请参考上面的从 HDFS 到 MySQL的命令,只需要指定 Hive 表对应的 HDFS 路径就可以了。
例如:
sqoop export --connect jdbc:mysql://127.0.0.1:3306/parkdb --username xiaoming --password '' --table t_vip_user --export-dir 'hive_g2park/vip/*' --fields-terminated-by "\t"
--fields-terminated-by指明hdfs数据到mysql的分割凭据
具体如下:hdfs数据到hive中,以及hdfs数据隐身理解
从 MySQL 到 OSS
类似从 MySQL 到 HDFS,只是 --target-dir 不同。在集群的 Master 节点上执行如下命令:
注意1: OSS 地址中的 host 有内网地址、外网地址和 VPC 网络地址之分。如果用经典网络,需要指定内网地址,杭州是 oss-cn-hangzhou-internal.aliyuncs.com,VPC 要指定 VPC 内网,杭州是 vpc100-oss-cn-hangzhou.aliyuncs.com。
注意2: 目前同步到OSS不支持—delete-target-dir,用这个参数会报错Wrong FS。如果要覆盖以前目录的数据 ,可以在调用sqoop前,用hadoop fs -rm -r osspath先把原来的oss目录删了。
sqoop import --connect jdbc:mysql://<dburi>/<dbname> --username <username> --password <password> --table <tablename> --check-column <col> --incremental <mode> --last-value <value> --target-dir <oss-dir> --temporary-rootdir <oss-tmpdir>
参数说明:
oss-dir:OSS 的写入目录,例如:oss://<accessid>:<accesskey>@<bucketname>.oss-cn-hangzhou-internal.aliyuncs.com/result。
oss-tmpdir:临时写入目录。指定append模式的同时,需要指定该参数。如果目标目录已经存在于HDFS中,则Sqoop将拒绝导入并覆盖该目录的内容。采用append模式后,Sqoop会将数据导入临时目录,然后将文件重命名为正常目标目录。
从OSS到MySQL
类似MySQL到HDFS,只是—export-dir不同。需要创建好对应OSS中的数据结构的MySQL表
然后在集群的Master节点上执行如下:指定要导的数据文件的路径
sqoop export --connect jdbc:mysql://<dburi>/<dbname> --username <username> --password <password> --table <tablename> --export-dir <oss-dir>
参数:
oss-dir:oss的写入目录,例如:oss://<accessid>:<accesskey>@<bucketname>.oss-cn-hangzhou-internal.aliyuncs.com/result
注意: oss地址host有内网地址,外网地址,VPC网络地址之分。如果 用经典网络,需要指定内网地址,杭州是oss-cn-hangzhou-internal.aliyuncs.com,vpc要指定vpc内网,杭州是vpc100-oss-cn-hangzhou.aliyuncs.com
使用 SQL 作为导入条件
除了指定 MySQL 的全表导入,还可以写 SQL 来指定导入的数据,如下所示:
sqoop import --connect jdbc:mysql://<dburi>/<dbname> --username <username> --password <password> --query <query-sql> --split-by <sp-column> --hive-import --hive-table <hive-tablename> --target-dir <hdfs-dir>- 例子:
sqoop import --connect jdbc:mysql://localhost:3306/gznt --username gznt_r --password '123' --query "SELECT NodeCode,NodeName from tb_bmda where 1=1 AND \$CONDITIONS " --split-by NodeCode --target-dir output2
参数说明:
query-sql:使用的查询语句,例如:”SELECT * FROM profile WHERE id>1 AND \$CONDITIONS”。记得要用引号包围,最后一定要带上 AND \$CONDITIONS。
sp-column:进行切分的条件,一般跟 MySQL 表的主键。
hdfs-dir:要导到 MySQL 去的 HDFS 的数据目录,例如:/user/hive/result。
hive-tablename:对应的 Hive 中的表名,可以是 xxx.yyy。
从MYSQL到HBASE
类似MySQL到HDFS,只是—export-dir不同。需要创建好对应OSS中的数据结构的MySQL表
然后在集群的Master节点上执行如下:指定要导的数据文件的路径
ps:红色可以不填
sqoop import -D sqoop.hbase.add.row.key=true --connect jdbc:mysql://localhost:3306/gznt --username gznt_r --password '123' --table t_bmda --columns NodeCode,NodeType,NodeName,IsWarehouse,IsAssetUser --hbase-table hbase_bmda --column-family info --hbase-row-key NodeCode --where "ID >= 5"
参数:
-D sqoop.hbase.add.row.key=true 是否将rowkey相关字段写入列族中,默认false,默认你在列族中看不到任何row key中的字段。
--hbase-create-table 如果hbase中该表不存在则创建,ps:我加了这个,就报错了,据说了版本兼容问题,可以先手动创建好hbase的表和列族
--hbase-row-key < col > 指定字段作为row key ,如果输入表包含复合主键,用逗号分隔
从HIVE到HBASE
hive下建表(hbase下会自动创建对应表):
CREATE TABLE IF NOT EXISTS all_detail (
key string comment "rowkey",
SaleDate varchar(60),
NodeCode varchar(60),
NodeName varchar(60)
)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:SaleDate,info:NodeCode,info:NodeName")
TBLPROPERTIES("hbase.table.name" = "hbase_tb");
;
注意点:
1.建表的时候,必须建一个 key column,如上的 key string comment "rowkey"
2.hbase.columns.mapping中是hive与hbase的对应,即 把SaleData,NodeCode,NodeName数据同步到hbase_tb下的info列族下。
附录:
Sqoop使用
Sqoop 简介及安装部署
使用Sqoop从MySQL导入数据到Hive和HBase 及近期感悟
Sqoop使用,mysql,hbase,hive等相互转换的更多相关文章
- sqoop: mysql to hive
sqoop import --connect 数据库连接 --username 数据库用户名--password 数据库密码 --table 导入的表 -m 1 --hive-import --tar ...
- sqoop import mysql to hive table:GC overhead limit exceeded
1. Scenario description when I use sqoop to import mysql table into hive, I got the following error: ...
- Sqoop导入关系数据库到Hive
参考:segmentfault.com:Sqoop导入关系数据库到Hive Sqoop 是 apache 下用于 RDBMS 和 HDFS 互相导数据的工具.本文以 mysql 数据库为例,实现关系数 ...
- 使用Sqoop从MySQL导入数据到Hive和HBase 及近期感悟
使用Sqoop从MySQL导入数据到Hive和HBase 及近期感悟 Sqoop 大数据 Hive HBase ETL 使用Sqoop从MySQL导入数据到Hive和HBase 及近期感悟 基础环境 ...
- Centos搭建mysql/Hadoop/Hive/Hbase/Sqoop/Pig
目录: 准备工作 Centos安装 mysql Centos安装Hadoop Centos安装hive JDBC远程连接Hive Hbase和hive整合 Centos安装Hbase 准备工作: 配置 ...
- sqoop:mysql和Hbase/Hive/Hdfs之间相互导入数据
1.安装sqoop 请参考http://www.cnblogs.com/Richardzhu/p/3322635.html 增加了SQOOP_HOME相关环境变量:source ~/.bashrc ...
- sqoop将mysql数据导入hbase、hive的常见异常处理
原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10700700.html,否则将追究法律责任!!! 一.需求: 1.将以下这张表(test_ ...
- 教程 | 使用Sqoop从MySQL导入数据到Hive和HBase
基础环境 sqoop:sqoop-1.4.5+cdh5.3.6+78, hive:hive-0.13.1+cdh5.3.6+397, hbase:hbase-0.98.6+cdh5.3.6+115 S ...
- 使用Sqoop从mysql向hdfs或者hive导入数据时出现的一些错误
1.原表没有设置主键,出现错误提示: ERROR tool.ImportTool: Error during import: No primary key could be found for tab ...
随机推荐
- 20165221 JAVA第五周学习心得
课本知识点 内部类与异常类 内部类:在一个类中定义另一个类 特点:外嵌类的成员在内部类仍然有效,内部类也可调用外嵌类的方法,内部类的类体不能声明类变量及类方法 非内部类不能是static类 匿名类:创 ...
- 关于Oracle数据库故障诊断基础架构
本节包含有关Oracle数据库故障诊断基础结构的背景信息.它包含以下主题: 故障诊断基础架构概述 关于事件和问题 故障诊断基础设施组件 自动诊断信息库的结构,内容和位置 故障诊断基础架构概述 故障诊断 ...
- python 携带cookie获取页面内容
有时会遇到爬取的页面需要登录,这就要带上cookie了. 下面记录了几种携带cookie的方法 # coding=utf-8 import requests s = requests.Session( ...
- Linux Shell脚本编程
⒈为什么要学习Shell编程 1)Linux运维工程师在进行服务器集群管理时,需要编写Shell程序来进行服务器管理 2)对于JavaEE和Python程序员来说,有些工作需要编写一些Shell脚本进 ...
- python3字典中items()和python2.x中iteritems()有什么不同?
在Python2.x中: items() 用于返回一个字典的拷贝列表[Returns a copy of the list of all items (key/value pairs) in D],占 ...
- dubbo源码分析2——SPI机制中的SPI实现类的读取和预处理
SPI机制中的SPI实现类的读取和预处理是由ExtensionLoader类的loadFile方法来完成的 loadFile方法的作用是读取dubbo的某个SPI接口的spi描述文件,然后进行缓存,缓 ...
- unigui 在单据中,某输入为必填项的 JS代码
给大家分享下在单据中,某输入为必填项,用红框标示的简单处理方法:UniSession.AddJS(UniEdit1.JSName+ '.el.setStyle({"border" ...
- 范围for语句
C++11 新标准引入了一种更简单的for语句,这种语句可以遍历容器或其他序列的所有元素.范围for语句(range for statement)的语法形式是: for (declaration : ...
- php OpenSSL 加解密
2018-1-6 17:10:19 星期六 $data = '123456'; $openssl_method = 'AES-256-CBC'; $openssl_iv_length = openss ...
- Laravel 怎么在 blade 视图中将带 HTML 字符原样输出
### 感觉这是比较细小的,细节处理问题,很容易就一下子想不起怎么处理 但知道处理方式是那么简单时,真的觉得基础不够扎实 ### 富文本编辑内容: 视图原样输出: 视图模板的标签是这样处理就可以的-- ...