Я прочитал несколько тем об этой проблеме на StackOverflow и других ресурсах ( 1st , 2nd , 3rd ), но, к сожалению, это не помогает. Также почти все они описывают ту же проблему на SBT, а не на Maven.
Я также проверил совместимость Scala / Spark в документах Spark ( здесь ), и похоже, что у меня есть правильные версии ( Scala 2.11.8 + Spark 2.2.0)
Я опишу свой рабочий процесс полностью, потому что я не уверен, какая информация может быть sh полезна для установления root причины.
Это код, который я пытаюсь создать
pom. xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>SparkWordCount</artifactId>
<version>1.0-SNAPSHOT</version>
<name>SparkWordCount</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<sourceDirectory>src/main/scala</sourceDirectory>
<testSourceDirectory>src/test/scala</testSourceDirectory>
<plugins>
<!-- mixed scala/java compile -->
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.3.1</version>
<executions>
<execution>
<id>compile</id>
<goals>
<goal>compile</goal>
</goals>
<phase>compile</phase>
</execution>
<execution>
<id>test-compile</id>
<goals>
<goal>testCompile</goal>
</goals>
<phase>test-compile</phase>
</execution>
<execution>
<phase>process-resources</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<!-- for fatjar -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<finalName>uber-SparkWordCount-1.0-SNAPSHOT</finalName>
<appendAssemblyId>false</appendAssemblyId>
</configuration>
<executions>
<execution>
<id>assemble-all</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>fully.qualified.MainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.spark/spark-core -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.2.0</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.spark/spark-sql -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>2.2.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
SparkWordCount. scala
import org.apache.spark.sql.SparkSession
import org.apache.log4j.Logger
import org.apache.log4j.Level
object SparkWordCount {
def main(args: Array[String]) {
Logger.getLogger("org").setLevel(Level.ERROR)
val spark = SparkSession
.builder()
.appName("SparkSessionZipsExample")
.master("local")
.getOrCreate()
val myRdd = spark.sparkContext.parallelize(List(1,2,3,4,5,6,7))
myRdd.foreach(number => println("Lol, this is number = " + number))
}
}
Он отлично работает, когда я просто запускаю метод main ():
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
Lol, this is number = 1
Lol, this is number = 2
Lol, this is number = 3
Lol, this is number = 4
Lol, this is number = 5
Lol, this is number = 6
Lol, this is number = 7
Затем я попытался использовать Spark SQL DataFrame:
import org.apache.spark.sql.{DataFrame, SparkSession}
import org.apache.log4j.Logger
import org.apache.log4j.Level
object SparkWordCount {
def main(args: Array[String]) {
Logger.getLogger("org").setLevel(Level.ERROR)
val spark = SparkSession
.builder()
.appName("SparkSessionZipsExample")
.master("local")
.getOrCreate()
val airports: DataFrame = spark.read.csv("C:\\Users\\Евгений\\Desktop\\DATALEARN\\airports.csv")
airports.show()
}
}
И этот код выдает ошибку:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/Logger
at SparkWordCount$.main(SparkWordCount.scala:10)
at SparkWordCount.main(SparkWordCount.scala)
Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Logger
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 2 more
Process finished with exit code 1
Я не уверен, как именно это работает, но я исправил это, изменив конфигурацию запуска и установив флажок «Включить зависимости в предоставленную область»
После этого мой код Spark SQL также работает нормально:
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
+---------+--------------------+-------------+-----+-------+--------+----------+
| _c0| _c1| _c2| _c3| _c4| _c5| _c6|
+---------+--------------------+-------------+-----+-------+--------+----------+
|IATA_CODE| AIRPORT| CITY|STATE|COUNTRY|LATITUDE| LONGITUDE|
| ABE|Lehigh Valley Int...| Allentown| PA| USA|40.65236| -75.44040|
| ABI|Abilene Regional ...| Abilene| TX| USA|32.41132| -99.68190|
| ABQ|Albuquerque Inter...| Albuquerque| NM| USA|35.04022|-106.60919|
| ABR|Aberdeen Regional...| Aberdeen| SD| USA|45.44906| -98.42183|
| ABY|Southwest Georgia...| Albany| GA| USA|31.53552| -84.19447|
| ACK|Nantucket Memoria...| Nantucket| MA| USA|41.25305| -70.06018|
| ACT|Waco Regional Air...| Waco| TX| USA|31.61129| -97.23052|
| ACV| Arcata Airport|Arcata/Eureka| CA| USA|40.97812|-124.10862|
| ACY|Atlantic City Int...|Atlantic City| NJ| USA|39.45758| -74.57717|
| ADK| Adak Airport| Adak| AK| USA|51.87796|-176.64603|
| ADQ| Kodiak Airport| Kodiak| AK| USA|57.74997|-152.49386|
| AEX|Alexandria Intern...| Alexandria| LA| USA|31.32737| -92.54856|
| AGS|Augusta Regional ...| Augusta| GA| USA|33.36996| -81.96450|
| AKN| King Salmon Airport| King Salmon| AK| USA|58.67680|-156.64922|
| ALB|Albany Internatio...| Albany| NY| USA|42.74812| -73.80298|
| ALO|Waterloo Regional...| Waterloo| IA| USA|42.55708| -92.40034|
| AMA|Rick Husband Amar...| Amarillo| TX| USA|35.21937|-101.70593|
| ANC|Ted Stevens Ancho...| Anchorage| AK| USA|61.17432|-149.99619|
| APN|Alpena County Reg...| Alpena| MI| USA|45.07807| -83.56029|
+---------+--------------------+-------------+-----+-------+--------+----------+
only showing top 20 rows
Но когда я пытаюсь o выполнить команды Maven «clean -> package», я получаю несколько ошибок, и все они относятся к пакету org. apache:
D:\Work Projects\SparkWordCount\src\main\scala\SparkWordCount.scala:3: error: object apache is not a member of package org
import org.apache.spark.sql.{DataFrame, SparkSession}
^
D:\Work Projects\SparkWordCount\src\main\scala\SparkWordCount.scala:4: error: object apache is not a member of package org
import org.apache.log4j.Logger
^
D:\Work Projects\SparkWordCount\src\main\scala\SparkWordCount.scala:5: error: object apache is not a member of package org
import org.apache.log4j.Level
^
D:\Work Projects\SparkWordCount\src\main\scala\SparkWordCount.scala:10: error: not found: value Logger
Logger.getLogger("org").setLevel(Level.ERROR)
Это подробности о моей среде, возможно, некоторые из них будут полезны:
- Scala 2.11.8 установлено и работает:
- Spark 2.2.0 установлен и работает через Spark-Shell
- Я загрузил WinUtils, создал в нем папку «bin», скопировал winutils.exe для hadoop_2.7.1 и вставил его в «bin»:
- Это мои переменные среды HADOOP_HOME и JAVA_HOME:
- Я также установил переменную среды SPARK2_HOME (не уверен, что мне действительно нужно было это сделать):
* 11 12 *
Previoulsy I ' у меня был HADOOP_HOME в Path, но я удалил его по совету из одной из связанных тем на StackOverflow.
Заранее благодарю вас за вашу помощь!
UPDATE-1 My структура проекта:
UPDATE-2
Если важно: у меня нет среды MAVEN_HOME переменная, и поэтому в моем пути нет MAVEN_HOME. Я выполнил «чистый -> пакет» через интерфейс Intellij IDEa Maven.
UPDATE-3
Список библиотек из структуры проекта
Update-4 Информация о scala -sdk: