CDH 6.3.2 实战oozie+hue+sqoop+hive 应用碰到的问题(Class com.hadoop.compression.lzo.LzoCodec not found问题 )

1 篇文章 0 订阅

首先我先说一下采用尚硅谷数据导入要采用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点了,收工,有问题可以在下面评论一下!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值