package com.neverwinterdp.scribengin.storage.hdfs; import java.util.Random; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import com.neverwinterdp.scribengin.Record; import com.neverwinterdp.scribengin.storage.hdfs.sink.HDFSSink; import com.neverwinterdp.scribengin.storage.sink.Sink; import com.neverwinterdp.scribengin.storage.sink.SinkStream; import com.neverwinterdp.scribengin.storage.sink.SinkStreamWriter; import com.neverwinterdp.util.FileUtil; import com.neverwinterdp.vm.environment.yarn.HDFSUtil; public class SinkUnitTest { static String DATA_DIRECTORY = "./build/sinkhdfs" ; private FileSystem fs ; @Before public void setup() throws Exception { FileUtil.removeIfExist(DATA_DIRECTORY, false); fs = FileSystem.getLocal(new Configuration()) ; } @After public void teardown() throws Exception { fs.close(); } @Test public void testSink() throws Exception { HDFSSink sink = new HDFSSink(fs, DATA_DIRECTORY); SinkStream[] streams = sink.getStreams(); Assert.assertEquals(0, streams.length); SinkStream stream = sink.newStream(); SinkStreamWriter writer = stream.getWriter(); for(int i = 0; i < 5; i++) { for(int j = 0; j < 100; j ++) { String key = "stream=" + stream.getDescriptor().getId() +",buffer=" + i + ",record=" + j; writer.append(Record.create(key, key)); } writer.commit(); } System.out.println("Before close"); HDFSUtil.dump(fs, DATA_DIRECTORY); writer.close(); System.out.println("\n\n") ; System.out.println("After close"); HDFSUtil.dump(fs, DATA_DIRECTORY); } @Test public void testRollback() throws Exception { HDFSSink sink = new HDFSSink(fs, DATA_DIRECTORY); SinkStream stream0 = sink.newStream(); SinkStreamWriter writer = stream0.getWriter(); for(int i = 0; i < 10; i ++) { writer.append(Record.create("key-" + i, "record " + i)); } writer.rollback(); writer.close(); HDFSUtil.dump(fs, DATA_DIRECTORY); } @Test public void testMultiThread() throws Exception { HDFSSink sink = new HDFSSink(fs, DATA_DIRECTORY); SinkStreamWriterTask[] task = new SinkStreamWriterTask[5]; ExecutorService service = Executors.newFixedThreadPool(task.length); for(int i = 0; i < task.length; i++) { service.execute(new SinkStreamWriterTask(sink)); } service.shutdown(); while(!service.isTerminated()) { HDFSUtil.dump(fs, DATA_DIRECTORY); System.out.println("----------------------------------------"); Thread.sleep(2000); } HDFSUtil.dump(fs, DATA_DIRECTORY); } public class SinkStreamWriterTask implements Runnable { private Sink sink ; public SinkStreamWriterTask(Sink sink) { this.sink = sink ; } @Override public void run() { try { SinkStream stream = sink.newStream(); SinkStreamWriter writer = stream.getWriter(); Random random = new Random() ; for(int i = 0; i < 5; i++) { for(int j = 0; j < 100; j ++) { writer.append(Record.create("key-" + i, "record " + i)); Thread.sleep(random.nextInt(10)); } writer.commit(); } writer.close(); } catch(Exception ex) { ex.printStackTrace(); } } } }