【问题标题】:How to run code on the AWS cluster using Apache-Spark?如何使用 Apache-Spark 在 AWS 集群上运行代码?
【发布时间】:2015-07-16 21:31:42
【问题描述】:

我已经编写了一个 python 代码来总结每个 csv 文件的第一列中的所有数字,如下所示:

import os, sys, inspect, csv

### Current directory path.
curr_dir = os.path.split(inspect.getfile(inspect.currentframe()))[0]

### Setup the environment variables
spark_home_dir = os.path.realpath(os.path.abspath(os.path.join(curr_dir, "../spark")))
python_dir = os.path.realpath(os.path.abspath(os.path.join(spark_home_dir, "./python")))
os.environ["SPARK_HOME"] = spark_home_dir
os.environ["PYTHONPATH"] = python_dir

### Setup pyspark directory path
pyspark_dir = python_dir
sys.path.append(pyspark_dir)

### Import the pyspark
from pyspark import SparkConf, SparkContext

### Specify the data file directory, and load the data files
data_path = os.path.realpath(os.path.abspath(os.path.join(curr_dir, "./test_dir")))

### myfunc is to add all numbers in the first column.
def myfunc(s):
    total = 0
    if s.endswith(".csv"):
            cr = csv.reader(open(s,"rb"))
            for row in cr:
                total += int(row[0])
                return total

def main():
### Initialize the SparkConf and SparkContext
    conf = SparkConf().setAppName("ruofan").setMaster("spark://ec2-52-26-177-197.us-west-2.compute.amazonaws.com:7077")
    sc = SparkContext(conf = conf)
    datafile = sc.wholeTextFiles(data_path)

    ### Sent the application in each of the slave node
    temp = datafile.map(lambda (path, content): myfunc(str(path).strip('file:')))

    ### Collect the result and print it out.
    for x in temp.collect():
            print x

if __name__ == "__main__":
    main()

我想使用 Apache-Spark 使用相同的 python 代码并行化多个 csv 文件的求和过程。我已经完成了以下步骤:

  1. 我在 AWS 上创建了一个主节点和两个从节点。
  2. 我已使用 bash 命令 $ scp -r -i my-key-pair.pem my_dir root@ec2-52-27-82-124.us-west-2.compute.amazonaws.com 将目录 my_dir 包括我的 python 代码和 csv 文件上传到集群主节点。
  3. 我已经登录了我的主节点,并从那里使用 bash 命令$ ./spark/copy-dir my_dir 将我的 python 代码以及 csv 文件发送到所有从节点。
  4. 我已经在主节点上设置了环境变量:

    $ export SPARK_HOME=~/spark

    $ export PYTHONPATH=$SPARK_HOME/python/:$PYTHONPATH

但是,当我在主节点上运行 python 代码时:$ python sum.py,它显示以下错误:

Traceback (most recent call last):
  File "sum.py", line 18, in <module>
    from pyspark import SparkConf, SparkContext
  File "/root/spark/python/pyspark/__init__.py", line 41, in <module>
    from pyspark.context import SparkContext
  File "/root/spark/python/pyspark/context.py", line 31, in <module>
    from pyspark.java_gateway import launch_gateway
  File "/root/spark/python/pyspark/java_gateway.py", line 31, in <module>
    from py4j.java_gateway import java_import, JavaGateway, GatewayClient
ImportError: No module named py4j.java_gateway

我对这个错误没有任何想法。另外,我想知道主节点是否会自动调用所有从节点并行运行。如果有人可以帮助我,我真的很感激。

【问题讨论】:

    标签: python amazon-web-services apache-spark master-slave


    【解决方案1】:

    这是我将如何调试此特定导入错误的方法。

    1. ssh 到你的主节点
    2. 使用$ python 运行python REPL
    3. 尝试失败的导入行&gt;&gt; from py4j.java_gateway import java_import, JavaGateway, GatewayClient
    4. 如果失败,尝试简单地运行&gt;&gt; import py4j
    5. 如果失败,则意味着您的系统要么没有安装 py4j,要么找不到它。
    6. 退出 REPL &gt;&gt; exit()
    7. 尝试安装 py4j $ pip install py4j(你需要安装 pip)
    8. 打开 REPL $ python
    9. 再次尝试导入&gt;&gt; from py4j.java_gateway import java_import, JavaGateway, GatewayClient
    10. 如果可行,那么&gt;&gt; exit() 并尝试再次运行您的$ python sum.py

    【讨论】:

    • 感谢您的评论!我只是想通了为什么我的案子不起作用。看来AWS上运行Spark的AMI不是基于Ubuntu的,根本没有安装py4j。
    • 我很高兴你解决了。您愿意将此标记为正确答案吗?
    【解决方案2】:

    我认为您在问两个不同的问题。看起来你有一个导入错误。是否有可能您在本地计算机上安装了尚未在主节点上安装的不同版本的 py4j 软件包?

    我无法帮助并行运行它。

    【讨论】:

    • 感谢您的评论!我不认为这是一个问题,因为我的代码应该运行任何版本的 spark 及其包。另外,当我创建主节点时,已经设置了主节点上的火花。
    • 这绝对是一个导入错误。您需要进行调试,重点是帮助 python 找到您安装的模块。它可能与您的路径有关:stackoverflow.com/questions/26533169/…
    • AWS 主节点上的 Spark 会自动安装。同样正如我在问题中所说,我正确导出了环境变量。所以我对自己的问题一无所知......
    猜你喜欢
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 2017-04-16
    • 1970-01-01
    • 2018-08-23
    • 2017-03-19
    • 1970-01-01
    相关资源
    最近更新 更多