package com.esri; import com.esri.arcgis.geodatabase.FeatureClass; import com.esri.arcgis.geodatabase.IFeatureClass; import com.esri.arcgis.geodatabase.IFeatureClassProxy; import com.esri.arcgis.geodatabase.IGPMessages; import com.esri.arcgis.geodatabase.IGPValue; import com.esri.arcgis.geoprocessing.IGPEnvironmentManager; import com.esri.arcgis.interop.AutomationException; import com.esri.arcgis.interop.Cleaner; import com.esri.arcgis.system.Array; import com.esri.arcgis.system.IArray; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.HColumnDescriptor; import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.client.HBaseAdmin; import org.apache.hadoop.security.UserGroupInformation; import java.io.File; import java.io.IOException; import java.security.PrivilegedExceptionAction; /** */ public final class CreateHTableTool extends AbstractTool { private static final long serialVersionUID = -2916674390536249579L; public static final String NAME = CreateHTableTool.class.getSimpleName(); @Override protected void doExecute( final IArray parameters, final IGPMessages messages, final IGPEnvironmentManager environmentManager ) throws Exception { final IGPValue hadoopUserValue = gpUtilities.unpackGPValue(parameters.getElement(1)); final UserGroupInformation ugi = UserGroupInformation.createRemoteUser(hadoopUserValue.getAsText()); ugi.doAs(new PrivilegedExceptionAction<Void>() { public Void run() throws Exception { return doExport(parameters, messages); } }); } private Void doExport( final IArray parameters, final IGPMessages messages ) throws Exception { final IGPValue hadoopConfValue = gpUtilities.unpackGPValue(parameters.getElement(0)); final IGPValue featureClassValue = gpUtilities.unpackGPValue(parameters.getElement(2)); final IFeatureClass[] featureClasses = new IFeatureClass[]{new IFeatureClassProxy()}; gpUtilities.decodeFeatureLayer(featureClassValue, featureClasses, null); final FeatureClass featureClass = new FeatureClass(featureClasses[0]); try { final Configuration configuration = HBaseConfiguration.create(createConfiguration(hadoopConfValue.getAsText())); final HBaseAdmin admin = new HBaseAdmin(configuration); try { if (admin.tableExists(featureClass.getName())) { admin.disableTable(featureClass.getName()); admin.deleteTable(featureClass.getName()); } messages.addMessage("Creating HTable '" + featureClass.getName() + "'"); final int maxVersions = configuration.getInt("createHTableTool.maxVersions", 1); final HTableDescriptor tableDescriptor = new HTableDescriptor(featureClass.getName()); final HColumnDescriptor geomDescriptor = new HColumnDescriptor(Const.GEOM); geomDescriptor.setMaxVersions(maxVersions); tableDescriptor.addFamily(geomDescriptor); final HColumnDescriptor attrDescriptor = new HColumnDescriptor(Const.ATTR); attrDescriptor.setMaxVersions(maxVersions); tableDescriptor.addFamily(attrDescriptor); admin.createTable(tableDescriptor); } finally { admin.close(); } } finally { Cleaner.release(featureClass); } return null; } @Override public IArray getParameterInfo() throws IOException, AutomationException { final String username = System.getProperty("user.name"); final String userhome = System.getProperty("user.home") + File.separator; final IArray parameters = new Array(); addParamFile(parameters, "Hadoop properties file", "in_hadoop_prop", userhome + "hadoop.properties"); addParamString(parameters, "Hadoop user", "in_hadoop_user", username); addParamFeatureLayer(parameters, "Input features", "in_features"); return parameters; } @Override public String getName() throws IOException, AutomationException { return NAME; } @Override public String getDisplayName() throws IOException, AutomationException { return NAME; } }