package com.produban.openbus.topologies; import java.io.FileInputStream; import java.io.IOException; import java.util.Properties; import org.apache.storm.hdfs.trident.format.DelimitedRecordFormat; import org.apache.storm.hdfs.trident.format.RecordFormat; import com.produban.openbus.topologies.TimeStampRotationPolicy.Units; import storm.trident.Stream; import storm.trident.TridentTopology; import storm.trident.state.StateFactory; import backtype.storm.Config; import backtype.storm.LocalCluster; import backtype.storm.StormSubmitter; import backtype.storm.generated.AlreadyAliveException; import backtype.storm.generated.InvalidTopologyException; import backtype.storm.tuple.Fields; public class OpenbusProxyTopology { public static void main(String[] args) { if (args.length != 1) { System.out.println("uso: <Fichero de propiedades>"); System.exit(1); } /** Creamos un Objeto de tipo Properties */ Properties propiedades = new Properties(); try { propiedades.load(new FileInputStream(args[0])); } catch (IOException e1) { // TODO Auto-generated catch block System.out.println("Error a la hora de abrir el fichero de PROPERTIES"); e1.printStackTrace(); } // Definición de la Topología Config conf = new Config(); BrokerSpout openbusBrokerSpout = new BrokerSpout(propiedades.getProperty("KAFKA_TOPIC"), // tópico // KAFKA propiedades.getProperty("KAFKA_ZOOKEEPER_LIST"), // zookeeper propiedades.getProperty("KAFAKA_BROKER_ID"), // Client ID - // Configuración // del broker Boolean.parseBoolean(propiedades.getProperty("KAFKA_FROM_BEGINNING"))); // si // es // desde // el // principio // Campos que detectaremos desde el parseador. Fields hdfsFields = new Fields("eventTimeStamp", "timeTaken", "clientIP", "User", "Group", "Exception", "filterResult", "category", "referer", "responseCode", "action", "method", "contentType", "protocol", "requestDomain", "requestPort", "requestPath", "requestQuery", "requestURIExtension", "userAgent", "serverIP", "scBytes", "csBytes", "virusID", "destinationIP"); // Formato del nombre del fichero OpenbusFileNameFormat fileNameFormat = new OpenbusFileNameFormat().withPath(propiedades.getProperty("HDFS_OUTPUT_DIR")) .withPrefix(propiedades.getProperty("HDFS_OUTPUT_FILENAME")).withExtension(propiedades.getProperty("HDFS_OUTPUT_FILE_EXTENSION")); // Formato de los registros. Asignamos el delimitador HIVE por defecto // como separacor de campos. RecordFormat recordFormat = new DelimitedRecordFormat().withFields(hdfsFields).withFieldDelimiter("\001"); // Criterios de Rotación Units unidad_tamano = TimeStampRotationPolicy.Units.MB; if (propiedades.getProperty("SIZE_ROTATION_UNIT").equals("KB")) { unidad_tamano = TimeStampRotationPolicy.Units.KB; } else if (propiedades.getProperty("SIZE_ROTATION_UNIT").equals("MB")) { unidad_tamano = TimeStampRotationPolicy.Units.MB; } else if (propiedades.getProperty("SIZE_ROTATION_UNIT").equals("GB")) { unidad_tamano = TimeStampRotationPolicy.Units.GB; } else if (propiedades.getProperty("SIZE_ROTATION_UNIT").equals("TB")) { unidad_tamano = TimeStampRotationPolicy.Units.TB; } else System.out.println("Unidad de tamaño no reconocida(KB/MB/GB/TB). Se usará por defecto MB."); long unidad_tiempo = TimeStampRotationPolicy.MINUTE; if (propiedades.getProperty("TIME_ROTATION_UNIT").equals("SECOND")) { unidad_tiempo = TimeStampRotationPolicy.SECOND; } else if (propiedades.getProperty("TIME_ROTATION_UNIT").equals("MINUTE")) { unidad_tiempo = TimeStampRotationPolicy.MINUTE; } else if (propiedades.getProperty("TIME_ROTATION_UNIT").equals("HOUR")) { unidad_tiempo = TimeStampRotationPolicy.HOUR; } else if (propiedades.getProperty("TIME_ROTATION_UNIT").equals("DAY")) { unidad_tiempo = TimeStampRotationPolicy.DAY; } else System.out.println("Unidad de tiempo no reconocida(SECOND/MINUTE/HOUR/DAY). Se usará por defecto MINUTE."); TimeStampRotationPolicy rotationPolicy = new TimeStampRotationPolicy().setTimePeriod(Integer.parseInt(propiedades.getProperty("TIME_ROTATION_VALUE")), unidad_tiempo) .setSizeMax(Float.parseFloat(propiedades.getProperty("SIZE_ROTATION_VALUE")), unidad_tamano); OpenbusHdfsState.Options options = new OpenbusHdfsState.HdfsFileOptions().withFileNameFormat(fileNameFormat).withRecordFormat(recordFormat) .withRotationPolicy(rotationPolicy).withFsUrl(propiedades.getProperty("HDFS_URL")) .addSyncMillisPeriod(Long.parseLong(propiedades.getProperty("SYNC_MILLIS_PERIOD"))); System.setProperty("HADOOP_USER_NAME", propiedades.getProperty("HDFS_USER"));// Necesario // para // que // no // intente // entrar // con // el // usuario // que // lanza // el // programa StateFactory factory = new OpenbusHdfsStateFactory().withOptions(options); TridentTopology topology = new TridentTopology(); Stream parseaLogs; String tipo = propiedades.getProperty("INPUT_ORIGIN"); // Definición de la topología if (tipo.equals("kafka")) { // Si leemos desde Kafka parseaLogs = topology.newStream("spout1", openbusBrokerSpout.getPartitionedTridentSpout()).each(new Fields("bytes"), new ProxyParser(tipo), hdfsFields); parseaLogs.partitionPersist(factory, hdfsFields, new OpenbusHdfsUpdater(), new Fields()); if (propiedades.getProperty("KAFKA_OUTPUT_TOPIC") != null && propiedades.getProperty("KAFKA_OUTPUT_TOPIC") != "") { parseaLogs.partitionPersist( new KafkaState.Factory(propiedades.getProperty("KAFKA_OUTPUT_TOPIC"), propiedades.getProperty("KAFKA_ZOOKEEPER_LIST"), propiedades .getProperty("KAFKA_BROKER_HOSTS"), recordFormat, propiedades.getProperty("KAFKA_TOPIC")), hdfsFields, new KafkaState.Updater()); } } if (tipo.equals("disco")) { // Si leemos desde un fichero de disco local SimpleFileStringSpout spout1 = new SimpleFileStringSpout(propiedades.getProperty("INPUT_FILE"), "bytes"); parseaLogs = topology.newStream("spout1", spout1).each(new Fields("bytes"), new ProxyParser(tipo), hdfsFields); parseaLogs.partitionPersist(factory, hdfsFields, new OpenbusHdfsUpdater(), new Fields()); if (propiedades.getProperty("KAFKA_OUTPUT_TOPIC") != null && propiedades.getProperty("KAFKA_OUTPUT_TOPIC") != "") { parseaLogs.partitionPersist( new KafkaState.Factory(propiedades.getProperty("KAFKA_OUTPUT_TOPIC"), propiedades.getProperty("KAFKA_ZOOKEEPER_LIST"), propiedades .getProperty("KAFKA_BROKER_HOSTS"), recordFormat, propiedades.getProperty("KAFKA_TOPIC")), hdfsFields, new KafkaState.Updater()); } } // Despliegue de la topología try { if (propiedades.getProperty("STORM_CLUSTER").equals("local")) { // CLuster local LocalCluster cluster = new LocalCluster(); conf.setMaxSpoutPending(Integer.parseInt(propiedades.getProperty("STORM_MAX_SPOUT_PENDING"))); cluster.submitTopology(propiedades.getProperty("STORM_TOPOLOGY_NAME"), conf, topology.build()); } else { // Cluster conf.setNumWorkers(Integer.parseInt(propiedades.getProperty("STORM_NUM_WORKERS"))); conf.setMaxSpoutPending(Integer.parseInt(propiedades.getProperty("STORM_MAX_SPOUT_PENDING"))); StormSubmitter.submitTopology(propiedades.getProperty("STORM_TOPOLOGY_NAME"), conf, topology.build()); } } catch (NumberFormatException | AlreadyAliveException | InvalidTopologyException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }