Python 如何将文件传递到主节点?

Python 如何将文件传递到主节点?,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,我已经用python编写了实现二进制分类的代码,我想使用ApacheSpark基于本地计算机中的不同数据文件并行化这个分类过程。我已经完成了以下步骤: 我已经编写了包含4个python文件的整个项目:“run_classifier.py”(用于运行我的分类应用程序)、“classifier.py”(用于二进制分类)、“load_params.py”(用于加载分类的学习参数)和“preprocessing.py”(用于预处理数据)。该项目还使用依赖文件:“tokenizer.perl”(用于预处理

我已经用python编写了实现二进制分类的代码,我想使用ApacheSpark基于本地计算机中的不同数据文件并行化这个分类过程。我已经完成了以下步骤:

  • 我已经编写了包含4个python文件的整个项目:“run_classifier.py”(用于运行我的分类应用程序)、“classifier.py”(用于二进制分类)、“load_params.py”(用于加载分类的学习参数)和“preprocessing.py”(用于预处理数据)。该项目还使用依赖文件:“tokenizer.perl”(用于预处理部分)和“nonbreaking_prefixes/nonbreaking_prefix.en”(也用于预处理部分)

  • 脚本文件“run_classifier.py”的主要部分定义如下:

    ### Initialize the Spark
    conf = SparkConf().setAppName("ruofan").setMaster("local")
    sc = SparkContext(conf = conf,
        pyFiles=['''All python files in my project as
                 well as "nonbreaking_prefix.en" and "tokenizer.perl"'''])
    
    ### Read data directory from S3 storage, and create RDD
    datafile = sc.wholeTextFiles("s3n://bucket/data_dir") 
    
    ### Sent the application on each of the slave node
    datafile.foreach(lambda (path, content): classifier(path, content)) 
    
  • 但是,当我运行脚本“run_classifier.py”时,似乎找不到文件“nonbreaking_prefix.en”。以下是我得到的错误:

    错误:在/tmp/spark-f035270e-e267-4d71-9bf1-8c42ca2097ee/userFiles-88093e1a-6096-4592-8a71-be5548a4f8ae/非中断前缀中未找到缩写文件


    但实际上我将文件“nonbreaking_prefix.en”传递给了主节点,我对错误一无所知。如果有人能帮我解决这个问题,我将不胜感激。

    您可以使用
    sc.addFile
    上传您的文件,并使用
    SparkFile获取工作人员的路径。获取

    from pyspark import SparkFiles
    
    sc = (SparkContext(conf = conf,
        pyFiles=["All",  "Python", "Files",  "in",  "your", "project"])
    
    # Assuming both files are in your working directory
    sc.addFile("nonbreaking_prefix.en")
    sc.addFile("tokenizer.perl")
    
    def classifier(path, content):
       # Get path for uploaded files
       print SparkFiles.get("tokenizer.perl")
    
       with open(SparkFiles.get("nonbreaking_prefix.en")) as fr:
           lines = [line for line in fr]
    

    您可以使用
    sc.addFile
    上载文件,并使用
    SparkFiles.get
    获取工作进程的路径:

    from pyspark import SparkFiles
    
    sc = (SparkContext(conf = conf,
        pyFiles=["All",  "Python", "Files",  "in",  "your", "project"])
    
    # Assuming both files are in your working directory
    sc.addFile("nonbreaking_prefix.en")
    sc.addFile("tokenizer.perl")
    
    def classifier(path, content):
       # Get path for uploaded files
       print SparkFiles.get("tokenizer.perl")
    
       with open(SparkFiles.get("nonbreaking_prefix.en")) as fr:
           lines = [line for line in fr]
    

    您可以尝试
    --files
    选项为执行者分发文件吗?pyfiles参数仅用于Python文件(通常
    *.py
    )。我相信pyfiles也可以与egg文件一起使用,因此您可能希望将代码结构为一个包,将非python文件列为依赖项,将包编译为egg,然后将egg包含在pyfiles中。如何
    --files=nonbreaking_prefixes/nonbreaking_prefix.en
    ,或者删除目录结构?在spark日志中是否看到其他错误?e、 g.没有此类文件,请参见。您可能希望了解如何搜索“缩写”文件,并提高spark的调试级别,以查看哪些文件分发到节点。我无能为力。您可以尝试
    --files
    选项为执行者分发文件吗?pyfiles参数仅用于Python文件(通常
    *.py
    )。我相信pyfiles也可以与egg文件一起使用,因此您可能希望将代码结构为一个包,将非python文件列为依赖项,将包编译为egg,然后将egg包含在pyfiles中。如何
    --files=nonbreaking_prefixes/nonbreaking_prefix.en
    ,或者删除目录结构?在spark日志中是否看到其他错误?e、 g.没有此类文件,请参见。您可能希望了解如何搜索“缩写”文件,并提高spark的调试级别,以查看哪些文件分发到节点。没有什么我能帮得上忙的了。@zeros323非常感谢您伟大的回答
    addFile()
    是一个将所有依赖文件传递到从属节点的强大功能!但是我仍然对函数
    addFile('location of nonbreaking_prefix.en')
    中文件“location of nonbreaking_prefix.en”的位置感到困惑。具体地说,我将'nonbreaking_prefix.en'放在不同的位置,例如s1='/root/nonbreaking_prefix.en'和s2='/root/spark/bin/nonbreaking_prefix.en'。实际上,
    addFile(s2)
    工作得非常好。但是对于
    addFile(s1)
    ,从属节点无法找到文件的位置。我想知道问题的原因。我现在无法检查,但一般来说,
    addFile
    是一个相当简单的工具。如果您需要复杂的结构,最好使用分布式文件系统。@zeros323非常感谢您的回答
    addFile()
    是一个将所有依赖文件传递到从属节点的强大功能!但是我仍然对函数
    addFile('location of nonbreaking_prefix.en')
    中文件“location of nonbreaking_prefix.en”的位置感到困惑。具体地说,我将'nonbreaking_prefix.en'放在不同的位置,例如s1='/root/nonbreaking_prefix.en'和s2='/root/spark/bin/nonbreaking_prefix.en'。实际上,
    addFile(s2)
    工作得非常好。但是对于
    addFile(s1)
    ,从属节点无法找到文件的位置。我想知道问题的原因。我现在无法检查,但一般来说,
    addFile
    是一个相当简单的工具。如果需要复杂的结构,最好使用分布式文件系统。