Java tutorial
/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.giraph.debugger.utils; import java.io.IOException; import java.io.OutputStream; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.log4j.Logger; import com.google.protobuf.GeneratedMessage; /** * A utility class for writing to HDFS asynchronously. */ public class AsyncHDFSWriteService { /** * Logger for this class. */ protected static final Logger LOG = Logger.getLogger(AsyncHDFSWriteService.class); /** * The thread pool that will handle the synchronous writing, and hide the * latency from the callers. */ private static ExecutorService HDFS_ASYNC_WRITE_SERVICE = Executors.newFixedThreadPool(2); static { // Make sure we finish writing everything before shuting down the VM. Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { @Override public void run() { LOG.info("Shutting down writer"); HDFS_ASYNC_WRITE_SERVICE.shutdown(); LOG.info("Waiting until finishes all writes"); try { HDFS_ASYNC_WRITE_SERVICE.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); LOG.info("Finished all writes"); } catch (InterruptedException e) { LOG.error("Could not finish all writes"); e.printStackTrace(); } } })); } /** * Not for instantiation. */ private AsyncHDFSWriteService() { } /** * Writes given protobuf message to the given filesystem path in the * background. * * @param message * The proto message to write. * @param fs * The HDFS filesystem to write to. * @param fileName * The HDFS path to write the message to. */ public static void writeToHDFS(final GeneratedMessage message, final FileSystem fs, final String fileName) { HDFS_ASYNC_WRITE_SERVICE.submit(new Runnable() { @Override public void run() { Path pt = new Path(fileName); try { LOG.info("Writing " + fileName + " at " + fs.getUri()); OutputStream wrappedStream = fs.create(pt, true).getWrappedStream(); message.writeTo(wrappedStream); wrappedStream.close(); LOG.info("Done writing " + fileName); } catch (IOException e) { e.printStackTrace(); } } }); } }