Как я могу получить Hadoop с Cascading, чтобы показать мне вывод журнала отладки? - PullRequest
1 голос
/ 13 марта 2012

У меня проблемы с получением Hadoop и Cascading 1.2.6, чтобы показать мне вывод, который должен прийти при использовании фильтра Debug .Руководство по каскадированию говорит, что именно так вы можете просматривать текущие кортежи .Я использую это, чтобы попытаться увидеть любой отладочный вывод:

Debug debug = new Debug(Debug.Output.STDOUT, true);
debug.setPrintTupleEvery(1);
debug.setPrintFieldsEvery(1);
assembly = new Each( assembly, DebugLevel.VERBOSE, debug );

Я довольно новичок в Hadoop и Cascading, но возможно я не ищу в нужном месте или что есть какой-то простой log4jнастройка, которую я пропускаю (я не внес никаких изменений в настройки по умолчанию, которые вы получаете с Cloudera hadoop-0.20.2-cdh3u3.

Это примерный класс WordCount, который я использую (скопировано из каскада )руководство пользователя ) с операторами Debug, добавленными в:

package org.cascading.example;

import cascading.flow.Flow;
import cascading.flow.FlowConnector;
import cascading.operation.Aggregator;
import cascading.operation.Debug;
import cascading.operation.DebugLevel;
import cascading.operation.Function;
import cascading.operation.aggregator.Count;
import cascading.operation.regex.RegexGenerator;
import cascading.pipe.Each;
import cascading.pipe.Every;
import cascading.pipe.GroupBy;
import cascading.pipe.Pipe;
import cascading.scheme.Scheme;
import cascading.scheme.TextLine;
import cascading.tap.Hfs;
import cascading.tap.SinkMode;
import cascading.tap.Tap;
import cascading.tuple.Fields;

import java.util.Properties;

public class WordCount {
    public static void main(String[] args) {
        String inputPath = args[0];
        String outputPath = args[1];

        // define source and sink Taps.
        Scheme sourceScheme = new TextLine( new Fields( "line" ) );
        Tap source = new Hfs( sourceScheme, inputPath );

        Scheme sinkScheme = new TextLine( new Fields( "word", "count" ) );
        Tap sink = new Hfs( sinkScheme, outputPath, SinkMode.REPLACE );

        // the 'head' of the pipe assembly
        Pipe assembly = new Pipe( "wordcount" );

        // For each input Tuple
        // using a regular expression
        // parse out each word into a new Tuple with the field name "word"
        String regex = "(?<!\\pL)(?=\\pL)[^ ]*(?<=\\pL)(?!\\pL)";
        Function function = new RegexGenerator( new Fields( "word" ), regex );

        assembly = new Each( assembly, new Fields( "line" ), function );

        Debug debug = new Debug(Debug.Output.STDOUT, true);
        debug.setPrintTupleEvery(1);
        debug.setPrintFieldsEvery(1);
        assembly = new Each( assembly, DebugLevel.VERBOSE, debug );

        // group the Tuple stream by the "word" value
        assembly = new GroupBy( assembly, new Fields( "word" ) );

        // For every Tuple group
        // count the number of occurrences of "word" and store result in
        // a field named "count"
        Aggregator count = new Count( new Fields( "count" ) );
        assembly = new Every( assembly, count );

        // initialize app properties, tell Hadoop which jar file to use
        Properties properties = new Properties();
        FlowConnector.setApplicationJarClass( properties, WordCount.class );

        // plan a new Flow from the assembly using the source and sink Taps
        FlowConnector flowConnector = new FlowConnector();
        FlowConnector.setDebugLevel( properties, DebugLevel.VERBOSE );
        Flow flow = flowConnector.connect( "word-count", source, sink, assembly );

        // execute the flow, block until complete
        flow.complete();

        // Ask Cascading to create a GraphViz DOT file
        // brew install graphviz # install viewer to look at dot file
        flow.writeDOT("build/flow.dot");
    }
}

Работает нормально, я просто не могу найти ни одного оператора отладки, показывающего мне слова. Я просмотрел обе файловые системы HDFS сhadoop dfs -ls, а также через веб-интерфейс jobtracker . Вывод журнала для сопоставителя в Jobtracker не имеет вывода для STDOUT:

Task Logs: 'attempt_201203131143_0022_m_000000_0'



stdout logs


stderr logs
2012-03-13 14:32:24.642 java[74752:1903] Unable to load realm info from SCDynamicStore


syslog logs
2012-03-13 14:32:24,786 INFO org.apache.hadoop.security.UserGroupInformation: JAAS Configuration already set up for Hadoop, not re-installing.
2012-03-13 14:32:25,278 WARN org.apache.hadoop.util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
2012-03-13 14:32:25,617 INFO org.apache.hadoop.metrics.jvm.JvmMetrics: Initializing JVM Metrics with processName=MAP, sessionId=
2012-03-13 14:32:25,903 INFO org.apache.hadoop.mapred.Task:  Using ResourceCalculatorPlugin : null
2012-03-13 14:32:25,945 INFO cascading.tap.hadoop.MultiInputSplit: current split input path: hdfs://localhost/usr/tnaleid/shakespeare/input/comedies/cymbeline
2012-03-13 14:32:25,980 WARN org.apache.hadoop.io.compress.snappy.LoadSnappy: Snappy native library not loaded
2012-03-13 14:32:25,988 INFO org.apache.hadoop.mapred.MapTask: numReduceTasks: 1
2012-03-13 14:32:26,002 INFO org.apache.hadoop.mapred.MapTask: io.sort.mb = 100
2012-03-13 14:32:26,246 INFO org.apache.hadoop.mapred.MapTask: data buffer = 79691776/99614720
2012-03-13 14:32:26,247 INFO org.apache.hadoop.mapred.MapTask: record buffer = 262144/327680
2012-03-13 14:32:27,623 INFO org.apache.hadoop.mapred.MapTask: Starting flush of map output
2012-03-13 14:32:28,274 INFO org.apache.hadoop.mapred.MapTask: Finished spill 0
2012-03-13 14:32:28,310 INFO org.apache.hadoop.mapred.Task: Task:attempt_201203131143_0022_m_000000_0 is done. And is in the process of commiting
2012-03-13 14:32:28,337 INFO org.apache.hadoop.mapred.Task: Task 'attempt_201203131143_0022_m_000000_0' done.
2012-03-13 14:32:28,361 INFO org.apache.hadoop.mapred.TaskLogsTruncater: Initializing logs' truncater with mapRetainSize=-1 and reduceRetainSize=-1

В конце яЯ также пишу DOT-файл, в котором нет оператора Debug, которого я ожидал (хотя, возможно, он был удален):

word count flow diagram

Есть ли некоторыефайл журнала где-то мне не хватает, или это конфигнастройки, которые мне нужно установить?

Ответы [ 2 ]

2 голосов
/ 14 марта 2012

Я получил ответ из списка рассылки по этому вопросу.

Изменение на это работает:

assembly = new Each( assembly, new Fields( "line" ), function );

// simpler debug statement
assembly = new Each( assembly, new Debug("hello", true) );

assembly = new GroupBy( assembly, new Fields( "word" ) );

Это выводит это в пользовательском интерфейсе jobdetails под stderr:

Task Logs: 'attempt_201203131143_0028_m_000000_0'



stdout logs


stderr logs
2012-03-13 16:21:41.304 java[78617:1903] Unable to load realm info from SCDynamicStore
hello: ['word']
hello: ['CYMBELINE']
<SNIP>

Я пробовал это прямо из документов, иэто не работает для меня (хотя я также установил для FlowConnector debugLevel значение VERBOSE):

assembly = new Each( assembly, DebugLevel.VERBOSE, new Debug() );

Кажется, что это что-то связано с DebugLevel.VERBOSE из документации, как при попытке это, Я все еще не получаю вывод:

assembly = new Each( assembly, DebugLevel.VERBOSE, new Debug("hello", true) );

Изменение его для удаления DebugLevel также дает мне вывод

assembly = new Each( assembly, new Debug() );

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

assembly = new Each( assembly, new Debug(Debug.Output.STDOUT) );

Бьюсь об заклад, есть еще кое-что, что я неправильно сконфигурировал с вещами уровня журнала VERBOSE, или 1.2.6 больше не соответствует документации, но, по крайней мере, теперь я могу видеть вывод вжурналы.

0 голосов
/ 02 августа 2012

Вы пробовали установить

flow.setDebugLevel (DebugLevel.VERBOSE);

...