2

I am trying to fit a CatBoostClassifier in my data but I'm having some issues related with Java staff.

This is what I want to run:

from pyspark.sql import Row,SparkSession
from pyspark.ml.linalg import Vectors, VectorUDT
from pyspark.sql.types import *

spark = (SparkSession.builder
  .master("local[*]")
  .config(
          "spark.jars.packages", 
          "ai.catboost:catboost-spark_3.3_2.12:1.1.1")
    .config("spark.executor.cores", "2")
    .config("spark.task.cpus", "2")
    .config("spark.driver.memory", "2g")
    .config("spark.driver.memoryOverhead", "2g")
    .config("spark.executor.memory", "2g")
    .config("spark.executor.memoryOverhead", "2g")
    .getOrCreate()
)

import catboost_spark
    
srcDataSchema = [
    StructField("features", VectorUDT()),
    StructField("label", StringType())
]

trainData = [
    Row(Vectors.dense(0.1, 0.2, 0.11), "0"),
    Row(Vectors.dense(0.97, 0.82, 0.33), "1"),
    Row(Vectors.dense(0.13, 0.22, 0.23), "1"),
    Row(Vectors.dense(0.8, 0.62, 0.0), "0")
]
    
trainDf = spark.createDataFrame(spark.sparkContext.parallelize(trainData), StructType(srcDataSchema))
trainPool = catboost_spark.Pool(trainDf)
    
evalData = [
    Row(Vectors.dense(0.22, 0.33, 0.9), "1"),
    Row(Vectors.dense(0.11, 0.1, 0.21), "0"),
    Row(Vectors.dense(0.77, 0.0, 0.0), "1")
]
    
evalDf = spark.createDataFrame(spark.sparkContext.parallelize(evalData), StructType(srcDataSchema))
evalPool = catboost_spark.Pool(evalDf)
    
classifier = catboost_spark.CatBoostClassifier()
    
# train a model
model = classifier.fit(trainPool)

The error occurs on the very last step (classifier.fit). And this is the error message:

---------------------------------------------------------------------------
Py4JJavaError                             Traceback (most recent call last)
File <command-3133332265590475>:56
     53 classifier = catboost_spark.CatBoostClassifier()
     55 # train a model
---> 56 model = classifier.fit(trainPool)

File /local_disk0/spark-b485da40-2e68-4785-a1d3-d04e5e879524/userFiles-98e86269-1eeb-4019-a0e3-5195cdacb74e/addedFile7290527881391773964ai_catboost_catboost_spark_3_3_2_12_1_1_1-582d6.jar/catboost_spark/core.py:5362, in CatBoostClassifier.fit(self, dataset, params, evalDatasets)
   5359     return self._fit_with_eval(trainDatasetAsJavaObject, evalDatasetsAsJavaObject, params)
   5361 if (params is None) or isinstance(params, dict):
-> 5362     return _fit_with_eval(params)
   5363 if isinstance(params, (list, tuple)):
   5364     models = []

File /local_disk0/spark-b485da40-2e68-4785-a1d3-d04e5e879524/userFiles-98e86269-1eeb-4019-a0e3-5195cdacb74e/addedFile7290527881391773964ai_catboost_catboost_spark_3_3_2_12_1_1_1-582d6.jar/catboost_spark/core.py:5359, in CatBoostClassifier.fit.<locals>._fit_with_eval(params)
   5358 def _fit_with_eval(params):
-> 5359     return self._fit_with_eval(trainDatasetAsJavaObject, evalDatasetsAsJavaObject, params)

File /local_disk0/spark-b485da40-2e68-4785-a1d3-d04e5e879524/userFiles-98e86269-1eeb-4019-a0e3-5195cdacb74e/addedFile7290527881391773964ai_catboost_catboost_spark_3_3_2_12_1_1_1-582d6.jar/catboost_spark/core.py:5316, in CatBoostClassifier._fit_with_eval(self, trainDatasetAsJavaObject, evalDatasetsAsJavaObject, params)
   5314 else:
   5315     self._transfer_params_to_java()
-> 5316     java_model = self._java_obj.fit(trainDatasetAsJavaObject, evalDatasetsAsJavaObject)
   5317     return CatBoostClassificationModel(java_model)

File /databricks/spark/python/lib/py4j-0.10.9.5-src.zip/py4j/java_gateway.py:1321, in JavaMember.__call__(self, *args)
   1315 command = proto.CALL_COMMAND_NAME +\
   1316     self.command_header +\
   1317     args_command +\
   1318     proto.END_COMMAND_PART
   1320 answer = self.gateway_client.send_command(command)
-> 1321 return_value = get_return_value(
   1322     answer, self.gateway_client, self.target_id, self.name)
   1324 for temp_arg in temp_args:
   1325     temp_arg._detach()

File /databricks/spark/python/pyspark/sql/utils.py:196, in capture_sql_exception.<locals>.deco(*a, **kw)
    194 def deco(*a: Any, **kw: Any) -> Any:
    195     try:
--> 196         return f(*a, **kw)
    197     except Py4JJavaError as e:
    198         converted = convert_exception(e.java_exception)

File /databricks/spark/python/lib/py4j-0.10.9.5-src.zip/py4j/protocol.py:326, in get_return_value(answer, gateway_client, target_id, name)
    324 value = OUTPUT_CONVERTER[type](answer[2:], gateway_client)
    325 if answer[1] == REFERENCE_TYPE:
--> 326     raise Py4JJavaError(
    327         "An error occurred while calling {0}{1}{2}.\n".
    328         format(target_id, ".", name), value)
    329 else:
    330     raise Py4JError(
    331         "An error occurred while calling {0}{1}{2}. Trace:\n{3}\n".
    332         format(target_id, ".", name, value))

Py4JJavaError: An error occurred while calling o532.fit.
: java.io.IOException: Cannot run program "/usr/lib/jvm/zulu8-ca-amd64/jre/bin/java": error=7, Argument list too long
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
    at ai.catboost.spark.impl.RunClassInNewProcess$.apply(RunClassInNewProcess.scala:70)
    at ai.catboost.spark.UpdatableWorkersInfo.shutdownRemainingWorkers(TrainingDriver.scala:189)
    at ai.catboost.spark.TrainingDriver.close(TrainingDriver.scala:304)
    at ai.catboost.spark.CatBoostPredictorTrait.$anonfun$fit$12(CatBoostPredictor.scala:279)
    at scala.util.control.Breaks.breakable(Breaks.scala:42)
    at ai.catboost.spark.CatBoostPredictorTrait.fit(CatBoostPredictor.scala:228)
    at ai.catboost.spark.CatBoostPredictorTrait.fit$(CatBoostPredictor.scala:125)
    at ai.catboost.spark.CatBoostClassifier.fit(CatBoostClassifier.scala:372)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)
    at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:380)
    at py4j.Gateway.invoke(Gateway.java:306)
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
    at py4j.commands.CallCommand.execute(CallCommand.java:79)
    at py4j.ClientServerConnection.waitForCommands(ClientServerConnection.java:195)
    at py4j.ClientServerConnection.run(ClientServerConnection.java:115)
    at java.lang.Thread.run(Thread.java:750)
Caused by: java.io.IOException: error=7, Argument list too long
    at java.lang.UNIXProcess.forkAndExec(Native Method)
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
    at java.lang.ProcessImpl.start(ProcessImpl.java:134)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
    ... 20 more

---------------------------------------------------------------------------

Databricks Runtime Version: 12.0 ML (includes Apache Spark 3.3.1, Scala 2.12) Catboost Version (from Maven): ai.catboost:catboost-spark_3.3_2.12:1.1.1

Please let me know if you could reproduce the problem and find any solution. Many thanks!!

cesilro
  • 21
  • 2

0 Answers0