【问题标题】:Apache Spark cannot find class CSVReaderApache Spark 找不到类 CSVReader
【发布时间】:2016-09-25 16:09:09
【问题描述】:

我尝试解析简单 csv 文件的代码如下所示:

SparkConf conf = new SparkConf().setMaster("local").setAppName("word_count");
JavaSparkContext sc = new JavaSparkContext(conf);
JavaRDD<String> csv = sc.textFile("/home/user/data.csv");

JavaRDD<String[]> parsed = csv.map(x-> new CSVReader(new StringReader(x)).readNext());
parsed.foreach(x->System.out.println(x));  

但是,Spark 作业以找不到类的异常结束,提示找不到 CSVReader。我的pom.xml 看起来像这样:

<dependencies>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_2.10</artifactId>
        <version>1.1.0</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>com.opencsv</groupId>
        <artifactId>opencsv</artifactId>
        <version>3.8</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

我该如何解决这个问题?

【问题讨论】:

  • 嗯...您是否在运行时提供所需的库?
  • 旁注 - Spark 1.1.0 是一个非常旧的版本。当前版本是 2.0.0。
  • @Seelenvirtuose 我不知道如何回答。我是Maven的新手。我的理解是provided 会导致 JAR 被下载并与将要创建的最终 JAR 一起提供。 ://
  • 不幸的是,不是。范围provided 是对打包工具(例如 maven-war-plugin 或 maven-assembly-plugin 或其他任何东西)在打包程序中发送此库的提示,因为它将由运行时环境提供(例如,您使用的 tomcat 安装)。例如,Java EE API 是一个您依赖但始终由运行时提供的库。通常不提供其他库,因此您需要将其范围设置为compile。如果有帮助,我会为此写一个简短的答案。
  • @Seelenvirtuose 如果我错了,请纠正我,对于 Spark 运行时未提供的所有外部依赖项(例如 twitter4j、GSON 等),我必须将范围设置为 compile,事实上?跨度>

标签: java maven intellij-idea apache-spark


【解决方案1】:

如果您的代码依赖于其他项目,则需要将它们打包 在您的应用程序旁边,以便将代码分发到 Spark 簇。为此,请创建一个包含 您的代码及其依赖项。 sbt 和 Maven 都有组装 插件。创建程序集 jar 时,将 Spark 和 Hadoop 列为 提供的依赖项;这些不需要捆绑,因为它们是 由集群管理器在运行时提供。
来源:http://spark.apache.org/docs/latest/submitting-applications.html

Maven 在将项目打包到 JAR 时不会发送依赖项 JAR。为了提供依赖 JAR,我添加了 Maven Shade 插件。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>2.3</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <filters>
            <filter>
                <artifact>*:*</artifact>
                <excludes>
                    <exclude>META-INF/*.SF</exclude>
                    <exclude>META-INF/*.DSA</exclude>
                    <exclude>META-INF/*.RSA</exclude>
                </excludes>
            </filter>
        </filters>
        <finalName>${project.artifactId}-${project.version}</finalName>
    </configuration>
</plugin>  

另见:How to make it easier to deploy my Jar to Spark Cluster in standalone mode?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-06
    • 2015-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多