2016-11-21 1 views
0

Я получил этот общий кусок кода, который я бегу:Spark: написать магистерскую войти из рабочих

df.rdd.foreachPartition(i => { 
    //some code 
    //writing to log 
}) 

Проблема заключается в том, что writing to log выполняется на самих рабочих, а не на хозяина - и поэтому записи в журнале где-то разбросаны и очень трудно - или даже невозможно - для извлечения. Есть ли способ написать журналы мастера у рабочих или какую-нибудь другую работу?

ответ

2

Невозможно записать запись в журнал мастера - распределенная обработка означает, что ваш код работает на разных машинах, и поэтому любой доступ к ресурсам машины (например, файловая система) также будет распространен.

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

  1. Относитесь как данные: вместо того, чтобы использовать foreachPartition, вы можете использовать mapPartitions с функцией, которая возвращает Iterator[String] с логами вы хотите написать (или данные, необходимые для их создания). Если предположить, что общее количество строк журнала не огромно, вы можете собрать их в водителя машины и зарегистрировать их:

    val logLines = df.rdd.mapPartitions(i => { 
        //some code 
        val log: Iterator[String] = //construct log lines 
        log 
    }).collect() 
    
    logLines.foreach(logger.info) 
    
  2. Использование некоторых лог-агрегация рамки: эти структуры собирают журналы из нескольких машин и может отображать их как один поток записей журнала. Это очень полезно для распределенных вычислений, поскольку это делает доступ к журнальной избыточности конкретного компьютера.

Смежные вопросы