使用DataX,从Greenplum将数据传输到Hive分区表中

文章讲述了在大数据处理场景下,如何利用Datax工具将Greenplum中的实时计算数据高效地备份到Hive的按日分区表中。通过配置Datax作业,实现了从PostgreSQL内核的Greenplum到Hive的数据传输,同时提供了包括创建Hive分区表、执行数据迁移脚本以及设置定时任务的详细步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我司使用Greenplum作为计算库,实时计算统计数据,但是数据量大了之后影响计算速度。所以将每天的数据通过Datax传输到Hive的按日分区的分区表中,用于备份,其他数据放在Greenplum中作为实时数据计算。

Greenplum内核还是PostgreSQL,所以Datax配置还是使用PostgreSQL的连接。

数据表准备

hive建表,dt作为分区字段,比如dt='20230619'

create table test(
    id bigint comment '主键',
    name string comment '姓名',
    address string comment '地址',
    update_time timestamp comment '日期' 
) partitioned by (dt string)

Greenplum就是常规建表。

CREATE TABLE "public"."test" (
  "id" int8 NOT NULL,
  "name" varchar(255) COLLATE "pg_catalog"."default",
  "address" varchar(255) COLLATE "pg_catalog"."default",
  "update_time" timestamp(6),
  PRIMARY KEY ("id")
)
;

ALTER TABLE "public"."test" 
  OWNER TO "postgres";

COMMENT ON COLUMN "public"."test"."id" IS '主键';

COMMENT ON COLUMN "public"."test"."name" IS '姓名';

COMMENT ON COLUMN "public"."test"."address" IS '地址';

COMMENT ON COLUMN "public"."test"."update_time" IS '日期';

配置datax的job

{
  "job":{
    "content":[
      {
        "reader":{
			"name":"postgresqlreader",
			"parameter":{
				"column":[
							"id",             
                            "name",       
							"address",
							"update_time"
				],
				"where":
					"date(update_time) = to_date(${date}::text,'yyyyMMdd')",
				"connection":[
					{
						"jdbcUrl":[
						"jdbc:postgresql://localhost:5432/test"
						],
						"table":["public.test"]
					}
				],
				"password":"postgres",
				"username":"postgres"
			}
        },
        "writer":{
			"name":"hdfswriter",
			"parameter":{
				"column":[
					 {
						"name": "id",
						"type": "INT"
					 },
					 {
						"name": "name",
						"type": "STRING"
					 },
					 {
						"name": "address",
						"type": "STRING"
					 },
					 {
						"name": "update_time",
						"type": "TIMESTAMP"
					 }
				],
				"defaultFS": "hdfs://localhost:8020/",
				"fieldDelimiter": "\1",
				"fileName": "test_20230619",
				"fileType": "orc",
				"haveKerberos": false,
				"path": "/warehouse/tablespace/managed/hive/test/test/dt=${date}",
				"writeMode": "truncate"
			}
		}
      }
    ],
    "setting":{
      "speed":{
        "channel":"5"
      }
    }
  }
}

因为datax不支持动态分区字段,所以我把分区字段传到job中进行传输。

启动脚本

#!/bin/bash
# 1.获取日期参数
if [ $# -eq 0 ]
then
  echo "请添加参数1:tablename(必填) 2:date格式:20220101(非必填)"
  exit 1
elif [ $# -eq 1 ]
then
  date=$(date -d "-1 day" +%Y%m%d)
else
  date=$2
fi
tablename=$1
# 2. 创建Hive分区表
su - hdfs -c "hadoop fs -mkdir -p /warehouse/tablespace/managed/hive/test.db/${tablename}/dt=${date}"
# 3. 执行datax脚本
su - hdfs -c "python /opt/datax/bin/datax.py /opt/datax/job/${tablename}_gp2hive.json -p"-Ddate=${date}" > /opt/datax/log/"${tablename}".log"
# 4. 修复Hive分区表
su - hive -c "hive -e 'msck repair table test."${tablename}"'"

批量启动脚本

dir=$(ls /opt/datax/job/*.*)
for file in ${dir}
do
  filename=$(basename ${file})
  tablename=$(echo ${filename} | sed 's/_gp2hive.json//')
  sh /opt/datax/job/single_job.sh ${tablename}
done

定时启动

#加入定时启动
> crontab -e
0 3 * * * /opt/datax/job/batch_job.sh
# 查看是否存在定时任务
> crontab -l

注意
需要将batch_job.sh添加可执行权限,不然不能运行。

chmod +x batch_job.sh
下面是一个将 PG 数据库中的数据同步到 Hive 分区表DataX Job 的 json 脚本示例: ```json { "job": { "setting": { "speed": { "channel": "3" } }, "content": [ { "reader": { "name": "pgsqlreader", "parameter": { "column": [ "id", "name", "age", "gender" ], "connection": [ { "jdbcUrl": "jdbc:postgresql://localhost:5432/test", "table": "(select * from test_table) as t", "username": "username", "password": "password" } ], "splitPk": "id", "where": "" } }, "writer": { "name": "hdfswriter", "parameter": { "column": [ "id", "name", "age", "gender" ], "fieldDelimiter": "\t", "fileType": "text", "path": "/user/hive/warehouse/test.db/test_table", "fileName": "", "writeMode": "append", "compress": "NONE", "dateFormat": "yyyy-MM-dd", "encoding": "UTF-8", "nullFormat": "\\N", "header": "false", "footer": "false", "mergeSmallFiles": "false", "partition": [ { "name": "dt", "type": "string", "format": "yyyyMMdd", "value": "${date}" } ], "hiveConf": [ { "name": "hive.exec.dynamic.partition.mode", "value": "nonstrict" } ], "preSql": "", "postSql": "" } }, "transformer": { "name": "dt", "parameter": { "column": [ "id", "name", "age", "gender" ] } } } ] } } ``` 在这个示例中,我们使用 PGSQL Reader 读取 test_table 表中的数据,并使用 Hive Writer 将数据写入到 Hive 分区表 test_table 中。在 Hive Writer 中,我们指定了数据的分区字段为 dt,格式为 yyyyMMdd,并且指定了 Hive 表的路径为 /user/hive/warehouse/test.db/test_table。在 partition 中,我们使用了 ${date} 变量来动态指定数据的分区。 注意:在运行这个 DataX Job 之前,需要先创建好 Hive 表,并且在 Hive 中添加好对应的分区。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值