package co.nubetech.hiho.mapreduce.sf; import java.io.IOException; import java.sql.SQLException; import java.util.List; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.io.NullWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; import org.apache.log4j.Logger; import co.nubetech.hiho.common.HIHOConf; import co.nubetech.hiho.common.sf.SFHandler; import com.sforce.async.BatchInfo; import com.sforce.async.BulkConnection; import com.sforce.async.JobInfo; /** * Create connection and job in setup * create batches in mapper * emit jobid and batchinfo, let the reducer handle status * @author sgoyal * */ public class ExportSalesforceMapper extends Mapper<Text, FSDataInputStream, Text, Text> { final static Logger logger = Logger .getLogger(co.nubetech.hiho.mapreduce.sf.ExportSalesforceMapper.class); private static SFHandler sfHandler; private BulkConnection conn; private JobInfo job; private Text jobId; private Text batchId; /** * @return the sfHandler */ public static SFHandler getSfHandler() { return sfHandler; } /** * @param sfHandler the sfHandler to set */ public static void setSfHandler(SFHandler sfHandler) { ExportSalesforceMapper.sfHandler = sfHandler; } public void setConnection(BulkConnection con) throws IOException{ conn=con; } public BulkConnection getConnection(){ return conn; } /** * @return the job */ public JobInfo getJob() { return job; } /** * @param job the job to set */ public void setJob(JobInfo job) { this.job = job; } @Override protected void setup(Mapper.Context context) throws IOException, InterruptedException { try { String username = context.getConfiguration().get( HIHOConf.SALESFORCE_USERNAME); String password = context.getConfiguration().get( HIHOConf.SALESFORCE_PASSWORD); String sfObject = context.getConfiguration().get( HIHOConf.SALESFORCE_SOBJECTYPE); logger.debug("Salesforce connection values are " + username + "/" + password + " and sObject is " + sfObject); conn = sfHandler.getBulkConnection(username, password); job = sfHandler.createJob(sfObject, conn); jobId = new Text(job.getId()); batchId = new Text(); } catch (Exception e) { e.printStackTrace(); throw new IOException(e); } } @Override public void map(Text key, FSDataInputStream val, Context context) throws IOException, InterruptedException { try{ conn=getConnection(); BatchInfo batch = sfHandler.createBatch(val, conn, job); batchId.set(batch.getId()); context.write(jobId, batchId); } catch(Exception e) { e.printStackTrace(); throw new IOException(e); } } /** * @return the jobId */ public Text getJobId() { return jobId; } /** * @param jobId the jobId to set */ public void setJobId(Text jobId) { this.jobId = jobId; } /** * @return the batchId */ public Text getBatchId() { return batchId; } /** * @param batchId the batchId to set */ public void setBatchId(Text batchId) { this.batchId = batchId; } @Override protected void cleanup(Mapper.Context context) throws IOException, InterruptedException { try { if (conn != null) { sfHandler.closeJob(conn, job.getId()); } } catch (Exception s) { s.printStackTrace(); } } }