马上要毕业了,正是毕业设计和毕业论文的高峰期,本人定题仓库管理系统,相对来说业务方面比较简单,于是我便想着把自己的课设变得更加有挑战性。看到自己仓库的出入库记录,想起自己的数据库出入库信息表中的记录是个庞大的数据量,便想着在阿里云上面搭一个简单的大数据环境,进行一系列的数据分析。
在网上看了许多的资料,然后我就开始构思,搭建这个环境的难点在于,服务器的内存只有2g,怎样能让环境顺利的跑起来,多少的数据量是可接受范围内的。于是我便尽量减少结点数,让自己的环境跑起来,进行了繁杂的步骤之后,我的环境跑起来了,自拟了几个报表的需求,我就开始构思业务所需的中间表,用beeline在hive上建好了表,便开始完完整整走一遍ETL。当然第一步是想好自己需要数据库(MySQL)中的几张表,然后怎样把自己数据库(MySQL)的数抽取到HDFS,这个时候我想到了DataX,我用java写的单行插入,10分钟大概可以查两万万条数据(两张表各一万),然后我就开始了记录:
2万条数据, 用时10分钟插入到MySQL,dataX抽数到HDFS一张表用时14s,领一张表用时23s
20万条数据,用时快两个小时插入到MySQL,dataX用时一张15s,一张12s(没啥太大差别)
200万条数据,用时16小时插入到MySQL,dataX用时依然是十几秒
下面是我操作将近300万条数据用时:
由于内存有限,而且结点频繁挂掉,我就没有再做进一步尝试了
整个过程还是充满惊喜的,自己也学到了很多,比如这个过程编写了很多Linux 脚本啊,编写ETL工作流啊,设置shell脚本定时任务啊 当然整个过程最大的无奈是,想拓宽自己的内存,却又舍得花钱(狗头)。
下面附上我的ETL脚本示例:
E:
#!/bin/bash
PATH="/opt/java/jdk1.8.0_151/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"
echo "======================to do truncate=========================="
cd docker-hive
echo "truncate in background"
docker-compose exec -d hive-server env LANG=C.UTF-8 bash -c '/opt/hive/bin/beeline -u jdbc:hive2://localhost:10000 -e "truncate table ods_wms.record_in;"'
sleep 30
echo "======================to do extract=========================="
ip=`docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' docker-hive_namenode_1`
/opt/datax/bin/datax.py --jvm="-Xms200M -Xmx200M" -p"-Dip=$ip" /opt/datax/job/imp_wms_record_in.job
T:
#!/bin/bash
PATH="/opt/java/jdk1.8.0_151/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"
echo "======================to do transform=========================="
cd docker-hive
echo "transform in background"
docker-compose exec -d hive-server env LANG=C.UTF-8 bash -:'/opt/hive/bin/beeline -u jdbc:hive2://localhost:10000 -e "insert overwrite table ads_wms.goods_sells_info
select g.goods_id goods_id,
g.goods_name goods_name,
nvl(ro.out_count, 0) out_count
from ods_wms.goods g left join (select goods_id,
sum(out_count) out_count
from ods_wms.record_out
where out_time >= add_months(current_timestamp(), -1)
group by goods_id) ro
on g.goods_id = ro.goods_id;"'
L:
#!/bin/bash
PATH="/opt/java/jdk1.8.0_151/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"
echo "======================to do load=========================="
ip=`docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' docker-hive_namenode_1`
/opt/datax/bin/datax.py --jvm="-Xms200M -Xmx200M" -p"-Dip=$ip" /opt/datax/job/exp_goods_sells_info.job