工作中涉及到了关系数据库和非关系数据库的数据转换,即mysql和hbase之间的数据转换,这里用到了sqoop进行数据转移。对hbase的操作除了自带的一些api,还用到了phoenix。使用crontabs定时完成sqoop创建的job的shell脚本完成自动化执行。通过phoenix链接hbase,再用scala语言,通过spark完成具体的大数据操作。

这里总结了一些具体用到的操作,刚开始写博客,有很多地方需要向前辈好好学习!加油!

文中若有内容错误,还请评论指出!谢谢!

1. hbase相关操作

用到的一些hbase基础api

1.1 创建hbase表 user,并有一个userinfo列簇

因为之后要用phoenix操作hbase,所以这里所有的表名和列簇都要用大写的,才不会有冲突

create “TEST:USER”,“USERINFO”

– 描述表,查看表信息

describe “TEST:USER”

– 扫描表,查看具体数据

scan “TEST:USER”, {LIMIT =>10}

– 清空表,清空表内数据

disable “TEST:USER”

– 删除表,表结构删除

drop “TEST:USER”

2.Sqoop相关操作

2.1 sqoop import

通过sqoop从mysql导入数据,下面是sqoop import的语句,和具体参数的解释。

import是一次性导入,如果需要自动化导入需要用到下面的job

sqoop import \

–connect \ 这里放数据库的链接信息,示例 jdbc:mysql://192.168.8.8/user_info

–username \ 这里放链接数据库的用户名

–password \ 这里放链接数据库的密码

–query \ 这里放具体的sql,通过sql选取对应的数据。存到hbase里

–hbase-table TEST:USER \ 这里放上面建好的hbase表名

–column-family BOY \ 这里放组名吧,具体了解可以查一下非关系数据库的相关资料

–hbase-row-key id -m 1 这句加上就好,是hbase的rowkey设置

2.2 sqoop job

除了基本import的一些参数,job多了几个参数

job是可以和下面的定时器组合成一套自动化数据导入,所以这里也建议再建一个表专门记录自动化导入的一些数据,比如导入了多少条,时间,哪个表之类的,相当于一个日志表吧

sqoop job
–create userTest \ 这里是这个job的名字
– import
–connect
–username
–password
–query
–hbase-table TEST:USER
–column-family BOY
–hbase-row-key ROW -m 1
–null-string ‘\N’
–null-non-string ‘\N’
–incremental append \ 这里选择了增量导入,有两种方式往下看

–check-column “USERID” \ 选择 user_id 列作为增量导入的标识列
–last-value 22 上次导入末尾id为22,这次id为23开始

增量导入

方式一:Append方式

比如:有一个订单表,里面每个订单有一个唯一标识自增列ID,在关系型数据库中以主键形式存在,之前已经将id在1-3的编号的订单导入到了Hive中,现在一段时间后我们需要将近期产生的新的订单数据(id为4、5的两条数据)导入Hive,供后续数仓进行分析。此时我们只需要指定-incremental参数为append,-last-value参数为3即可。表示只从大于3后开始导入。

方式二:lastModify方式

​ 基于lastModify的方式,要求原表中有time字段,它能指定一个时间戳,让SQoop把该时间戳之后的数据导入至Hive,因为后续订单可能状态会发生变化,变化后time字段时间戳也会发生变化,此时SQoop依然会将相同状态更改后的订单导入Hive,当然我们可以指定merge-key参数为id,表示将后续新的记录与原有记录合并。

参考链接:https://www.cnblogs.com/yfb918/p/10858355.html

2.3 sqoop-job脚本

job创建后,如果想用下面的定时器来完成自动化操作,就需要写一个简单的shell脚本来配合。

运行job的能力时,会让用户输入密码,所以在shell里面加上对应的方法来返回密码,就可以通过这个shell脚本来运行job对应的能力了,shell脚本示例如下,保存为test.sh:

#!/usr/bin/expect
spawn sqoop job -exec userTest // job创建时的名字
expect “password:”
send "password\n" //链接mysql数据库时的密码
expect eof
exit

3.crontabs定时器

3.1定时器构造

这是定时器的内部构造,主要看Example,每位是关于时间设定,定时中的时间就是通过这里设定的,相当于一个闹钟吧

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

前三行是用来配置crond任务运行的环境变量的,这里一般不用变

第一行SHELL变量指定了系统要使用哪个shell,这里是bash

第二行PATH变量指定了系统执行命令的路径

第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户

星号(*):代表所有可能的值,如month字段为星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。

逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”

中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”

正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。

比如将上面的shell脚本设置成这样,每天凌晨1点就会执行一次job的能力,转移一次数据,user是当前登录shell的用户名,

0 0 1 * * user /data/userData/user/test.sh
3.2定时器用例

具体时间用例: (?为 用户名 和 具体指令比如shell脚本)

例1:每隔5秒执行一次:*/5 * * * * ?

例2:每隔5分执行一次:0 */5 * * * ?

在26分、29分、33分执行一次:0 26,29,33 * * * ?

例3:每天半夜12点30分执行一次:0 30 0 * * ? (注意日期域为0不是24)

每天凌晨1点执行一次:0 0 1 * * ?

每天上午10:15执行一次: 0 15 10 ? * * 或 0 15 10 * * ? 或 0 15 10 * * ? *

每天中午十二点执行一次:0 0 12 * * ?

每天14点到14:59分,每1分钟执行一次:0 * 14 * * ?

每天14点到14:05分,每1分钟执行一次:0 0-5 14 * * ?

每天14点到14:55分,每5分钟执行一次:0 0/5 14 * * ?

每天14点到14:55分,和18点到18点55分,每5分钟执行一次:0 0/5 14,18 * * ?

每天18点执行一次:0 0 18 * * ?

每天18点、22点执行一次:0 0 18,22 * * ?

每天7点到23点,每整点执行一次:0 0 7-23 * * ?

每个整点执行一次:0 0 0/1 * * ?

常用的语句:

crontab -e 可以编辑本用户的定时任务

crontab -l 查看本用户的定时任务

crontab -r 删除本用户的定时任务

tail -f /var/log/cron 查看定时任务的日志

service crond status 查看当前定时器状态

4.rowKey设计

作为非关系数据库的一员,HBase查询只能通过其Rowkey来查询(Rowkey用来表示唯一一行记录),Rowkey设计的优劣直接影响读写性能

由于HBase是通过Rowkey查询的,一般Rowkey上都会存一些比较关键的检索信息,我们需要提前想好数据具体需要如何查询,根据查询方式进行数据存储格式的设计,要避免做全表扫描,因为效率特别低。

Rowkey设计应遵循以下原则:

**1. Rowkey的唯一原则 **: 必须在设计上保证其唯一性。

2. Rowkey的排序原则

3. Rowkey的散列原则

为了保证rowkey的唯一,可以用时间戳来设计,这里我就使用的主键id做个示例如下:

SELECT user_id AS "USER_ID", id_ AS "HID", CONCAT( CEILING( RAND( ) * 90000+10000 ))

5.phoenix相关操作

Phoenix是构建在HBase上的一个SQL层,能让我们用标准的JDBC APIs而不是HBase客户端APIs来创建表,插入数据和对HBase数据进行查询。Phoenix完全使用Java编写,作为HBase内嵌的JDBC驱动。Phoenix查询引擎会将SQL查询转换为一个或多个HBase扫描,并编排执行以生成标准的JDBC结果集。
Download:http://phoenix.apache.org/download.html,下载hbase对应版本的phoenix;解压bin.tar.gz包,拷贝phoenix server jar包到hbase集群的每个region server 的lib目录下,然后重启hbase 集群。

连接hbase,地址为HBase集群配置zookeeper集群的ip地址和端口 :

bin/sqlline.py 192.168.8.8:2020

具体语法就看官网吧,基本和sql是差不多的,就是注意Hbase是区分大小写的,Phoenix 默认会把sql语句中的小写转换成大写,所以为了避免很多尴尬的冲突,建议hbase全用大写,表名,簇名全大写!

官网 http://phoenix.apache.org/language/index.html

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐