首先我先说一下采用尚硅谷数据导入要采用lzo 压缩的,直接走这篇文章去安装
CDH安装LZO压缩方式
获取到hadoop-lzo.jar /hadoop-lzo-0.4.15-cdh6.3.2.jar 之后上传到HDFS这个目录下
hdfs dfs -put /opt/cloudera/parcels/GPLEXTRAS/lib/hadoop/lib/hadoop-lzo-0.4.15-cdh6.3.2.jar /user/oozie/share/lib/lib_20210429181138/sqoop/
**/user/oozie/**这个目录是oozie 默认的jar包路径(是HDFS目录),然后是考虑更改一下权限(第一条是修改用户组,第二条是修改权限)
hdfs dfs -chown -R oozie:oozie /user/oozie/share/lib/lib_20210429181138/sqoop/*
hdfs dfs -chmod 775 /user/oozie/share/lib/lib_20210429181138/sqoop/hadoop-lzo-0.4.15-cdh6.3.2.jar
最后是检查一下自己集群里sqoop1 client 有配置那些
确定是datanode 节点
这些工作准备完成之后就是写shell 脚本,自己百度,或者查,
我这里写一部分;需要花点时间去理解语法,
其实不难的,这里就不需要指定Hadoop jar 了,
貌似sqoop 1 cdh 是不支持的,所以我们直接上传到 /user/oozie/share/lib/lib_20210429181138/sqoop 就可以了
p.s:这里不需要指定什么hadoop jar 这是本地指定指定还行,用oozie 调度就不需要再填写了
#! /bin/bash
APP=gmall
sqoop=/opt/cloudera/parcels/CDH/lib/sqoop/bin/sqoop
if [ -n "$2" ] ;then
do_date=$2
else
do_date=`date -d '-1 day' +%F`
fi
import_data(){
$sqoop import \
--connect jdbc:mysql://hadoop102:3306/$APP \
--username root \
--password 000000 \
--target-dir /origin_data/$APP/db/$1/$do_date \
--delete-target-dir \
--query "$2 and \$CONDITIONS" \
--num-mappers 1 \
--fields-terminated-by '\t' \
--compress \
--compression-codec lzop \
--null-string '\\N' \
--null-non-string '\\N'
}
import_order_info(){
import_data order_info "select
id,
final_total_amount,
order_status,
user_id,
out_trade_no,
create_time,
operate_time,
province_id,
benefit_reduce_amount,
original_total_amount,
feight_fee
from order_info
where (date_format(create_time,'%Y-%m-%d')='$do_date'
or date_format(operate_time,'%Y-%m-%d')='$do_date')"
}
import_coupon_use(){
import_data coupon_use "select
id,
coupon_id,
user_id,
order_id,
coupon_status,
get_time,
using_time,
used_time
from coupon_use
where (date_format(get_time,'%Y-%m-%d')='$do_date'
or date_format(using_time,'%Y-%m-%d')='$do_date'
or date_format(used_time,'%Y-%m-%d')='$do_date')"
}
case $1 in
"order_info")
import_order_info
;;
"base_category1")
import_base_category1
;;
"first")
import_base_category1
import_base_category2
import_base_category3
import_order_info
import_order_detail
;;
"all")
import_base_category1
import_base_category2
;;
esac
下面就是加载的脚本了,根据情况考虑全量还是增量
#!/bin/bash
APP=gmall
hive=/opt/cloudera/parcels/CDH/lib/hive/bin/hive
# 如果是输入的日期按照取输入日期;如果没输入日期取当前时间的前一天
if [ -n "$2" ] ;then
do_date=$2
else
do_date=`date -d "-1 day" +%F`
fi
sql1="
load data inpath '/origin_data/$APP/db/order_info/$do_date' OVERWRITE into table ${APP}.ods_order_info partition(dt='$do_date');
load data inpath '/origin_data/$APP/db/order_detail/$do_date' OVERWRITE into table ${APP}.ods_order_detail partition(dt='$do_date');
load data inpath '/origin_data/$APP/db/favor_info/$do_date' OVERWRITE into table ${APP}.ods_favor_info partition(dt='$do_date');
load data inpath '/origin_data/$APP/db/order_refund_info/$do_date' OVERWRITE into table ${APP}.ods_order_refund_info partition(dt='$do_date');
"
case $1 in
"first"){
$hive -e "$sql1$sql2"
};;
"all"){
$hive -e "$sql1"
};;
esac
然后是需要你提前建好表,建表语句参考这个(location 可以删除,hive默认是存储在 /user/hive/warehouse/数据库/表名)
drop table if exists ods_order_info;
create external table ods_order_info (
`id` string COMMENT '订单号',
`final_total_amount` decimal(16,2) COMMENT '订单金额',
`order_status` string COMMENT '订单状态',
`user_id` string COMMENT '用户id',
`out_trade_no` string COMMENT '支付流水号',
`create_time` string COMMENT '创建时间',
`operate_time` string COMMENT '操作时间',
`province_id` string COMMENT '省份ID',
`benefit_reduce_amount` decimal(16,2) COMMENT '优惠金额',
`original_total_amount` decimal(16,2) COMMENT '原价金额',
`feight_fee` decimal(16,2) COMMENT '运费'
) COMMENT '订单表'
PARTITIONED BY (`dt` string) -- 按照时间创建分区
row format delimited fields terminated by '\t' -- 指定分割符为\t
STORED AS -- 指定存储方式,读数据采用LzoTextInputFormat;输出数据采用TextOutputFormat
INPUTFORMAT 'com.hadoop.mapred.DeprecatedLzoTextInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
location '/warehouse/gmall/ods/ods_order_info/' -- 指定数据在hdfs上的存储位置
;
终于到hue +oozie 了
网上有hue +oozie 的整合教程
hue+oozie 结合
oozie 自带UI界面及问题处理
-------------------------------------------分割线------------------------------------
oozie 使用教程
直接说出现的问题吧
配置的时候添上这些参数好一些
HADOOP_USER_NAME=${wf:user()}
yarn.app.mapreduce.am.admin-command-opts
-Dfile.encoding=UTF-8
出现这个问题:
org.apache.hadoop.security.AccessControlException: Permission denied: user=root, access=WRITE, inode="/":hdfs:supergroup:drwxr-xr-x
用户权限不足,在/etc/profile里添加
export HADOOP_USER_NAME=hdfs
然后
source /etc/profile
出现这个问题,就是我说的sqoop 没有分配,然后就是对应的lzo.jar 包上传到指定目录就可以了(这个问题纠结了2天多了)
使用shell 脚本的 是对于$1 $2 的时候,直接写死也可以,也可以灵活设置,网上有教程(面向百度编程);
还有就是配置完成后,记得重启一下HDFS或者oozie 就好;
最后执行记得看yarn 运行日志就好
7点了,收工,有问题可以在下面评论一下!