Apache Flume 1.7.0 自定义输入输出

自定义http source

config

a1.sources.r1.type=http
a1.sources.r1.bind=localhost
a1.sources.r1.port=8081
a1.sources.r1.channels=c1
#自定义source Handler
a1.sources.r1.handler = org.apache.flume.sw.source.http.JSONHandler
a1.sources.r1.handler.configHome = /home/www/logs/datareport

handler

public class JSONHandler implements HTTPSourceHandler {

  
  
  private static final Logger LOG = LoggerFactory.getLogger(JSONHandler.class);
  
  public static final String PARA_SIGN = "sign";
  public static final String PARA_PROJECT_ID = "projectId";
  public static final String PARA_REPORT_MSG = "reportMsg";
  
  private final Type mapType = new TypeToken<LinkedHashMap<String, Object>>() {}.getType();
  private final Gson gson;

  //可以获取外部参数
  private Context context = null;
  
  public JSONHandler() {
    gson = new GsonBuilder().disableHtmlEscaping().create();
  }

  /**
   * {@inheritDoc}
   */
  @Override
  public List<Event> getEvents(HttpServletRequest request) throws Exception {
    BufferedReader reader = request.getReader();
    String charset = request.getCharacterEncoding();
    //UTF-8 is default for JSON. If no charset is specified, UTF-8 is to
    //be assumed.
    if (charset == null) {
      LOG.debug("Charset is null, default charset of UTF-8 will be used.");
      charset = "UTF-8";
    } else if (!(charset.equalsIgnoreCase("utf-8")
            || charset.equalsIgnoreCase("utf-16")
            || charset.equalsIgnoreCase("utf-32"))) {
      LOG.error("Unsupported character set in request {}. "
              + "JSON handler supports UTF-8, "
              + "UTF-16 and UTF-32 only.", charset);
      throw new UnsupportedCharsetException("JSON handler supports UTF-8, "
              + "UTF-16 and UTF-32 only.");
    }

    /*
     * Gson throws Exception if the data is not parseable to JSON.
     * Need not catch it since the source will catch it and return error.
     */
    LinkedHashMap<String, Object> map = new LinkedHashMap<String, Object>();
    try {
      map = gson.fromJson(reader, mapType);
    } catch (JsonSyntaxException ex) {
      throw new HTTPBadRequestException("Request has invalid JSON Syntax.", ex);
    }

    String configHome = this.context.getString("configHome");
    LOG.info(configHome);
    String projectId = map.get(PARA_PROJECT_ID).toString();
    String reportMsg = map.get(PARA_REPORT_MSG).toString();
    Map<String, String> headers = new HashMap<String, String>();
    headers.put(PARA_PROJECT_ID, projectId);
    headers.put(PARA_SIGN, "");
    JSONEvent jsonEvent = new JSONEvent();
    jsonEvent.setHeaders(headers);
    jsonEvent.setBody(reportMsg.getBytes());

    return getSimpleEvents(jsonEvent);
  }

  @Override
  public void configure(Context context) {
    this.context = context;
  }

  private List<Event> getSimpleEvents(Event e) {
    List<Event> newEvents = new ArrayList<Event>(1);
    newEvents.add(EventBuilder.withBody(e.getBody(), e.getHeaders()));
    return newEvents;
  }
}

自定义Sink

config

#自定义Sink
a1.sinks.k1.type = org.apache.flume.sw.sink.RollingFileSink
a1.sinks.k1.channel = c1
a1.sinks.k1.sink.rollInterval = 15
a1.sinks.k1.sink.directory = D:/var/log/flume
#自定义pathManager类型
a1.sinks.k1.sink.pathManager = CUSTOM
#文件创建频率 (null or yyyyMMddHHmmss), 默认值null->不创建
a1.sinks.k1.sink.pathManager.dirNameFormatter = yyyyMMdd
a1.sinks.k1.sink.pathManager.prefix = log_
a1.sinks.k1.sink.pathManager.extension = txt

自定义RollingFileSink

    if(pathManagerType.equals("CUSTOM")) {
      //如果外部配置的PathManager是CUSTOM,则直接new出自定义的SimplePathManager
      pathController = new SimplePathManager(pathManagerContext);
    } else {
      pathController = PathManagerFactory.getInstance(pathManagerType, pathManagerContext);
    }

自定义pathManager类型

public class SimplePathManager extends DefaultPathManager {
  private static final Logger logger = LoggerFactory
      .getLogger(SimplePathManager.class);
  private final DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyyMMddHHmmss");
  private DateTimeFormatter dirNameFormatter = null;

  private String lastRoll;

  public SimplePathManager(Context context) {
    super(context);
    
    String dirNameFormatterStr = context.getString("dirNameFormatter");
    if(dirNameFormatterStr == null || "null".equals(dirNameFormatterStr)){
      dirNameFormatter = null;
    } else {
      dirNameFormatter = DateTimeFormat.forPattern(dirNameFormatterStr);
    }
    
  }

  @Override
  public File nextFile() {
    LocalDateTime now = LocalDateTime.now();
    StringBuilder sb = new StringBuilder();
    String date = formatter.print(now);
    if (!date.equals(lastRoll)) {
      getFileIndex().set(0);
      lastRoll = date;
    }
    sb.append(getPrefix()).append(date).append("-");
    sb.append(getFileIndex().incrementAndGet());
    if (getExtension().length() > 0) {
      sb.append(".").append(getExtension());
    }
    
    File dir = dirNameFormatter != null ? new File(getBaseDirectory(), dirNameFormatter.print(now)) : 
      getBaseDirectory();
    
    try {
      FileUtils.forceMkdir(dir);
      currentFile = new File(dir, sb.toString());
    } catch (IOException e) {
      currentFile = new File(getBaseDirectory(), sb.toString());
      logger.error(e.toString(), e);
    }  
    
    return currentFile;
  }

  public static class Builder implements PathManager.Builder {
    @Override
    public PathManager build(Context context) {
      return new SimplePathManager(context);
    }
  }

}

 

posted @ 2019-03-08 23:27 风一样的码农 阅读(...) 评论(...) 编辑 收藏