hive之Load data引发的思考

hive之Load data引发的思考

一 背景?

load data 可以将本地文件或者hdfs文件加载到hive表中,很方便。hive sql 走的是mr,对内存占用不是很大,主要依赖磁盘性能,这也毋庸置疑。考虑到测试环境的内存并不是很充足。所以我想采用load data 进行数据的加载。虽然性能比起来, mr没有spark快。由于是T+1的,所以我还是能接受的。PS: 谁让咱穷呢。

二 文件去哪了?

算盘已经打好。准备开撸了。数据源是来自api上报生成日志文件,通过flume写入到hdfs,大致是这个样子的。

在这里插入图片描述
我们不难看出,这是采集的注册事件, 日期是2021-08-17的,然后按照小时存放的 (00-23) ,每个小时文件夹下面有6个文件。那我们开始入仓吧!!!

 hive -v \
  -hivevar hadoop_dir=${hadoop_dir} \
  -hivevar dt=${do_date} \
  -hivevar cur_date=${cur_date} \
  -hivevar flume_dir_date=${flume_dir_date} \
  -f /data_center/dc_az_jobs/scripts/sql/ods_register_ddi.sql
-- 创建ods_register_ddi表
CREATE EXTERNAL TABLE IF NOT EXISTS `ods.ods_register_ddi`(
  line string comment "原始数据"
)
COMMENT "注册事件原始数据表"
PARTITIONED BY (`dt` string)
tblproperties (
    'creator' = 'LocoCao',
    'create_date' = '${cur_date}'
);
load data inpath "${hadoop_dir}" OVERWRITE into table ods.ods_register_ddi partition(dt='${dt}');

事情发展的还算顺利。我可以在hive表中查到了数据。然而,当我打开hdfs的时候发现21-08-17文件都是空的。正常来讲,我们已经将数据迁移到了数仓。丢失不丢失不影响。但是经过一番深思熟虑之后。还是觉得最好不要将数据丢失。难免别的同事也会用到相同的数据源(不知道我想的是不是多余的)。既然问题出了,那该怎么办呢???备份,备份,备份。以下是完整的脚本

#***********************************************************************************************
# **  1. 一些基础的校验
# **  2. 任务执行 t+1
# **  3. 先将昨天flume写入到hdfs的夹子备份一份到tmp目录下,为了防止load data 将夹子数据移走
# **  4. 然后用hive sql 将数据保存到ods层。
#**********************************************************************************************
#!/bin/bash
export PATH=${HADOOP_HOME}/bin:${HIVE_HOME}/bin:${PATH}
event_name="register"
cur_date=$(date +%Y-%m-%d)
echo "cur_date: $cur_date"
do_date=$(date -d '-1 day' +%Y-%m-%d)
flume_dir_date=$(date -d '-1 day' +%y-%m-%d)
if [[ -n "$1" ]]; then
    do_date=$1
    flume_dir_date=${do_date:2}
fi
echo "do_date: $do_date"
echo "flume_dir_date: $flume_dir_date"
echo "hive_home: ${HIVE_HOME}"
hadoop_flume_dir="/flume/dc/${event_name}/${flume_dir_date}"
# 为了防止load data 的时候将flume的夹子数据迁移走,先做把数据复制到临时目录,然后再做迁移
hadoop_tmp_dir="/tmp/dc/${event_name}"
# 判断hadoop夹子是否存在
hadoop fs -test -e ${hadoop_flume_dir}
if [[ $? -ne 0 ]]; then
    echo "error: hadoop_flume_dir Directory not exists!"
    exit 0
fi
# 如果存在拷贝一份到临时目录
hadoop fs -test -e ${hadoop_tmp_dir}
if [[ $? -ne 0 ]]; then
    # 目录不存在,创建目录
    hadoop fs -mkdir -p ${hadoop_tmp_dir}
    if [[ $? -ne 0 ]]; then
        echo "error: create hadoop_tmp_dir Directory error!"
        exit 0
    fi
    echo "create hadoop_tmp_dir success"
fi
# 创建目录后
hadoop fs -cp -f ${hadoop_flume_dir} ${hadoop_tmp_dir}
if [[ $? -ne 0 ]]; then
    # 如果拷贝失败,退出
    echo "error: copy data error"
    exit 0
fi
echo "copy data success"
# 这个目录是为了load data 准备的
hadoop_dir="${hadoop_tmp_dir}/${flume_dir_date}/*/*"
echo "hadoop_dir: ${hadoop_dir}"
hadoop fs -test -s ${hadoop_dir}
if [[ $? -eq 0 ]] ;then
    hive -v \
        -hivevar hadoop_dir=${hadoop_dir} \
        -hivevar dt=${do_date} \
        -hivevar cur_date=${cur_date} \
        -hivevar flume_dir_date=${flume_dir_date} \
        -f /data_center/dc_az_jobs/scripts/sql/ods_register_ddi.sql
else
    echo "error: Directory is empty"
    exit 0
fi

三 哪来的小文件?

上面我们说到,flume采集到的夹子总共00-23共24个,每个6个文件,总共下来144个文件。这是17号一天的。这个时候我来到了ods.db这个文件加下,发现dt=2021-08-17分区的数据确实有了,但是小文件太多了。
在这里插入图片描述
足足有146个。为什么会这么多呢? 原来load 只是单纯的复制/移动的文件,将数据文件移动到 Hive 表对应的位置。

要想解决,只能修改flume落盘的文件数量。如果还有别的好办法,大伙可以评论哦。

四 思考

spark从hdfs如何读文件和如何落盘呢?(不存在以上问题)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值