blob: 07c33c35142379f6836c625ec65a799c66b4bfaf [file] [log] [blame]
/**
* 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.hcatalog.data.transfer;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.hadoop.conf.Configuration;
import org.apache.hcatalog.common.HCatException;
import org.apache.hcatalog.data.HCatRecord;
import org.apache.hcatalog.data.transfer.state.StateProvider;
/**
* This abstraction is internal to HCatalog. This is to facilitate writing to
* HCatalog from external systems. Don't try to instantiate this directly.
* Instead, use {@link DataTransferFactory}
*/
public abstract class HCatWriter {
protected Configuration conf;
protected WriteEntity we; // This will be null at slave nodes.
protected WriterContext info;
protected StateProvider sp;
/**
* External system should invoke this method exactly once from a master node.
*
* @return {@link WriterContext} This should be serialized and sent to slave
* nodes to construct HCatWriter there.
* @throws HCatException
*/
public abstract WriterContext prepareWrite() throws HCatException;
/**
* This method should be used at slave needs to perform writes.
*
* @param recordItr
* {@link Iterator} records to be written into HCatalog.
* @throws {@link HCatException}
*/
public abstract void write(final Iterator<HCatRecord> recordItr)
throws HCatException;
/**
* This method should be called at master node. Primary purpose of this is to
* do metadata commit.
*
* @throws {@link HCatException}
*/
public abstract void commit(final WriterContext context) throws HCatException;
/**
* This method should be called at master node. Primary purpose of this is to
* do cleanups in case of failures.
*
* @throws {@link HCatException} *
*/
public abstract void abort(final WriterContext context) throws HCatException;
/**
* This constructor will be used at master node
*
* @param we
* WriteEntity defines where in storage records should be written to.
* @param config
* Any configuration which external system wants to communicate to
* HCatalog for performing writes.
*/
protected HCatWriter(final WriteEntity we, final Map<String, String> config) {
this(config);
this.we = we;
}
/**
* This constructor will be used at slave nodes.
*
* @param config
*/
protected HCatWriter(final Configuration config, final StateProvider sp) {
this.conf = config;
this.sp = sp;
}
private HCatWriter(final Map<String, String> config) {
Configuration conf = new Configuration();
if (config != null) {
// user is providing config, so it could be null.
for (Entry<String, String> kv : config.entrySet()) {
conf.set(kv.getKey(), kv.getValue());
}
}
this.conf = conf;
}
}