我是一名sql和c#开发人员,刚刚进入了世界的火花和hadoop。 这是我日常工作的场景:
要获得有关股票或基金的表现或统计数据,我们必须检索每种工具的历史数据并进行数学计算。
我们在c#中以多线程方式进行计算(即在我们的c#代码中,我们创建了多个线程来从数据库加载数据并进行计算)。
由于我对spark和Hadoop的经验非常有限,如果我们从c#迁移到spark,这是我对所需更改的感受:
我的理解是对的吗?
我不知道的一些事情,并希望有人可以给我一些启示:
例如,假设我在c#中有这个功能:
CalculatePerformance(string code, DateTime start, DateTime end)
{
var historyData = LoadHistory(code, start, end);
CalculatePerformance(historyData);
}
我可以在Python中轻松地重写它,但是如何在内部激活火花以使计算更快,是否就像spark会创建大量线程或什么?
答案 0 :(得分:1)
我可以通过四个主要步骤总结一个火花工作:
1- Initializing Spark只是为了创建你的sparContext,这里没有并行性
2-使用sparContext.textfile(路径)加载数据,根据类型(jscon,csv,parquet,...)加载数据存在很多方法:此操作将创建RDD [T](数据集)或其他用例中的DataFrame)
3-在RDD [T]上制作transformation(地图,过滤....) 例如,您可以使用自定义函数(T => X)转换RDD [X]中的RDD [T]
4-制作actions(收集,减少......)
因此,如果你在最后调用一个动作,每个spark执行器将创建许多线程(取决于数据重新分区)来加载=> transform =>行动。
很抱歉这个快速解释,还有很多其他的东西在火花中(阶段,随机播放,缓存......),我希望能让你理解它的开始。
答案 1 :(得分:0)
要非常小心,Spark根本不是魔法,需要做很多工作才能控制" ; - )
您必须首先了解RDD /分区/作业/ DAG概念,并且使用Hadoop,您将在YARN上运行Spark,这是另一个需要学习的主题。
Spark不会在内存中加载数据,还有输入"插件" (它给出了分区号),你决定将数据缓存在内存或磁盘中,或者根本不缓存。
欢迎使用Java,您必须处理垃圾收集器,确保有足够的内存来容纳您的数据并运行您的代码,包含大量数据和节点,调整非常棘手。
说实话,如果这可以与C#一起使用,请坚持下去!永远不要相信在Spark上看起来很棒的读字数例。