package com.cloudera.fraud.example; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicLong; import org.apache.commons.lang.StringUtils; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HColumnDescriptor; import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.client.HBaseAdmin; import org.apache.hadoop.hbase.regionserver.ConstantSizeRegionSplitPolicy; import org.apache.hadoop.hbase.regionserver.StoreFile.BloomType; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.io.hfile.Compression; import com.cloudera.fraud.example.model.Alert; import com.cloudera.fraud.example.model.ItemSaleEvent; import com.cloudera.fraud.example.model.ProfilePojo; import com.cloudera.fraud.example.service.AbstractCacheFraudService; import com.cloudera.fraud.example.service.AbstractFraudHBaseService; import com.cloudera.fraud.example.service.EventualPutFraudHBaseService; import com.cloudera.fraud.example.service.ServiceFactory; import com.cloudera.fraud.example.service.AbstractFraudHBaseService.ProfileCreatePojo; public class App { public static void main(String[] args) throws Exception { if (args.length == 0) { System.out.println("FraudAlerterMain {numberOfUsers} {numberOfEvents} {numberOfThreads} {cacheLayer} {hbaseServiceLayer}"); return; } int numberOfUsers = Integer.parseInt(args[0]); int numberOfEvents = Integer.parseInt(args[1]); int numberOfThreads = Integer.parseInt(args[2]); String cacheLayer = args[3]; String hbaseServiceLayer = args[4]; if (createProfileTable()) { populateUsers(numberOfUsers); } runEventTest(numberOfUsers, numberOfEvents, numberOfThreads, cacheLayer, hbaseServiceLayer); } private static void runEventTest(final int numberOfUsers, int numberOfEvents, int numberOfThreads, String cacheServiceType, String hbaseServiceType) { final AbstractFraudHBaseService hbaseService = ServiceFactory.initHBaseService(hbaseServiceType); final AbstractCacheFraudService cacheService = ServiceFactory.initCacheService(cacheServiceType, hbaseService); ExecutorService executorService = Executors.newFixedThreadPool(numberOfThreads); final AtomicLong alertCount = new AtomicLong(); final AtomicLong eventCount = new AtomicLong(); for (int i = 0; i < numberOfEvents/5; i++) { executorService.execute(new Runnable() { public void run() { Random r = new Random(); String ipAddress; if (r.nextInt(100) == 50) { ipAddress = TestConsts.UNSAFE_UP_ADDRESS_LIST.get(r.nextInt(TestConsts.UNSAFE_UP_ADDRESS_LIST.size())); } else { ipAddress = TestConsts.SAFE_UP_ADDRESS_LIST.get(r.nextInt(TestConsts.SAFE_UP_ADDRESS_LIST.size())); } try { int buyerId = r.nextInt(numberOfUsers); int sellerId = r.nextInt(numberOfUsers); cacheService.logInProfileInHBase(r.nextInt(numberOfUsers),ipAddress); int eventsToDo = r.nextInt(10); for (int i = 0; i < eventsToDo; i++) { eventCount.addAndGet(1); long itemValue; if (r.nextInt(50) == 25) { itemValue = r.nextInt(100000); } else { itemValue = r.nextInt(10000); } ItemSaleEvent event = new ItemSaleEvent(buyerId, sellerId, r.nextLong(), itemValue); List<Alert> alerts = cacheService.processEventForAlerts(event); alertCount.addAndGet(alerts.size()); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.print("."); } }); } System.out.println("Total Events:" + eventCount.get()); System.out.println("Total Alerts:" + alertCount.get()); System.out.println("Total LogIns:" + numberOfEvents/5); } public static boolean createProfileTable() throws IOException { long regionMaxSize = 107374182400l; HBaseAdmin admin = new HBaseAdmin(new Configuration()); boolean results = createTable(DataModelConsts.PROFILE_TABLE, DataModelConsts.PROFILE_COLUMN_FAMILY, (short) 10, regionMaxSize, admin); admin.close(); return results; } private static boolean createTable(byte[] tableName, byte[] columnFamilyName, short regionCount, long regionMaxSize, HBaseAdmin admin) throws IOException { if (admin.tableExists(tableName)) { return false; } HTableDescriptor tableDescriptor = new HTableDescriptor(); tableDescriptor.setName(tableName); HColumnDescriptor columnDescriptor = new HColumnDescriptor(columnFamilyName); columnDescriptor.setCompressionType(Compression.Algorithm.SNAPPY); columnDescriptor.setBlocksize(64 * 1024); columnDescriptor.setBloomFilterType(BloomType.ROW); columnDescriptor.setMaxVersions(10); tableDescriptor.addFamily(columnDescriptor); tableDescriptor.setMaxFileSize(regionMaxSize); tableDescriptor.setValue(tableDescriptor.SPLIT_POLICY, ConstantSizeRegionSplitPolicy.class.getName()); tableDescriptor.setDeferredLogFlush(true); regionCount = (short) Math.abs(regionCount); int regionRange = Short.MAX_VALUE / regionCount; int counter = 0; byte[][] splitKeys = new byte[regionCount][]; for (byte[] splitKey : splitKeys) { counter = counter + regionRange; String key = StringUtils.leftPad(Integer.toString(counter), 5, '0'); splitKey = Bytes.toBytes(key); System.out.println(" - Split: " + splitKey); } return true; } private static void populateUsers(int numberOfUsers) throws Exception { EventualPutFraudHBaseService service = new EventualPutFraudHBaseService(); ArrayList<ProfileCreatePojo> pojoList = new ArrayList<ProfileCreatePojo>(); Random r = new Random(); for (long i = 0; i < numberOfUsers; i++) { String ipAddress = TestConsts.SAFE_UP_ADDRESS_LIST.get(r.nextInt(TestConsts.SAFE_UP_ADDRESS_LIST.size())); pojoList.add(new ProfileCreatePojo(i, new ProfilePojo("user-" + i, (int)(i%30 + 10), ipAddress), ipAddress)); if (i%1000 == 0) { service.createBulkProfile(pojoList); pojoList.clear(); } } if (pojoList.size() > 0) { service.createBulkProfile(pojoList); } } }