从hive抽取数据,写入hbase

一、datax插件hbase12xwriter开发

查看datax源码,发现有hbase094xwriter和hbase11xwriter源码,说明datax支持hbase写入,再查看测试和生产环境使用的hbase版本是:hbase-1.2.0-cdh5.8.4

自己写一个hbase12xwriter插件包

开发流程:

1、搭建项目模块module

datax-all项目上右击->New->other->Maven->Maven Module选中, Next

Module Name:hbase12xwriter

Parent Project:datax-all

Next 下一步

Next下一步:

Finish完成,项目中就多了一个模块hbase12xwriter,并且 datax-all的pom.xml中<modules>结点最后会自动加一行<module>hbase12xwriter</module>

2、把原来hbase11xwriter包中代码和pom文件拷贝到新建的模块中

修改拷贝过来的pom.xml

hbase版本号修改为:1.2.0   hadoop版本号修改为:2.6.0

3.hbase12xwriter项目右击->build path->configure build path->source添加 Folder

src/main/resources

将hbase11xwriter/src/main/resources中

plugin_job_template.json

plugin.json拷贝过来

4.将src/main/下的assembly文件夹及package.xml拷贝过来,不然打包不成功

拷贝过来修改里面内容为hbase12xwriter

5.hbase12xwriter项目右击->run as->Maven build->install

BUILD SUCCESS就表示编译成功

得到jar包:hbase12xwriter-0.0.1-SNAPSHOT.jar

6.拷贝doc/hbase11xwriter.md过来hbase12xwriter修改

7.在hive/tmp库下建测试表:
create table tmp.test_hive_to_hbase
(
id         int          comment 'ID',
code    string     comment '订单编码',
amt      float       comment '订单金额',
time     string     comment '发货时间'
)
comment '订单表'  ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE ;

插入数据到表:

在目录下cd /home/zallds/users/wcy

vi 000000_0

写入2行数据:

10001,order-001,189.25,2018-01-09
10002,order-002,3900.80,2018-01-10

进入hadoop命令目录:

cd /data/hadoop-2.6.0-cdh5.8.4/bin

从本地文件系统中复制单个或多个源路径到hdfs目标文件系统。

hadoop fs -put /home/zallds/users/wcy/000000_0  /user/hive/warehouse/tmp.db/test_hive_to_hbase

这个时候在hive里查表:select * from tmp.test_hive_to_hbase发现有数据了

8.在hbase中创建表:

create  'test_hbase_write',{NAME=>'cf'}

create  'temp_pm_price',{NAME=>'cf'}

9.构造json文件

{
"job": {
"setting": {
"speed": {
"channel": 1
}
},
"content": [{
"reader": {
"parameter": {
"fileType": "text",
"fieldDelimiter": ",",
"column": [{
"index": "0",
"type": "int"
}, {
"index": "1",
"type": "string"
}, {
"index": "2",
"type": "float"
}, {
"index": "3",
"type": "string"
}],
"encoding": "UTF-8",
"path": "/user/hive/warehouse/tmp.db/test_hive_to_hbase",
"defaultFS": "hdfs://cluster"
},
"name": "hdfsreader"
},
"writer": {
"name": "hbase12xwriter",
"parameter": {
"hbaseConfig": {
"hbase.rootdir": "hdfs://cluster/hbase",
"hbase.cluster.distributed": "true",
"hbase.zookeeper.quorum": "master"
},
"table": "test_hbase_write",
"mode": "normal",
"rowkeyColumn": [{
"index": 0,
"type": "id"
}],
"column": [{
"index": 0,
"name": "cf:id",
"type": "int"
},
{
"index": 1,
"name": "cf:code",
"type": "string"
},
{
"index": 2,
"name": "cf:amt",
"type": "float"
},
{
"index": 3,
"name": "cf:time",
"type": "string"
}
],
"encoding": "utf-8"
}
}
}]
}
}
 
 

其中hbaseConfig的配置要查看/data/hbase-1.2.0-cdh5.8.4/conf/hbase-site.xml里的配置项,

"hbase.rootdir": "hdfs://cluster/hbase",
    "hbase.cluster.distributed": "true",
    "hbase.zookeeper.quorum": "master"

上测试环境查看hbase配置文件:/data/hbase-1.2.0-cdh5.8.4/conf/hbase-site.xml

在datax/job/下

vi 290.json

把json内容粘贴进去

10.在/home/datax/plugin/writer下创建目录

[root@master writer]$ mkdir hbase12xwriter

把hbase12xwriter-0.0.1-SNAPSHOT.jar包上传到hbase12xwriter 目录下

在hbase12xwriter目录下创建libs目录,将本地项目的jar包全部上传

把plugin_job_template.json和plugin.json文件拷贝进去

12.在datax/bin目录下执行任务

python datax.py ../job/290.json

没有报错信息,但数据没有进入hbase

再细看日志,发现报了错:

原来是hdfsreader读取数据时,用到了datax-common或plugin-unstructured-storage-util包里的工具类,没有定义int类型和IntColumn类型,把hdfsreader中配置字段为int的改成long,hbase12xreader对应的reader还是配置int

就可以执行成功,并且hbase表中有数据,可都是缺少第一条数据

从http接口取抽取数据,到hive

问题梳理:

1.http请求拿到返回结果,是json串

输入参数:

1)http请求地址:URL

2)http请求参数:parameters  eg:  name='zs' &

返回结果:json串,解析成一条条记录,

将第条记录解析成一个个字段值,

写入hive表:要知道 库,表,表的字段名

2.tbl_transfer表结构已经不适合该需求了,离线平台任务配置也不适合该需求了,要重新开发页面来配置?表可否共用呢?扩展字段?

target_db_type:hdfs

target_db_name:tmp

target_table:tmp_user_http

query_sql:不用填

columns:同其他一样,不过列的顺序要按hdfs表中顺序一致,eg:name:name,type:string;name:age,type:int;name:mobile,type:string;name:address,type:string

需要增加字段:

1)类型:标识是http接口到hdfs抽取 ;  source_db_type:http

2)http接口URL地址;

3)http接口参数

3.dataxJson如何修改:

根据抽取类型:http接口  来生成对应的json,源相关的字段用不到,要用到新增加字段httpUrl和params,和列columns来生成json

4.zeus上任务该如何配呢?

同其他任务一样配置

zeus调度任务配置:

/home/bin/dump 内容:

#! /usr/bin/env bash
. /etc/profile
export DATAX_HOME=/data/datax if [ $# == 2 ]; then
today=$2
else
today=`date -d -1days '+%Y-%m-%d'`
fi java -jar /home/software/dataxJson_product.jar $1 $today
if test $? -ne 0
then
exit 11
fi cd $DATAX_HOME/bin
python datax.py ../job/$1.json

/home/bin/hiveF 内容:

#! /usr/bin/env bash
. /etc/profile
command=`java -jar /home/lib/hiveF.jar $*`
echo "$command"
hive -e "$command"

搭建httpreader模块,加入datax-all的module中

1、开发流程:

2.部署流程:

1)在datax/plugin/reader/目录下创建httpreader目录

httpreader目录下四个文件如下:

httpreader.jar包deploy拷贝进来,eclipse中libs下所有jar文件拷贝到libs目录,两个.json是模板文件,修改下

3.开发column列配置

4.考虑http到hdfs增量抽取,默认load_type为空,即是truncate,可选择update和partUpdate  测试环境需要把ssh2连接的包ganymed-ssh2-build210.jar上传到hdfswriter的libs下

mysql到hdfs支持增量导入

datax支持hive增量同步思想:

1.truncate 全量

2.复盖:

全量复盖

部分分区复盖

3.更新

全表更新

分区更新

4.追加

分类:
    1.load_type==1 全量同步,无分区;(适用于小表,参数表,全删全插)--->对应我们的truncate
    2.load_type==2 增量或者全量同步合并全量,按天分区;(适用于类似用户访问明细表,新增不修改,直接插入)
    3.load_type==3 增量同步合并全量,无分区(适用于类似用户表,直接插入)--->对应我们的update
    4.load_type==4 增量同步,有分区,抽取数据为目标表多个分区全量数据;(适用于类似支付订单表,按照分区字段覆盖分区插入)
    5.load_type==5 增量同步,有分区;(适用于类似订单表,按创建时间分区,最后修改时间抽取,按照非分区字段覆盖分区插入)
 
 
 
        w_partition_name不为空    '''hive -e "use %s;alter table %s add if not exists partition(%s='%s') location '%s';"''' 
load_data_cmd = load_data_cmd % (job_info["w_database"],job_info["w_table"],job_info["w_partition_name"],job_info["w_partition_value"],load_path)
流程:
    1.创建hive分区
        1)计算分区,拿到分区值:分区默认按时间【年月日分区】 date=2018-06-05
        2)判断该分区是否已经存在,存在的先删除
        3)组装拼成sql,执行hive -e sql,创建分区表
     2.   删除创建临时表
        1)if(load_type>1)   即load_type=2,3,4,5时,
            a)先删除临时表:hive -e drop table if exists temp.temp_table;
            b)创建临时表:hive -e  create_sql
        create_sql=use r_database;

create table table_name(

  1. col1 string,
  2. col2 string,
  3. col3 string,
  4. col4 string,
  5. col5 string)ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
  6. WITH SERDEPROPERTIES ( "input.regex" = "正则表达式" ) STORED AS TEXTFILE;
    3.构建路径
        1)if(load_type==1) ,
            a)系统默认使用时间分区【年月日】,计算分区值,拼路径load_path=hdfs://SAD-HDP-003:9000/user/hive/warehouse/库名.db/表名/分区【date=2018-06-06】
            b)拼装datax.py -p命令

                datax.py -p '-Dr_host=%s -Dr_port=%s -Dr_username=%s -Dr_password=%s -Dr_database=%s -Dr_table=%s -Dr_where=%s -Dr_sql=%s -Dr_columns=%s
                    -Dr_encoding=%s -Dr_params=%s -Dr_concurrency=%s -Dw_dir=load_path -Dprefix_filename=%s -Dw_encoding=%s -Dw_buffer_size=%s -Dw_del_mode=%s 
                    -Dw_concurrency=%s ' ROOT_PATH /job/js_mysql_to_hdfs_job.xml
        2)if(load_type>1),
            a)根据hive表名构建hdfs临时表路径
                load_path = "hdfs://nameservice1/user/hive/warehouse/temp.db/" + table_name
            b)拼装datax.py -p命令
                datax.py -p '-Dr_host=%s -Dr_port=%s -Dr_username=%s -Dr_password=%s -Dr_database=%s -Dr_table=%s -Dr_where=%s -Dr_sql=%s -Dr_columns=%s
                    -Dr_encoding=%s -Dr_params=%s -Dr_concurrency=%s -Dw_dir=load_path -Dprefix_filename=%s -Dw_encoding=%s -Dw_buffer_size=%s -Dw_del_mode=%s 
                    -Dw_concurrency=%s ' ROOT_PATH /job/js_mysql_to_hdfs_job.xml
    4.执行命令,抽取数据 datax etl
        1)替换datax.py -p命令中replace("$START_TIME",date)
        2)替换datax.py -p命令中replace("$YM_TEXT",ym)
        3)替换datax.py -p命令中replace("$LAST_YM_TEXT",last_ym)
        4)替换datax.py -p命令中replace("$END_TIME",date_after)
       然后执行命令
    5.后序处理:
        1)指定表的location
            if(load_type<=1),
                a)默认分区,/date=年-月-日
                b)添加一个分区:
                    hive -e use w_database;alter table w_table add if not exists partition(date='w_partition_value') location load_path;
                c)执行命令
            if(load_type>1),
                a)loady_type>1,即是2,3,4,5都是增量,
                    hive -e use temp; ALTER table %s  set  location '%s'; ("temp",job_info_map["temp_table"],load_path)
                b)执行命令
        2)合并处理:merge
            a)if(load_type==2)
                i)处理columns拼接上date:即id,name,password,date这样的
                ii)拼装hive_sql:
                    hive -e set set hive.exec.dynamic.partition.mode=nonstrict;
                                set hive.exec.max.dynamic.partitions.pernode=1000;
                                INSERT OVERWRITE TABLE  w_database.w_table  PARTITION(w_partition_name)  select colums_str from temp.temp_table
                iii)执行hive_sql命令
            b)if(load_type==3,4,5) 暂时不考虑
                
                
 
 
mysql->hive
1.默认writeMode:truncate  全量导入(二次开发:先删,后加,全量)
2.writeMode:partAppend   分区增量更新
3.writeMode:append                不分区增量追加(原始,不合并,不更新,只追加)
4.writeMode:update                不分区增量更新(合并,更新,追加)

datax二次开发的更多相关文章

  1. Navisworks API 简单二次开发 (自定义工具条)

    在Navisworks软件运行的时候界面右侧有个工具条.比较方便.但是在二次开发的时候我不知道在Api那里调用.如果有网友知道请告诉我.谢谢. 我用就自己设置一个工具.界面比较丑!没有美工. 代码: ...

  2. [连载]《C#通讯(串口和网络)框架的设计与实现》- 12.二次开发及应用

    目       录 第十二章     二次开发及应用... 2 12.1        项目配制... 3 12.2        引用相关组件... 4 12.3        构建主程序... 5 ...

  3. OBS-Studio二次开发记录

    OBS-Studio 是一款跨平台的,开源的视频直播客户端软件. 公司需要对他进行二次开发,开发的目的是使用它的录屏功能. 开发的要求是:定制全新的界面,所见即所得,window系统兼容要好. 开发步 ...

  4. 小猪cms微信二次开发之怎样分页

    $db=D('Classify'); $zid=$db->where(array('id'=>$this->_GET('fid'),'token'=>$this->tok ...

  5. 承接 AutoCAD 二次开发 项目

    本人有多年的CAD开发经验,独立完成多个CAD二次开发项目.熟悉.net及Asp.net开发技术,和Lisp开发技术. 现在成立了工作室,独立承接CAD二次开发项目.结项后提供源码及开发文档,有需要的 ...

  6. 【工业串口和网络软件通讯平台(SuperIO)教程】七.二次开发服务驱动

    SuperIO相关资料下载:http://pan.baidu.com/s/1pJ7lZWf 1.1    服务接口的作用 围绕着设备驱动模块采集的数据,根据需求提供多种应用服务,例如:数据上传服务.数 ...

  7. 【工业串口和网络软件通讯平台(SuperIO)教程】三.二次开发流程

    1.1    二次开发流程图 1.2    引用相关组件 找到“开发包”,引用里边的相关组件.如下图: 1.3    开发设备驱动模块 1.3.1    开发发送协议驱动 继承SuperIO.Devi ...

  8. Civil 3D API二次开发学习指南

    Civil 3D构建于AutoCAD 和 Map 3D之上,在学习Civil 3D API二次开发之前,您至少需要了解AutoCAD API的二次开发,你可以参考AutoCAD .NET API二次开 ...

  9. visio二次开发——图纸解析之线段

    多写博客,其实还是蛮好的习惯的,当初大学的时候导师就叫我写,但是就是懒,大学的时候,谁不是魔兽或者LOL呢,是吧,哈哈哈. 好了,接着上一篇visio二次开发——图纸解析,我继续写. 摘要: (转发请 ...

随机推荐

  1. IDEA2019.2个人使用方案

    参考文档 https://segmentfault.com/a/1190000019813993?utm_source=tag-newest

  2. xaml 中 引用嵌套类的对象

    public class MotorType1 { public class MotorType2 { public class MotorType3 { /// <summary> // ...

  3. Winform非UI线程更新UI界面的各种方法小结

    我们知道只有UI线程才能更新UI界面,其他线程访问UI控件被认为是非法的.但是我们在进行异步操作时,经常需要将异步执行的进度报告给用户,让用户知道任务的进度,不至于让用户误认为程序“死掉了”,特别是对 ...

  4. 【HANA系列】【第二篇】SAP HANA XS使用JavaScript编程详解

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列][第二篇]SAP HANA XS ...

  5. PJzhang:任意密码重置的常规姿势

    猫宁!!! 之前在360补天看过carry_your分享的46分钟短视频“任意用户密码重置的10种姿势”. 在京东SRC安全小课堂第89期,也有一篇他的文章:web漏洞之逻辑漏洞挖掘.内容朴实无华. ...

  6. 贪心+DFS:引水入城

    ...我觉得这道题放在贪心里应该不为过 原文:https://blog.csdn.net/qq_41513352/article/details/80726030 题目测评请点击——>https ...

  7. 在 Windows 10 上用超级终端配置 Cisco 3560 Series

    在Cisco实验中,恢复路由器出厂配置是必须的内容,所以今天就由小编来为大家介绍Cisco软件怎么恢复路由器出厂配置. 1. 通过终端连接交换机1.1. 通过 Windows 的超级终端连接 Cisc ...

  8. webdriervAPI(By声明定位方法)

    from  selenium  import  webdriver from  selenium.webdriver.common.by  import  By 导入By方法 driver  =  w ...

  9. Go语言入门篇-网络经验

    Go语言学习手册 golang*看云  golang圣经 wuYinIO 1.go语言开发中的坑 go新手容易犯的三个致命错误   Golang 需要避免踩的 50 个坑 2.go语言数据类型 map ...

  10. mint ui解决Navbar和Infinite scroll共存时的bug

    Navbar和Infinite scroll共同使用时会出现无限加载的问题,滑动也会出现乱加载. 只需要判断一下就可以了,代码: html: <mt-navbar v-model="s ...