这是一个正确的apache spark使用场景吗?

时间:2017-03-23 11:12:44

标签: hadoop apache-spark

我是一名sql和c#开发人员,刚刚进入了世界的火花和hadoop。 这是我日常工作的场景:

  1. 我们有一些巨大的表格,其中包含股票和基金价格数据。
  2. 要获得有关股票或基金的表现或统计数据,我们必须检索每种工具的历史数据并进行数学计算。

  3. 我们在c#中以多线程方式进行计算(即在我们的c#代码中,我们创建了多个线程来从数据库加载数据并进行计算)。

  4. 由于我对spark和Hadoop的经验非常有限,如果我们从c#迁移到spark,这是我对所需更改的感受:

    1. 我需要将所有计算转换为python。
    2. 我需要将SQL数据加载到Hadoop
    3. Spark将负责运行我的功能,我不再需要编写多线程代码了。
    4. 当Spark在内存中加载数据并进行并行计算时,它将比c#方式快得多。
    5. 我的理解是对的吗?

      我不知道的一些事情,并希望有人可以给我一些启示:

      1. 如何知道哪个函数可以拆分并行运行?
      2. 我是否需要以某种方式编写代码以便它可以并行运行(例如拆分数据加载和计算)?
      3. 例如,假设我在c#中有这个功能:

        CalculatePerformance(string code, DateTime start, DateTime end)
        {
            var historyData = LoadHistory(code, start, end);
            CalculatePerformance(historyData);
        }
        

        我可以在Python中轻松地重写它,但是如何在内部激活火花以使计算更快,是否就像spark会创建大量线程或什么?

2 个答案:

答案 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上看起来很棒的读字数例。