MLWriter записывает пустые каталоги при сохранении модели ML на диск - PullRequest
0 голосов
/ 28 мая 2019

Я хочу сохранить модель биномиальной логистической регрессии, которую я обучил, на диск для последующего использования для тестирования различных наборов входных данных.Но MLWriter создает только пустые каталоги с файлами _SUCCESS, без каких-либо фактических данных.

Я использую Spark 2.4.0 с Scala 2.12.Он отлично работает на моей локальной машине Windows.Но когда я пробую его на автономном кластере Spark с двумя рабочими, я просто получаю пустые каталоги.На консоли не сообщается об ошибке.

Я знаю, что модель обучена, так как я вижу коэффициенты и перехваты, когда я их печатаю.

Одним из вариантов может быть настройка подробного входа в систему.log4j.Но я относительно новичок в Spark и Scala и не знаю, как настроить log4j.

Вот код:

import org.apache.spark.sql.SparkSession
import org.apache.spark.ml.classification.LogisticRegression
import org.apache.spark.ml.feature.FeatureHasher
import org.apache.spark.sql.functions.{when, _}

object churnLearn {
  def main(args: Array[String]) {
    // Create Spark Session
    println("Create Spark Session")
    val spark = SparkSession.builder.appName("Telecom Churn").getOrCreate()
    import spark.sqlContext.implicits._

    // Build JDBC URL
    println("Build JDBC URL")
    val userName = args(0)
    val userPwd = args(1)
    val tdServer = args(2)
    val numPartitions = args(3)
    val teraURL = "jdbc:teradata://"+tdServer

    // Read training data
    // Convert churn column to numeric
    println("Read training data")
    val telDF = spark.read.format("jdbc").
      option("user", userName).
      option("password", userPwd).
      option("driver", "com.teradata.jdbc.TeraDriver").
      option("url", teraURL).
      option("dbtable", "(SEL CAST(phone_number AS BIGINT) AS phone_num, V.* FROM Telco_Churn_Anal_Train_V V) AS T").
      option("partitionColumn", "phone_num").
      option("lowerBound", 1000000000).
      option("upperBound", 9999999999L).
      option("numPartitions", numPartitions).
      load().
      withColumn("churnn", when(col("churn") === "True", 1).
        when(col("churn") === "False", 0))
    println("Sample training data:")
    telDF.show(5)
    println(s"Number of partitions = " + telDF.rdd.getNumPartitions.toString)

    // Derive multi-column hash to be used as the feature column
    println("Derive multi-column hash to be used as the feature column")
    val hasher = new FeatureHasher().
      setInputCols("state", "account_length", "international_plan", "number_vmail_messages",
        "total_day_minutes", "total_day_calls", "total_eve_minutes", "total_eve_calls",
        "total_night_minutes", "total_night_calls", "total_intl_minutes", "total_intl_calls", "customer_service_calls").
      setOutputCol("features")
    val telfDF = hasher.transform(telDF)
    println("Multi-column feature hash derived:")
    telfDF.show(5)

    // Set LR parameters
    println("Build LR model")
    val lr = new LogisticRegression().
      setLabelCol("churnn").
      setFamily("binomial").
      setMaxIter(10)

    // Build LR model
    val churnLRM = lr.fit(telfDF)

    // Display model co-efficients
    println(s"Model coefficients: ${churnLRM.coefficientMatrix}")
    println(s"Model intercepts: ${churnLRM.interceptVector}")

    // Persist model to local disk
    spark.conf.set("spark.sql.parquet.compression.codec", "none")
    println("Persist model to local disk")
    churnLRM.save("file:///churnLRM")

    println("Done. Stop Spark")
    spark.stop()
  }
}

Вот соответствующая часть вывода консоли:

Build LR model
Model coefficients: 1 x 262144 CSCMatrix
(0,57900) -0.10050111279111754
(0,83307) -1.044985432080533E-4
(0,90698) 0.010020069092956272
(0,91893) -0.004959044995655235
(0,92032) -0.005122412734194552
(0,93943) 0.010010761343651198
(0,100271) -0.010744307068092304
(0,101191) 2.0542379091223317
(0,111615) -0.008632729362046196
(0,158493) 0.43964899058141127
(0,167972) 0.0023018864077632276
(0,196023) -0.002012897224896602
(0,231136) -0.02820408906812126
Model intercepts: [-1.8805498307729487]
Persist model to local disk
Done. Stop Spark

Ниже указан каталог, в котором должна была быть сохранена модель:

/ # ls -lR churnLRM
churnLRM:
total 8
drwxr-xr-x    2 root     root          4096 May 28 12:14 data
drwxr-xr-x    2 root     root          4096 May 28 12:14 metadata

churnLRM/data:
total 0
-rw-r--r--    1 root     root             0 May 28 12:14 _SUCCESS

churnLRM/metadata:
total 0
-rw-r--r--    1 root     root             0 May 28 12:14 _SUCCESS
...