我试图学习整个开源大数据栈,我从hdfs、hadoopmapreduce和spark开始。对于“etl”,我或多或少受到mapreduce和spark(sql?)的限制,对于存储,我没有其他限制。
我有这样的情况:
我的数据源
数据源1(ds1):大量数据-总计约1tb。我在每一行中都有id(我们称它们为id1),用作键。格式:1000个json文件。
数据源2(ds2):数据源1的附加“元数据”。我在每一行中都有id(我们称它们为id2),用作键。格式:单个txt文件
数据源3(ds3):数据源1和2之间的Map。csv文件中只有id1、id2对。
我的工作区
我目前有一个虚拟机,有足够的数据空间,大约128gb的ram和16个CPU来处理我的问题(整个项目是一个研究,而不是生产使用的东西)。我已经安装了centos 7和cloudera 6.x。目前,我正在使用hdfs、mapreduce和spark。
任务
我只需要数据源1中的一些属性(id和一些字符串)。我的猜测是数据量不到10%。
我需要将ds3的id1(对:id1,id2)连接到ds1中的ids,将ds3的id2(对:id1,id2)连接到ds2中的ids。
我需要将ds2的属性(使用上一个项目符号的“Map”)添加到从ds1提取的属性中
我需要做一些“询问”,比如:
按年份查找最常用的单词
找出某个作者最常用的词
找出某个作者每年使用的最常用的词
等。
我需要可视化数据(即wordclouds,直方图等)在最后。
我的问题:
使用哪种工具从json文件中提取数据最有效?mapreduce还是spark(sql?)?
我在json中有数组。我知道spark中的explode函数可以转换我的数据。但是到这里最好的方法是什么?从ds1中提取id并将分解的数据放在它们旁边,然后将它们写入新文件,这是最好的方法吗?还是把一切结合起来更好?如何实现这一点-hadoop,spark?
我现在的想法是创造这样的东西:
使用spark从ds1中提取所需的属性(数组除外),并将其写入csv文件。
使用spark从ds1中提取所需的属性(仅限于分解的数组+ID),并将它们写入csv文件-每个分解的属性都写入自己的文件。
这意味着我已经提取了所有需要的数据,并且我可以很容易地用一个id连接它们。然后我想查询特定的问题并运行mapreduce作业。
问题是:这是个好主意吗?如果没有,我能做得更好吗?我应该把数据插入数据库吗?如果是,哪一个?
提前谢谢!
1条答案
按热度按时间hfwmuf9z1#
谢谢你的邀请!!在过去的1.5年里,我是一名bigdata开发人员,对mr和spark都有丰富的经验,我想我可以为您指引正确的方向。
使用mapreduce和spark可以获得您想要实现的最终目标。为了可视化,您可以使用apachezeppelin,它可以运行在最终数据之上。
spark作业是内存昂贵的作业,即spark作业的整个计算都在内存(即ram)上运行。只有最终结果才会写入hdfs。另一方面,mapreduce使用较少的内存量,并使用hdfs来写入间歇阶段的结果,从而使得更多的i/o操作和更多的时间消耗。
您可以使用spark的Dataframe功能。您可以直接从结构化数据(也可以是纯文本文件)将数据加载到dataframe,这将帮助您以表格格式获取所需的数据。您可以将Dataframe写入纯文本文件,也可以存储到配置单元表中,从中可以可视化数据。另一方面,使用mapreduce,您必须首先将数据存储在配置单元表中,然后编写配置单元操作来处理数据,并将最终数据存储到另一个配置单元表中。编写本地mapreduce作业可能非常繁忙,因此我建议不要选择该选项。
最后,我建议使用spark作为处理引擎(128gb和16核足够spark使用),以便尽快得到最终结果。