I am using Spark with scala, I am also using aws glue libraries as well for glue script.
When i am using scala version 2.12 I am getting this error.
error with version 2.12
import com.amazonaws.services.glue.{DataSource, DynamicFrame, GlueContext}
import com.amazonaws.services.glue.util.{GlueArgParser, Job, JsonOptions}
import org.apache.spark.{SparkConf, SparkContext}
import scala.collection.JavaConverters._
object Test {
def main(systemArgs: Array[String]): Unit = {
val conf = new SparkConf().setAppName("GlueExample").setMaster("local")
val sc = new SparkContext(conf)
sc.hadoopConfiguration.set("fs.s3.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
val gc: GlueContext = new GlueContext(sc)
val connectionOptions = JsonOptions(Map(
"paths" -> Seq("s3://bucket_path"),
"groupFiles" -> "inPartition"
))
val source: DataSource = gc.getSourceWithFormat(
connectionType = "s3",
options = connectionOptions,
transformationContext = "",
format = "parquet",
formatOptions = JsonOptions.empty
)
}
}
when i changed the scala version to 2.11 after going through so many similar issues, i am getting this error.
error with 2.11 version
it's not even starting SparkConf()
My build.gradle file.
plugins {
id 'scala'
id 'java'
id 'application'
}
repositories {
maven { url 'https://repo1.maven.org/maven2/' }
mavenCentral()
maven { url 'https://aws-glue-etl-artifacts.s3.amazonaws.com/release/' }
}
dependencies {
implementation project(':diff-lib')
implementation 'org.scala-lang:scala-library'
implementation 'com.google.guava:guava'
implementation 'software.amazon.awssdk:glue'
implementation 'com.amazonaws:AWSGlueETL:1.0.0'
implementation "org.apache.spark:spark-core_$scalaVersion"
implementation 'org.slf4j:slf4j-log4j12
}
geadle.properties file
gradleVersion=6.7
lombokVersion=1.18.10
awaitilityVersion=3.1.6
javaVersion=8
projectVersion=1.0.0
awsSdkVersion=2.16.44
junitVersion=5.7.1
log4jVersion=2.14.1
scalaVersion=2.12
scalaLibVersion=2.12.12
sparkVersion=2.4.3
glueEtlVersion=1.0.0
guavaLibVersion=29.0-jre
scalaTestVersion=3.2.0
scalaTestPlusVersion=3.2.0.0
scalaXmlVersion=1.2.0
slf4jLog4j12Version=1.7.10
build.gradle for diff-lib library
plugins {
id 'scala'
id 'java-library'
}
repositories {
maven { url 'https://repo1.maven.org/maven2/' }
mavenCentral()
maven { url 'https://aws-glue-etl-artifacts.s3.amazonaws.com/release/' }
}
dependencies {
implementation 'org.scala-lang:scala-library'
implementation 'com.amazonaws:AWSGlueETL'
implementation 'com.google.guava:guava'
}
The Glue release notes point to 2.11 being needed for the Scala version (because Spark 2.4.3 uses Scala 11 by default). Once you are using a Scala version for one library, it tends to be necessary to ensure all other libraries have a matching version.
Your build.gradle file seems to be lacking version references (or references to the variables which define the versions, in the properties file). Please see this example, which has explicit version numbers (but you can also use dollar-sign variables which you have defined in your properties file).
As one commenter has noted, scalaLibVersion and scalaVersion in your properties file do not match. Ensure that they match, and that none of the dependencies are using another Scala version. Also, try using explicit versions in your main gradle dependency file.
I have a Scala + Akka + Gradle application and the following test:
class UserCRUDSpec() extends TestKit(ActorSystem("UserCRUDSpec"))
with ImplicitSender
with WordSpecLike
with Matchers
with Mockito
with DomainSuit {
val userDao: UserDao = mock[UserDao]
val actor: ActorRef = system.actorOf(UserCRUD.props(self, userDao))
"The UserCRUD actor " must {
"search actor by id if actorId specified and exists" in {
...
}
}
}
and a gradle build.gradle dependencies:
apply plugin: 'scala'
dependencies {
compile 'org.scala-lang:scala-compiler:2.12.6'
compile('com.typesafe.akka:akka-cluster_2.12:2.5.14') {
exclude group: 'org.scala-lang'
}
testCompile ('com.typesafe.akka:akka-testkit_2.12:2.5.14') {
exclude group: 'org.scala-lang'
}
testCompile ('org.scalatest:scalatest_2.12:3.0.5') {
exclude group: 'org.scala-lang'
}
testCompile ('org.specs2:specs2-core_2.12:4.3.3') {
exclude group: 'org.scala-lang'
}
testCompile ('org.specs2:specs2-mock_2.12:4.3.3') {
exclude group: 'org.scala-lang'
}
}
}
When I run ./gradle test, it says that no tests found. Is there any way how I can add TestKit tests to be visible for gradle test task?
Finally, I just switched to scalatest and specified actor system:
class UserCRUDSpec() extends WordSpec with TestKitBase ... {
...
implicit lazy val system: ActorSystem = ActorSystem("UserCRUDSpec")
...
}
import kafka.utils.{TestUtils, ZKStringSerializer, ZkUtils}
import org.I0Itec.zkclient.{ZkClient, ZkConnection}
import kafka.utils.ZkUtils._
var zkUtils: ZkUtils = _
//val zkConnection= new ZkConnection(zkConn)
//zkClient = new ZkClient(zkConn,5000,5000,ZKStringSerializer)
//val zkUtils = new ZkUtils(zkClient, zkConnection, false)
val (zkClient, zkConnection) = ZkUtils.createZkClientAndConnection(
zkConn, sessionTimeoutMs, connectionTimeoutMs)
zkUtils = new ZkUtils(zkClient, zkConnection, false)
I am trying to create a ZkUtils object but facing issues. My Gradle build is successful but when I try to run the test file, face the below issues
Error:(27, 16) not found: type ZkUtils
var zkUtils: ZkUtils = _
Error:(44, 44) value createZkClientAndConnection is not a member of object kafka.utils.ZkUtils
val (zkClient, zkConnection) = ZkUtils.createZkClientAndConnection(
Error:(46, 20) not found: type ZkUtils
zkUtils = new ZkUtils(zkClient, zkConnection, false)
I have the following dependencies in my gradle build file as well.
compile group: 'org.apache.kafka', name: 'kafka_2.11', version: '0.10.2.1', classifier:'test'
compile group: 'org.apache.kafka', name: 'kafka_2.11', version: '0.10.2.1'
testCompile group: 'org.apache.kafka', name: 'kafka_2.11', version: '0.10.2.1', classifier:'test'
testCompile group: 'org.apache.kafka', name: 'kafka_2.11', version: '0.10.2.1'
I have these imports as well in my file. Can anyone tell me whats going wrong here. Thanks for your help.
I followed the example from "XPath + HOFs" part of https://github.com/json4s/json4s, below is my source code:
import org.json4s._
import org.json4s.native.JsonMethods._
object HiveToCSVEngine {
def main(args: Array[String]): Unit = {
val json = parse( """
{ "name": "joe",
"children": [
{
"name": "Mary",
"age": 5
},
{
"name": "Mazy",
"age": 3
}
]
}
""")
print((json \ "children")(0))
}
}
no compile errors, but the following error occurred at runtime:
Exception in thread "main" java.lang.NoSuchMethodError:
scala.collection.immutable.$colon$colon.hd$1()Ljava/lang/Object;
at org.json4s.MonadicJValue.$bslash(MonadicJValue.scala:18)
Could anybody help me on this problem?
===How is the program invoked===
I use gradle to run above code, below is the build.gradle file(the dependencies are what is needed by other programs):
apply plugin: 'scala'
apply plugin: 'java'
apply plugin:'application'
//mainClassName = 'SimpleMail'
mainClassName = System.getProperty("mainClassName")
compileJava {
sourceCompatibility = 1.6
targetCompatibility = 1.6
}
repositories {
mavenCentral()
}
dependencies {
//can't comment scalaTools on linux because of gradle version problem
scalaTools "org.scala-lang:scala-compiler:2.11.1"
compile 'org.scala-lang:scala-library:2.11.1'
compile 'com.github.tototoshi:scala-csv_2.10:1.0.0'
compile 'com.darwinsys:hirondelle-date4j:1.5.1'
compile 'com.sun.mail:javax.mail:1.5.2'
compile 'org.apache.hive:hive-jdbc:0.13.1'
compile 'org.apache.hadoop:hadoop-core:1.2.1'
compile 'mysql:mysql-connector-java:5.1.31'
compile 'net.sourceforge.expectj:expectj:2.0.7'
compile 'org.apache.commons:commons-lang3:3.3'
compile 'org.json4s:json4s-native_2.10:3.2.10'
compile 'org.json4s:json4s-jackson_2.10:3.2.10'
}
run {
// set heap size for the test JVM(s)
minHeapSize = "128m"
maxHeapSize = "512m"
// set JVM arguments for the test JVM(s)
jvmArgs '-XX:MaxPermSize=256m'
if ( project.hasProperty('args') ) {
def paras=project.args.trim()
println "args:"+paras
def leading_paras=[]
while(paras.contains('\'')){
def prefix=paras.substring(0,paras.indexOf('\''))
def right_part=paras.substring(prefix.size()+1)
def middle=right_part.substring(0,right_part.indexOf('\''))
def tail=right_part.substring(middle.size()+1)
if(prefix.size()>0) {
leading_paras = (leading_paras << prefix.split('\\s+')) << [middle]
}else{
leading_paras =leading_paras<<[middle]
}
paras=tail.trim()
}
leading_paras=(leading_paras<<paras.split('\\s+')).flatten()
println "[param list]"
for(String para:leading_paras){
println "param:"+para+"."
}
args (leading_paras as String[])
}
}
and I run the following command to invoke the program:
gradle run -DmainClassName=HiveToCSVEngine
Before:
compile 'org.json4s:json4s-native_2.10:3.2.10'
compile 'org.json4s:json4s-jackson_2.10:3.2.10'
Update:
compile 'org.json4s:json4s-native_2.11:3.2.10'
compile 'org.json4s:json4s-jackson_2.11:3.2.10'
I think it's your scala is 2.11, but your json4s is 2.10
I have a NetBeans web project building Java, JS and HTML files. In order to get retrofit working to import a JSON API, I need to inject a dependency in a build.gradle file in the root of the project. I've written a headless build.gradle file, which I've tested and correctly handles the dependencies, how do I now change project to run from the build.gradle file instead of ANT everytime and searching through libraries?
You need a build.gradle and settings.gradle file, and you have to delete the build.xml file (and maybe the nbproject/ directory)
I recommend making a gradle project using the netbeans gradle plugin and copying over and modifying the build.gradle file.
Then you need to add source sets in your build.gradle for where your sources are - gradle expects them in different place than netbeans ant puts them
sourceSets {
main {
java {
srcDir 'src'
}
resources {
srcDir 'resources'
}
}
test {
java {
srcDir 'test'
}
resources {
srcDir 'testResources'
}
}
}
also, you need to make your dependencies. This is what mine looks like:
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.10+'
compile project(':logger')
compile project(':postalker')
compile group: 'org.yaml', name: 'snakeyaml', version: '1.15+'
compile group: 'commons-io', name: 'commons-io', version: '2.4+'
compile group: 'gov.nist.math', name: 'jama', version: '1.0.3+'
compile group: 'org.apache.commons', name: 'commons-imaging', version: '1.0-SNAPSHOT+'
compile group: 'com.itextpdf', name: 'itextpdf', version: '5.5.5+'
compile files( 'lib/jogl-runtime/jogl.jar')
compile files( 'lib/gluegen-runtime/gluegen-rt.jar')
compile files( 'lib/toxiclibscore.jar')
compile group: 'org.apache.commons', name: 'commons-math3', version: '3.5+'
compile group: 'commons-codec', name: 'commons-codec', version: '1.6'
compile group: 'commons-logging', name: 'commons-logging', version: '1.1.3'
compile group: 'org.apache.httpcomponents', name: 'httpcore', version: '4.3.3'
compile group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.3.6'
compile group: 'org.apache.httpcomponents', name: 'httpmime', version: '4.3.6'
}
finally,
I had to close the old project, shut netbeans down, then re-open netbeans and the project. Do a reload project and it was up and running!
for the person wondering how I got jogl working, I looked at what the jogl plugin did with ant and replicated it with gradle. I add a PlatformPrivate.gradle file that contains the developer's platform, then copy the appropriate libraries to the build directory
my entire build.gradle:
import com.protocase.files.FolderUtils
import java.nio.file.Files
import java.nio.file.Paths
import com.protocase.designer.extractors.BuildInfoExtractor
import com.protocase.designer.fileeditors.NSISInstallerModifier
import com.protocase.designer.fileeditors.SignBatModifier
import com.protocase.designer.ConfigureRun
import com.protocase.finders.FindFiles
apply plugin: 'java'
apply plugin: 'application'
apply plugin: 'groovy'
apply from: "PlatformPrivate.gradle"
apply from: "Platforms.gradle"
sourceCompatibility = '1.6'
[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
// NetBeans will automatically add "run" and "debug" tasks relying on the
// "mainClass" property. You may however define the property prior executing
// tasks by passing a "-PmainClass=<QUALIFIED_CLASS_NAME>" argument.
//
// Note however, that you may define your own "run" and "debug" task if you
// prefer. In this case NetBeans will not add these tasks but you may rely on
// your own implementation.
if (!hasProperty('mainClass')) {
ext.mainClass = 'com.protocase.viewer.JDesigner'
}
if (! hasProperty('localPlatform')) {
throw new GradleException("Missing PlatformPrivate.gradle");
}
mainClassName = ext.mainClass
repositories {
mavenCentral()
maven {
url "https://repository.apache.org/content/repositories/snapshots/"
}
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.10+'
compile project(':logger')
compile project(':postalker')
compile group: 'org.yaml', name: 'snakeyaml', version: '1.15+'
compile group: 'commons-io', name: 'commons-io', version: '2.4+'
compile group: 'gov.nist.math', name: 'jama', version: '1.0.3+'
compile group: 'org.apache.commons', name: 'commons-imaging', version: '1.0-SNAPSHOT+'
compile group: 'com.itextpdf', name: 'itextpdf', version: '5.5.5+'
compile files( 'lib/jogl-runtime/jogl.jar')
compile files( 'lib/gluegen-runtime/gluegen-rt.jar')
compile files( 'lib/toxiclibscore.jar')
compile group: 'org.apache.commons', name: 'commons-math3', version: '3.5+'
compile group: 'commons-codec', name: 'commons-codec', version: '1.6'
compile group: 'commons-logging', name: 'commons-logging', version: '1.1.3'
compile group: 'org.apache.httpcomponents', name: 'httpcore', version: '4.3.3'
compile group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.3.6'
compile group: 'org.apache.httpcomponents', name: 'httpmime', version: '4.3.6'
}
task copyDistLibs(type: Copy) {
def outputDir = file("${buildDir}/libs")
from configurations.runtime
into outputDir
}
task updateBuildInfoBeta (type: Exec) {
workingDir "${projectDir}/perl"
commandLine './updateBuildInfo'
def extractor = new BuildInfoExtractor(projectFile: new File("${projectDir}"))
def version = extractor.getBetaVersion()
def installerModifier = new NSISInstallerModifier(NSISFile: new File("${projectDir}/winRunFiles/JDesigner.nsi"))
installerModifier.setOutputFileVersion(version)
def signBatModifier = new SignBatModifier(signBatFile: new File("${projectDir}/sign.bat"))
signBatModifier.setOutputFileVersion(version)
println ""
println "Making Beta Version: " + version
println "branch: " + extractor.getReleaseVersion() + " date: " + extractor.getBuildDate()
println ""
}
task makeBeta(dependsOn: updateBuildInfoBeta) {
def distFolderLinux64 = makeOneDistBeta("linux-amd64")
def ditsFolderLinux32 = makeOneDistBeta("linux-i586")
def distFolderWin32 = makeOneDistBeta("windows-i586")
FolderUtils.copyFolderContents(new File("${projectDir}/jre"), new File(distFolderWin32, "jre"))
FolderUtils.copyFolderContents(new File("${projectDir}/src/main/resources/library"), new File(distFolderWin32, "library"))
FolderUtils.copyFolderContents(new File("${projectDir}/winRunFiles"), distFolderWin32)
Files.copy(Paths.get("${projectDir}/license.txt"), Paths.get(new File(distFolderWin32, "license.txt").path))
Files.copy(Paths.get("${projectDir}/Protocase Designer.ico"), Paths.get(new File(distFolderWin32, "Protocase Designer.ico").path))
def distFolderMac = makeOneDistBeta("macosx-universal")
}
private File makeOneDistBeta(def nativePlatform) {
def plat = new com.protocase.designer.Platform(natives: nativePlatform, libFolder: 'lib', genericBuildDir: new File("${buildDir}"))
println plat.getNativeDistDir()
plat.makeAndPopulateBuildDir()
plat.copyLibraryFiles()
plat.getNativeDistDir()
}
makeBeta.dependsOn(jar)
makeBeta.dependsOn(copyDistLibs)
task makeWin32Beta(dependsOn: makeBeta, type: Exec) {
def wineDir = new File("${projectDir}/../../.wine/drive_c/")
println wineDir.exists()
def nsisFile = FindFiles.findFirstFileByNameWithoutDirectory(wineDir, "makensis.exe", "users")
println nsisFile.path
def MAKENSIS = nsisFile.getPath().replaceFirst("(.*)drive_c/", "c:\\\\")
println MAKENSIS
MAKENSIS = MAKENSIS.replaceAll("/","\\\\")
def extractor = new BuildInfoExtractor(projectFile: new File("${projectDir}"))
def version = extractor.getBetaVersion()
workingDir "${buildDir}/windows-i586"
def fullCommand = 'WINEDEBUG=fixme-win,fixme-sync,fixme-heap /usr/bin/wine "' + MAKENSIS + '" /V1 /DVER_STR=' + version + ' /X"SetCompressor /FINAL lzma" ./JDesigner.nsi'
println "makensis command:"
println MAKENSIS
println fullCommand
println ""
commandLine fullCommand
}
private void configureRun (def task) {
apply from: 'PlatformPrivate.gradle'
def confRun = new ConfigureRun(localPlatform: localPlatform)
confRun.configureRun(task, mainClass, sourceSets)
}
run {
configureRun(it)
}
task(debug, dependsOn: 'classes', type: JavaExec) {
configureRun(it)
debug = true
}
The PlatformPrivate.gradle
ext {
localPlatform='linux-amd64'
}
com.protocase.designer.Platform:
package com.protocase.designer
import com.protocase.files.FolderUtils
import org.gradle.api.GradleException
import static groovy.io.FileType.FILES
import java.nio.file.StandardCopyOption
import java.io.File
import java.nio.file.Files
import java.nio.file.Paths
public class Platform {
def natives
def libFolder
def genericBuildDir
String gluegenDir() {
def dirName = 'gluegen-rt.jar-natives-' + natives
dirName
}
String joglDir() {
def dirName = "jogl.jar-natives-" + natives
dirName
}
def getExtension() {
def result = ""
switch (natives)
{
case 'linux-amd64':
case 'linux-i586':
case 'solaris-i586':
case 'solaris-sparc':
case 'solaris-sparcv9':
result = 'so'
break;
case 'macosx-universal':
case 'macosx-ppc':
result = 'jnilib'
break;
case 'windows-i586':
case 'windows-amd64':
result = 'dll'
break;
default:
throw new GradleException ('programmer missed a case or bad platform: ' + natives)
}
result
}
def getNativeDistDir() {
def buildDir = new File(genericBuildDir, natives)
}
def makeAndPopulateBuildDir() {
def sourceDir = new File(genericBuildDir, 'libs')
def nativeDistDir = getNativeDistDir()
if (nativeDistDir.exists()) {
FolderUtils.deleteFolder(nativeDistDir)
}
FolderUtils.copyFolderContents(sourceDir, nativeDistDir)
}
def getLibraryDirs() {
def dirList = []
def dir = new File(new File(libFolder, "gluegen-runtime"), gluegenDir())
dirList << dir
dir = new File(new File(libFolder, "jogl-runtime"), joglDir())
dirList << dir
dirList
}
def getLibraryFiles() {
def fileList = []
def dirs = getLibraryDirs()
dirs.each {
it.eachFile(FILES) {
file -> fileList << file
}
}
fileList
}
def copyLibraryFiles() {
def copyOptions = [StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.COPY_ATTRIBUTES]
def destinationFolder = new File(getNativeDistDir(), 'lib')
getLibraryDirs().each {
FolderUtils.copyFolderContents(it, destinationFolder)
}
}
}