数据仓库课程项目经验心得
项目地址&README
项目地址:
https://github.com/Baokker/data-warehouse-project
其中内容包括:
- 项目报告
- 代码
- 爬虫
- 数据处理
- 前端
- 后端
两篇README的链接在此:
对项目的
- 爬虫细节
- 数据处理方法
- 存储方案和优化方案
都做了比较多的介绍。这里我再谈一点我配置环境和数据处理中的心得。
pandas
pandas+jupyter真的是处理数据的一大利器,各位学一些pandas的基本语法加上jupyter的使用方法,数据处理的效率将会快的飞起
这里写一点我当时印象最深刻的一次debug。因为之前数据整理的格式不对,所以我在重新整理数据时,需要逐行处理,但是一开始时我的速度非常地慢,准确地说是一开始很快,然后越来越慢……大致代码如下:
1 |
|
可以看到,每次获取一行的数据后,我都需要重新concat整个数据,它的行数可能是一条,也可能是上万条,而后者的整理显然是费时的。假如处理的数据量为N,那么最后需要concat的量为1+2+3+..+N=O(N^2)!
正确的处理方法是,先用一个list装下所有单行的dataframe,再直接一次性concat,这样复杂度只有O(N),自然快了不少
1 |
|
另外,也要注意多看文档,多用pandas的内置函数,往往效率会高很多
安全性
配置项目的期间,我们组的两台服务器先后遭遇了黑客攻击,一次是我的MySQL被清空了数据,所幸数据早有备份;还有一次是组员的服务器被植入了xmrig挖矿病毒,最后也不知道怎么解决,直接把对应的端口关了,同时把植入的文件都删除了,算是勉强解决了问题
在此提醒
- 数据库密码一定要更改,不要设得太简单,例如
123456
,妥妥的被入侵 - 尽量少开放端口,或者对端口开放的ip做限制
MySQL导入csv
我先在本地用pandas处理完数据,并将dataframe转为csv文件,再用sftp上传到服务器上,接下来,我再使用MySQL(使用docker部署)本地写入csv。一定要本地,不然速度会很慢,几万条的数据一条一条太慢了
首先开启本地模式进入MySQL
1 |
|
再写入数据(已提前使用docker cp将对应csv数据拷贝到容器中)
1 |
|
Spark
项目要求建立起基于Spark的分布式查询系统。作为这个需求的负责人,我十分负责任地说这个需求非常逆天,配置难度个人认为比另外两个数据存储方案(关系型的MySQL和图数据库neo4j)都高出了不少
最后我们组(事实上还有另外两组,互帮互助)都采用了这篇方案
https://blog.csdn.net/sirobot/article/details/121750358
https://github.com/bambrow/docker-hadoop-workbench
这套方案的技术栈也比较复杂,包括
- docker(使用docker模拟多台机器节点)
- docker ce
- docker compose
- hadoop(分布式文件系统和MapReduce算法)
- hive(对分布式文件系统进行类似于SQL的处理)
- spark(在内存中计算,速度相较于MapReduce有大幅提升)
对命令行操作,阅读官方文档能力,debug能力,以及心理承受能力都有很高的要求
仿照这个项目给的参考例子,经过一番魔改和若干次宕机后,我总算让这个项目在我的服务器上跑了起来。接下来整理一下我配置环境中用到的步骤,及其对应的作用和命令
tips
- 多读官方文档,哪怕觉得英文难读。你永远不知道过时的中文文档会给你带来多大的困难
- 多用英文,谷歌搜索
配置
跑通这个项目,至少得是腾讯云4核8G的轻量应用服务器的配置(新人价388),内存越大越好。如果没有的话,考虑报销入一台,或者部署在本地电脑上
docker compose 安装
1 |
|
clone项目
1 |
|
接下来修改配置文件,包括spark的运行内存,hive的数据库密码,docker-compose的配置文件等,具体可参考我在Github上的代码:
https://github.com/Baokker/docker-hadoop-workbench
修改完即可运行
1 |
|
复制csv数据到hadoop
1 |
|
hive建表
1 |
|
create-table-postgresql.sql
见Github项目
Spark配置
1 |
|
安装pyspark
咱就是说,教程还是国外的劲
https://levelup.gitconnected.com/how-to-delete-and-install-pyspark-on-ubuntu-4e1bbefa11a3
debug:Spark找不到hadoop
这个bug卡了好几天……大概就是说,Spark可以运行,但是却找不到hdfs对应的文件位置。最后在原Github项目的issue里找到了问题:本地并不知道namenode表示什么。需要手动配置host
https://github.com/big-data-europe/docker-hadoop/issues/98
add hostname to /etc/hosts
1 |
|
运行
安装pyspark,然后尝试运行
1 |
|
运行出来的时候,有一种回家的美好
总结
数仓这门项目,果真是让我收货良多啊…