Запустите простое каскадное приложение в локальном режиме.
Я новичок в Cascading/Hadoop и пытаюсь запустить простой пример в локальном режиме (то есть в памяти). Пример просто копирует файл:
import java.util.Properties;
import cascading.flow.Flow;
import cascading.flow.FlowConnector;
import cascading.flow.FlowDef;
import cascading.flow.local.LocalFlowConnector;
import cascading.pipe.Pipe;
import cascading.property.AppProps;
import cascading.scheme.hadoop.TextLine;
import cascading.tap.Tap;
import cascading.tap.hadoop.Hfs;
public class CascadingTest {
public static void main(String[] args) {
Properties properties = new Properties();
AppProps.setApplicationJarClass( properties, CascadingTest.class );
FlowConnector flowConnector = new LocalFlowConnector();
// create the source tap
Tap inTap = new Hfs( new TextLine(), "D:\\git_workspace\\Impatient\\part1\\data\\rain.txt" );
// create the sink tap
Tap outTap = new Hfs( new TextLine(), "D:\\git_workspace\\Impatient\\part1\\data\\out.txt" );
// specify a pipe to connect the taps
Pipe copyPipe = new Pipe( "copy" );
// connect the taps, pipes, etc., into a flow
FlowDef flowDef = FlowDef.flowDef()
.addSource( copyPipe, inTap )
.addTailSink( copyPipe, outTap );
// run the flow
Flow flow = flowConnector.connect( flowDef );
flow.complete();
}
}
Вот ошибка, которую я получаю:
09-25-12 11:30:38,114 INFO - AppProps - using app.id: 9C82C76AC667FDAA2F6969A0DF3949C6
Exception in thread "main" cascading.flow.planner.PlannerException: could not build flow from assembly: [java.util.Properties cannot be cast to org.apache.hadoop.mapred.JobConf]
at cascading.flow.planner.FlowPlanner.handleExceptionDuringPlanning(FlowPlanner.java:515)
at cascading.flow.local.planner.LocalPlanner.buildFlow(LocalPlanner.java:84)
at cascading.flow.FlowConnector.connect(FlowConnector.java:454)
at com.x.y.CascadingTest.main(CascadingTest.java:37)
Caused by: java.lang.ClassCastException: java.util.Properties cannot be cast to org.apache.hadoop.mapred.JobConf
at cascading.tap.hadoop.Hfs.sourceConfInit(Hfs.java:78)
at cascading.flow.local.LocalFlowStep.initTaps(LocalFlowStep.java:77)
at cascading.flow.local.LocalFlowStep.getInitializedConfig(LocalFlowStep.java:56)
at cascading.flow.local.LocalFlowStep.createFlowStepJob(LocalFlowStep.java:135)
at cascading.flow.local.LocalFlowStep.createFlowStepJob(LocalFlowStep.java:38)
at cascading.flow.planner.BaseFlowStep.getFlowStepJob(BaseFlowStep.java:588)
at cascading.flow.BaseFlow.initializeNewJobsMap(BaseFlow.java:1162)
at cascading.flow.BaseFlow.initialize(BaseFlow.java:184)
at cascading.flow.local.planner.LocalPlanner.buildFlow(LocalPlanner.java:78)
... 2 more
3 ответа
Просто, чтобы предоставить немного больше деталей: вы не можете смешивать локальные и классы hadoop в Cascading, так как они предполагают разные и несовместимые среды. Что происходит в вашем случае, так это то, что вы пытаетесь создать локальный поток с помощью метчиков hadoop, причем последний ожидает метки JobConf
вместо Properties
Объект, используемый для настройки локальных отводов.
Ваш код будет работать, если вы используете cascading.tap.local.FileTap
вместо cascading.tap.hadoop.Hfs
,
Добро пожаловать в Каскадинг -
Я только что ответил в Каскадном списке пользователей, но вкратце проблема состоит в сочетании локальных классов и классов режима Hadoop. Этот код имеет LocalFlowConnector, но затем использует отводы Hfs.
Когда я возвращаюсь обратно к классам, использованным в учебнике "Нетерпеливый", он работает правильно: https://gist.github.com/3784194
Да, вам нужно использовать LFS(локальная файловая система) вместо HFS (Hadoop File System).
Также вы можете протестировать свой код, используя тестовые примеры Junit (с jar cascading-unittest) в локальном режиме / из eclipse.
http://www.cascading.org/2012/08/07/cascading-for-the-impatient-part-6/