sqoop2服务器地址
❶ hbase数据库是关系型数据库吗
Hive 存储格式和关系型数据库之间进行导入导出
最近更新时间:2020-09-29 15:54:18
前往 GitHub 编辑
1. 开发准备
2. 将关系型数据库导入到 Hive 中
3. 将 Hive 导入到关系型数据库中
使用 HDFS 中的 Hive 数据
使用 Hcatalog 进行导入
4. 将 orc 格式的 Hive 表格导入到关系型数据库中
确认已开通腾讯云,并且创建了一个 EMR 集群。在创建 EMR 集群的时候需要在软件配置界面选择 Sqoop,Hive 组件。
Sqoop 等相关软件安装在路径 EMR 云服务器的/usr/local/service/路径下。
- [root@172 ~]# su hadoop[hadoop@172 ~]# cd /usr/local/service/hive
- [hadoop@172 hive]$ hive
- hive> create database hive_from_sqoop;
- OK
- Time taken: 0.167 seconds
- [hadoop@172 hive]# cd /usr/local/service/sqoop
- [hadoop@172 sqoop]$ bin/sqoop-import --connect jdbc:mysql://$mysqlIP/test --username root -P --table sqoop_test_back --hive-database hive_from_sqoop --hive-import --hive-table hive_from_sqoop
$mysqlIP:腾讯云关系型数据库(CDB)的内网地址。
test:MySQL 数据库名称。
--table:要导出的 MySQL 表名。
--hive-database:Hive 数据库名。
--hive-table:导入的 Hive 表名。
- hive> select * from hive_from_sqoop;OK1 first 2018-07-03 16:07:46.0 spark2 second 2018-07-03 15:30:57.0 mr3 third 2018-07-03 15:31:07.0 yarn4 forth 2018-07-03 15:39:38.0 hbase5 fifth 2018-07-03 16:02:29.0 hive6 sixth 2018-07-03 16:09:58.0 sqoopTime taken: 1.245 seconds, Fetched: 6 row(s)
- [root@172 ~]# su hadoop[hadoop@172 ~]# cd /usr/local/service/hive
- #!/bin/bashMAXROW=1000000 #指定生成数据行数for((i = 0; i < $MAXROW; i++))doecho $RANDOM, "$RANDOM"done
- [hadoop@172 hive]$ ./gen_data.sh > hive_test.data
- [hadoop@172 hive]$ hdfs dfs -put ./hive_test.data /$hdfspath
- [hadoop@172 hive]$ bin/hivehive> create database hive_to_sqoop; #创建数据库 hive_to_sqoopOK
- Time taken: 0.176 secondshive> use hive_to_sqoop; #切换数据库OK
- Time taken: 0.176 secondshive> create table hive_test (a int, b string)hive> ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';#创建数据表 hive_test, 并指定列分割符为’,’
- OK
- Time taken: 0.204 secondshive> load data inpath "/$hdfspath/hive_test.data" into table hive_test; #导入数据
- [hadoop@172 hive]$ mysql -h $mysqlIP –p
- Enter password:
- mysql> create table table_from_hive (a int,b varchar(255));
- [hadoop@172 hive]$ cd ../sqoop/bin
- [hadoop@172 bin]$ ./sqoop-export --connect jdbc:mysql://$mysqlIP/test --username root -P
- --table table_from_hive --export-dir /usr/hive/warehouse/hive_to_sqoop.db/hive_test
- [hadoop@172 hive]$ cd ../sqoop/bin
- [hadoop@172 bin]$ ./sqoop-export --connect jdbc:mysql://$mysqlIP/test --username root -P
- --table table_from_hive --hcatalog-database hive_to_sqoop --hcatalog-table hive_test
- [hadoop@172 hive]$ mysql -h $mysqlIP –p #连接 MySQLEnter password:mysql> use test;
- Database changed
- mysql> select count(*) from table_from_hive; #现在表中有1000000条数据+----------+| count(*) |+----------+| 1000000 |+----------+1 row in set (0.03 sec)
- mysql> select * from table_from_hive limit 10; #查看表中前10条记录+-------+----------+| a | b |
- +-------+----------+
- | 28523 | "3394" || 31065 | "24583" |
- | 399 | "23629" || 18779 | "8377" |
- | 25376 | "30798" || 20234 | "22048" |
- | 30744 | "32753" || 21423 | "6117" |
- | 26867 | "16787" || 18526 | "5856" |
- +-------+----------+
- 10 rows in set (0.00 sec)
- [hadoop@172 bin]$ ./sqoop-export --help
我的收藏
本页目录:
本文介绍了使用腾讯云 Sqoop 服务将数据在 Mysql 和 Hive 之间相互导入导出的方法。
1. 开发准备
2. 将关系型数据库导入到 Hive 中
本节将继续使用上一节的用例。
进入 EMR 控制台,复制目标集群的实例 ID,即集群的名字。再进入关系型数据库控制台,使用 Ctrl+F 进行搜索,找到集群对应的 MySQL 数据库,查看该数据库的内网地址 $mysqlIP。
登录 EMR 集群中的任意机器,最好是登录到 Master 节点。登录 EMR 的方式请参考登录 linux 实例。这里我们可以选择使用 WebShell 登录。单击对应云服务器右侧的登录,进入登录界面,用户名默认为 root,密码为创建 EMR 时用户自己输入的密码。输入正确后,即可进入命令行界面。
在 EMR 命令行先使用以下指令切换到 Hadoop 用户,并进入 Hive 文件夹:
新建一个 Hive 数据库:
使用 sqoop-import 命令把上一节中创建的 MySQL 数据库导入到 Hive 中:
执行指令需要输入您的 MySQL 密码,默认为您创建 EMR 集群时设置的密码。执行成功后,可以在 Hive 中查看导入的数据库:
3. 将 Hive 导入到关系型数据库中
Sqoop 支持将 Hive 表中的数据导入到关系型数据库中。先在 Hive 中创建新表并导入数据。
登录 EMR 集群中的任意机器,最好是登录到 Master 节点。在 EMR 命令行先使用以下指令切换到 Hadoop 用户,并进入 Hive 文件夹:
新建一个 bash 脚本文件 gen_data.sh,在其中添加以下代码:
并按如下方式执行:
这个脚本文件会生成1,000,000个随机数对,并且保存到文件 hive_test.data 中。
使用如下指令把生成的测试数据先上传到 HDFS 中:
其中 $hdfspath 为 HDFS 上的您存放文件的路径。
连接 Hive 并创建测试表:
$hdfspath 为 HDFS 上的您存放文件的路径。
成功后可使用quit命令退出 Hive 数据仓库。连接关系型数据库并创建对应的表格:
其中 $mysqlIP 为该数据库的内网地址,密码为您创建集群时设置的密码。
在 MySQL 中创建一个名为 test 的表格,MySQL 中的表字段名字和 Hive 中的表字段名字必须完全一致:
成功创建表格后即可退出 MySQL。
使用 Sqoop 把 Hive 数据仓库中的数据导入到关系型数据库中有两种方法,可以直接使用 HDFS 存储的 Hive 数据,也可以使用 Hcatalog 来进行数据的导入。
使用 HDFS 中的 Hive 数据
切换进入 Sqoop 文件夹,然后使用以下指令把 Hive 数据库中的数据导出到关系型数据库中:
其中 $mysqlIP 为您的关系型数据库的内网 IP 地址,test 为关系型数据库中的数据库名,--table 后跟的参数为您的关系型数据库的表名,--export-dir 后跟的参数为 Hive 表中的数据在 HDFS 中存储的位置。
使用 Hcatalog 进行导入
切换进入 Sqoop 文件夹,然后使用以下指令把 Hive 数据库中的数据导出到关系型数据库中:
其中 $mysqlIP 为您的关系型数据库的内网 IP 地址,test 为关系型数据库中的数据库名,--table 后跟的参数为您的关系型数据库的表名,--hcatalog-database 后面跟的参数是要导出的 Hive 表所在的数据库的名称,--hcatalog-table 后面跟的参数是要 Hive 中要导出的表的名称。
操作完成后可以进入关系型数据库查看是否导入成功:
更多关于 sqoop-export 命令的参数可以通过如下命令查看:
4. 将 orc 格式的 Hive 表格导入到关系型数据库中
❷ hdfs://localhost:8020 是什么地址
是的 1、列出mysql数据库中的所有数据库 sqoop list-databases --connect jdbc:mysql://localhost:3306/ -username dyh -password 000000 2、连接mysql并列出数据库中的表 sqoop list-tables --connect jdbc:mysql://localhost:3306/test --username dyh --password 000000 3、将关系型数据的表结构复制到hive中 sqoop create-hive-table --connect jdbc:mysql://localhost:3306/test --table users --username dyh --password 000000 --hive-table users --fields-terminated-by "\0001" --lines-terminated-by "\n"; 参数说明: --fields-terminated-by "\0001" 是设置每列之间的分隔符,"\0001"是ASCII码中的1,它也是hive的默认行内分隔符, 而sqoop的默认行内分隔符为"," --lines-terminated-by "\n" 设置的是每行之间的分隔符,此处为换行符,也是默认的分隔符; 注意:只是复制表的结构,表中的内容没有复制 4、将数据从关系数据库导入文件到hive表中 sqoop import --connect jdbc:mysql://localhost:3306/test --username dyh --password 000000 --table users --hive-import --hive-table users -m 2 --fields-terminated-by "\0001"; 参数说明: -m 2 表示由两基竖拍个map作业执行; --fields-terminated-by "\0001" 需同创建hive表时保持一致; 5、将hive中的表数据导入到mysql数据库表中 sqoop export --connect jdbc:mysql://192.168.20.118:3306/test --username dyh --password 000000 --table users --export-dir /user/hive/warehouse/users/part-m-00000 --input-fields-terminated-by '\0001' 注意: 1、在进行导入之前,mysql中的表userst必须已经提起创建好了。 2、jdbc:mysql://192.168.20.118:3306/test中的IP地址改成localhost会报异常,具体见本人上一篇帖纤滑子 6、将数据从关系数搏羡据库导入文件到hive表中,--query 语句使用 sqoop import --append --connect jdbc:mysql://192.168.20.118:3306/test --username dyh --password 000000 --query "select id,age,name from userinfos where \$CONDITIONS" -m 1 --target-dir /user/hive/warehouse/userinfos2 --fields-terminated-by ","; 7、将数据从关系数据库导入文件到hive表中,--columns --where 语句使用 sqoop import --append --connect jdbc:mysql://192.168.20.118:3306/test --username dyh --password 000000 --table userinfos --columns "id,age,name" --where "id > 3 and (age = 88 or age = 80)" -m 1 --target-dir /user/hive/warehouse/userinfos2 --fields-terminated-by ","; 注意:--target-dir /user/hive/warehouse/userinfos2 可以用 --hive-import --hive-table userinfos2 进行替换
❸ 大数据常用同步工具
一、离线数据同步
DataX
阿里的Datax是比较优秀的产品,基于python,提供各种数据村塾的读写插件,多线程执行,使用起来也很简单数锋皮,操作简单通常只需要两步;
创建作业的配置文件(json格式配置reader,writer);
启动执行配置作业。
非常适合离线数据,增量数据可以使用一些编码的方式实现,
缺点:仅仅针对insert数据比较有效,update数据就不适合。缺乏对增量更新的内置支持,因为DataX的灵活架构,可以通过shell脚本等方式方便实现增量同步。
参考资料:
github地址:https://github.com/alibaba/DataX
dataX3.0介绍:https://www.jianshu.com/p/65c440f9bce1
datax初体验:https://www.imooc.com/article/15640
文档:https://github.com/alibaba/DataX/blob/master/hdfswriter/doc/hdfswriter.md
Sqoop
Sqoop(发音:skup)是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql…)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。
地址:http://sqoop.apache.org/
Sqoop导入:导入工具从RDBMS到HDFS导入单个表。表中的基蠢每一行被视为HDFS的记录。所有记录被存储在文本文件的文本数据或者在Avro和序列文件的二进制数据。
Sqoop导出:导出工具从HDFS导出一组文件到一个RDBMS。作为输入到Sqoop文件包含记录,这被称为在表中的行。那些被读取并解析成一组记录和分隔使用用户指定的分隔符。
Sqoop支持全量数据导入和增量数据导入(增量数据导入分两种,一是基于递增列的增量数据导入(Append方式)。二是基于时间列的增量数据导入(LastModified方式)),同时可以指定数据是否以并发形式导入。
Kettle
Kettle是一款国外开源的ETL工具,纯java编写,可以在Window、Linux、Unix上运行,数据抽取高效稳定。
Kettle的Spoon有丰富的Steps可以组装开发出满足多种复杂应用场景的数据集成作业,方便实现全量、增量数据同步。缺点是通过定时运行,实时性相对较差。
NiFi
Apache NiFi 是一个易于使用、功能强大而且可靠的数据拉取、数据处理和分发系统,用于自动化管理系统间的数据流。它支持高度可配置的指示图的数据路由、转换和系统中介逻辑,支持从多种数据源动态拉取数据。
NiFi基于Web方式工作,后台在服务器上进行调度。 用户可以为数据处理定义为一个流程,然后进行处理,后台具有数据处理引擎、任务调度等组件。
几个核心概念:
Nifi 的设计理念接近于基于流的编程 Flow Based Programming。
FlowFile:表示通过系统移动的每个对象,包含数据流的基本属性
FlowFile Processor(处理器):负责实际对数据流执行工作
Connection(连接线):负责不同处理器之间的连接,是数据的有界缓冲区
Flow Controller(流量控制器):管理进程使用的线程及其分配
Process Group(过程组):进程组是一组特定的进程及其连接,允许组合其他组件创建新组件
参考资料
Nifi简介及核心概念整理
官方网站:http://nifi.apache.org/index.html
二、实时数据同步
实时同步最灵活的还是用薯差kafka做中间转发,当数据发生变化时,记录变化到kafka,需要同步数据的程序订阅消息即可,需要研发编码支持。这里说个mysql数据库的同步组件,阿里的canal和otter
canal
https://github.com/alibaba/canal
数据抽取简单的来说,就是将一个表的数据提取到另一个表中。有很多的ETL工具可以帮助我们来进行数据的抽取和转换,ETL工具能进行一次性或者定时作业抽取数据,不过canal作为阿里巴巴提供的开源的数据抽取项目,能够做到实时抽取,原理就是伪装成mysql从节点,读取mysql的binlog,生成消息,客户端订阅这些数据变更消息,处理并存储。下面我们来一起搭建一下canal服务
早期,阿里巴巴B2B公司因为存在杭州和美国双机房部署,存在跨机房同步的业务需求。不过早期的数据库同步业务,主要是基于trigger的方式获取增量变更,不过从2010年开始,阿里系公司开始逐步的尝试基于数据库的日志解析,获取增量变更进行同步,由此衍生出了增量订阅&消费的业务,从此开启了一段新纪元。
ps. 目前内部版本已经支持mysql和oracle部分版本的日志解析,当前的canal开源版本支持5.7及以下的版本(阿里内部mysql 5.7.13, 5.6.10, mysql 5.5.18和5.1.40/48)
基于日志增量订阅&消费支持的业务:
数据库镜像
数据库实时备份
多级索引 (卖家和买家各自分库索引)
search build
业务cache刷新
价格变化等重要业务消息
otter
https://github.com/alibaba/otter
otter是在canal基础上又重新实现了可配置的消费者,使用otter的话,刚才说过的消费者就不需要写了,而otter提供了一个web界面,可以自定义同步任务及map表。非常适合mysql库之间的同步。
另外:otter已在阿里云推出商业化版本 数据传输服务DTS, 开通即用,免去部署维护的昂贵使用成本。DTS针对阿里云RDS、DRDS等产品进行了适配,解决了Binlog日志回收,主备切换、VPC网络切换等场景下的同步高可用问题。同时,针对RDS进行了针对性的性能优化。出于稳定性、性能及成本的考虑,强烈推荐阿里云用户使用DTS产品。
❹ sqoop启动job报错,怎么解决
sqoop使用hsql来存储job信码谈息,开启metastor service将job信息共享,所有node上的sqoop都可以运行同一个job
一、sqoop的配置文件在sqoop.site.xml中:
1、sqoop.metastore.server.location
本地存储路径,默认在tmp下,改为其他路径
2、sqoop.metastore.server.port
metastore service端口号
3、sqoop.metastore.client.autoconnect.url
sqoop自动连接的metastore地址,默认是本地的metastore地址
4、sqoop.metastore.client.enable.autoconnect
开启自动连接。sqoop默认连接本地metastore。注释这个配置会开启自动连接。
二、开启metastore service
sqoop下,nohup bin/sqoop metastore
三烂模樱、创饥丛建job
sqoop支持两种增量导入模式,
一种是 append,即通过指定一个递增的列,比如:
--incremental append --check-column num_iid --last-value 0
varchar类型的check字段也可以通过这种方式增量导入(ID为varchar类型的递增数字):
--incremental append --check-column ID --last-value 8
另种是可以根据时间戳,比如:
--incremental lastmodified --check-column created --last-value '2012-02-01 11:0:00'
就是只导入created 比'2012-02-01 11:0:00'更大的数据。
bin/sqoop job --meta-connect jdbc:hsqldb:hsql://10.106.1.234:16000/sqoop --create job_zyztest13 -- import --connect jdbc:oracle:thin:@10.106.1.236:1521:orcl --username SQOOP --password sqoop --table LXC_TEST_HBASE_TO_ORACLE --columns NAME,SEX,AGE,CSRQ -m 1 --hbase-table SQOOP_IMPORT_TEST3 --column-family info --hbase-row-key NAME --split-by NAME --incremental lastmodified --check-column CSRQ --last-value '2012-02-01 11:0:00' --verbose
nohup /opt/hadoopcluster/sqoop-1.4.2.bin__hadoop-2.0.0-alpha/bin/sqoop job --exec job_zyztest13 > job_zyztest13.out 2>&1 &
此时,在10.106.1.234上创建了job_zyztest13这个job,通过bin/sqoop job --meta-connect jdbc:hsqldb:hsql://10.106.1.234:16000/sqoop --list可以查看所有job
四、定时执行
使用linux定时器:crontab -e
编辑定时器,添加*/4 * * * * /opt/hadoopcluster/sqoop-1.4.2.bin__hadoop-2.0.0-alpha/bin/sqoop job --meta-connect jdbc:hsqldb:hsql://10.106.1.234:16000/sqoop --exec job_zyztest13 > job_zyztest13.out 2>&1 & 任务将会每四分钟执行一次
❺ 在哪个路径下执行sqoop命令
作用: 列出在指定的时间和日期在计算机上运行的已计划命令或计划命令和程序。首先要保证“计划”服务已启动才能使用 at 命令。 格式: at [IP] [[ID] [/delete] /delete [/yes]] at [computername] time [/interactive] [/every:date[,...] /next:date[,...]] command 使用说明: (1)如果在没有参数的情况下使用,则 at 列出已计划的命令。 (2)IP:指定远程计算机,在此输入远程计划机的IP地址。如果省略该参数,命令将安排在本地计算机。 (3)ID:指定指派给已计划命令的识别码。 (4)/delete:取消已计划的命令。如果省略了ID,计算机中已计划的命令将被全部取消。 /yes:当删除已计划的事件时,对系统的查询强制进行肯定的回答。 (5)/time:指定运行命令的时间。将时间以 24 小时标记(00:00 [午夜] 到 23:59)的方式表示为小时:分钟。 (6)/interactive:允许作业与在作业运行时登录用户的桌面进行交互。 (7)/every:date[,...]:在每个星期或月的指定日期(例如,每个星期四,或每月的第三天)运行命令。将 date 指定为星期的一天或多天 (M,T,W,Th,F,S,Su),或月的一天或多天(使用 1 到 31 的数字)。用逗号分隔多个日期项。如果省略了 date,将假定为该月的当前日期。 (8)/next:date[,...]:在重复出现下一天(例如,下个星期四)时,运行指定命令将 date 指定为星期的一天或多天 (M,T,W,Th,F,S,Su),或月的一天或多天(使用 1 到 31 的数字)。用逗号分隔多个日期项。如果省略了 date,将假定为该月的当前日期。 (喊迹行9)command:指定要运行的 Windows 2000 命令、程序(.exe 或郑哗 .com 文件)或批处理程序(.bat 或 .cmd 文件)。当命令需要路径作为参数时,请使用绝对路径,也就是从驱动器号开始的整个路径。如果命令在远程计算机上,请指定服务器和共享名的 UNC 符号,而不是远程驱动器号。如果命令不是可执行 (.exe) 文件,必须在命令前加上 cmd /c,例如: cmd /c dir > c: est.out 实例: (1)列出州耐本机已有的计划命令。 C:>at 由于本机没有计划命令,所在显示为“清单是空的”。 (2)查看IP地址为192.168.1.13的计算机计划服务列表。 C:>at 192.168.1.13 运行后可以看到在IP地址为192.168.1.13计算机中有一项计划服务,这项计划服务要执行的日期、时间以及程序。 (3)取消IP地址为192.168.1.13的计算机计划服务。 (4)指定d:muma.exe程序在IP为192.168.1.13的远程计算机上,于20:50运行。