从Spark Streaming 收集应用程序日志到Flume agent的配置方法
来源:互联网 发布:淘宝gtx1060矿卡 编辑:程序博客网 时间:2024/05/28 03:03
从Spark Streaming 收集应用程序日志到Flume agent的配置方法
由于Spark 本身也是log4j收集日志,所以我们在应用程序里再配置一个log4j。先说一下spark Streaming 启动方法,在spark 启动的时候添加以下两个参数:--conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=log4j.properties"
. 比如:
spark-submit --class com.juniorchina.modeling.entry.spark.streaming.Main \ --num-executors 5 \ --executor-cores 8 \ --master yarn \ --deploy-mode cluster \ --files "log4j-executor.properties" \ --conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=log4j-executor.properties" \ user_tag-1.0-SNAPSHOT-jar-with-dependencies.jar
log4j-executor.properties配置
# Define some default values that can be overridden by system properties.## For testing, it may also be convenient to specify# -Dflume.root.logger=DEBUG,console when launching flume.# Set everything to be logged to the consolelog4j.rootCategory=INFO,consolelog4j.logger.UserModelJob=INFO,console,flume# don't log to rootCategorylog4j.additivity.UserModelJob=false# info log filelog4j.appender.file=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.file.Encoding=UTF8log4j.appender.file.Threshold=INFOlog4j.appender.file.File=logs/flume.loglog4j.appender.file.DatePattern='_'yyyyMMdd'.log'log4j.appender.file.layout=org.apache.log4j.PatternLayoutlog4j.appender.file.layout.ConversionPattern=[%p] [%d{yy/MM/dd HH:mm:ss}] [%c{1}]: %m%n# LOGFILE# Stock log4j rolling file appender# Default log rotation configurationlog4j.appender.LOGFILE=org.apache.log4j.RollingFileAppenderlog4j.appender.LOGFILE.MaxFileSize=10KBlog4j.appender.LOGFILE.MaxBackupIndex=10log4j.appender.LOGFILE.File=${flume.log.dir}/${flume.log.file}log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayoutlog4j.appender.LOGFILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS}|%p|%l|%t|%c|%m%n# Warning: If you enable the following appender it will fill up your disk if you don't have a cleanup job!# This uses the updated rolling file appender from log4j-extras that supports a reliable time-based rolling policy.# See http://logging.apache.org/log4j/companions/extras/apidocs/org/apache/log4j/rolling/TimeBasedRollingPolicy.html# Add "DAILY" to flume.root.logger above if you want to use thislog4j.appender.DAILY=org.apache.log4j.rolling.RollingFileAppenderlog4j.appender.DAILY.rollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicylog4j.appender.DAILY.rollingPolicy.ActiveFileName=${flume.log.dir}/${flume.log.file}.loglog4j.appender.DAILY.rollingPolicy.FileNamePattern=${flume.log.dir}/${flume.log.file}.%d{yyyyMMddHH}.loglog4j.appender.DAILY.layout=org.apache.log4j.PatternLayoutlog4j.appender.DAILY.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss},%c,%m,(%C.%M:%L)%n# console# Add "console" to flume.root.logger above if you want to use thislog4j.appender.console=org.apache.log4j.ConsoleAppenderlog4j.appender.console.target=System.outlog4j.appender.console.layout=org.apache.log4j.PatternLayoutlog4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss},(%F),%c,%m%n# flumelog4j.appender.flume=org.apache.flume.clients.log4jappender.Log4jAppenderlog4j.appender.flume.Hostname=192.168.5.151log4j.appender.flume.Port=41414log4j.appender.flume.AppName=usermodelinglog4j.appender.flume.UnsafeMode=falselog4j.appender.flume.layout=org.apache.log4j.PatternLayoutlog4j.appender.flume.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss},(%F),%c,%m%n# Settings to quiet third party logs that are too verboselog4j.logger.org.eclipse.jetty=WARNlog4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFOlog4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO
log4jappender.Log4jAppender
对log4jappender.Log4jAppender做了一些修改,在header中添加app.name,app.event.type,app.source.host参数。核心代码:
@Override public synchronized void append(LoggingEvent event) throws FlumeException { //If rpcClient is null, it means either this appender object was never //setup by setting hostname and port and then calling activateOptions //or this appender object was closed by calling close(), so we throw an //exception to show the appender is no longer accessible. boolean ready = true; if (rpcClient == null) { String errorMsg = "Cannot Append to Appender! Appender either closed or" + " not setup correctly!"; LogLog.error(errorMsg); // start a new thread try if (unsafeMode) { reconnect(); if(rpcClient == null || !rpcClient.isActive()){ ready = false; } }else { throw new FlumeException(errorMsg); } } if(unsafeMode && !ready){ return; } if (!rpcClient.isActive()) { reconnect(); } //Client created first time append is called. Map<String, String> hdrs = new HashMap<String, String>(); //hdrs.put(Log4jAvroHeaders.LOGGER_NAME.toString(), event.getLoggerName()); hdrs.put(Log4jAvroHeaders.TIMESTAMP.toString(), String.valueOf(event.timeStamp)); //To get the level back simply use //LoggerEvent.toLevel(hdrs.get(Integer.parseInt( //Log4jAvroHeaders.LOG_LEVEL.toString())) hdrs.put(Log4jAvroHeaders.LOG_LEVEL.toString(), String.valueOf(event.getLevel().toInt())); hdrs.put(Log4jAvroHeaders.APP_NAME.toString(), appName); hdrs.put(Log4jAvroHeaders.APP_Event_TYPE.toString(), event.getLoggerName()); try { String hostIp = null; Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces(); while (networkInterfaces.hasMoreElements()) { NetworkInterface ni = (NetworkInterface) networkInterfaces.nextElement(); Enumeration<InetAddress> nias = ni.getInetAddresses(); while (nias.hasMoreElements()) { InetAddress ia = (InetAddress) nias.nextElement(); if (!ia.isLinkLocalAddress() && !ia.isLoopbackAddress() && ia instanceof Inet4Address) { hostIp = ia.getHostAddress(); } } } hdrs.put(Log4jAvroHeaders.APP_SOURCE_HOST.toString(), hostIp + ""); } catch (SocketException e) { String msg = "Can't get localhost IP"; LogLog.error(msg); if (unsafeMode) { return; } throw new FlumeException(msg + " Exception follows.", e); } Event flumeEvent; Object message = event.getMessage(); if (message instanceof GenericRecord) { GenericRecord record = (GenericRecord) message; populateAvroHeaders(hdrs, record.getSchema(), message); flumeEvent = EventBuilder.withBody(serialize(record, record.getSchema()), hdrs); } else if (message instanceof SpecificRecord || avroReflectionEnabled) { Schema schema = ReflectData.get().getSchema(message.getClass()); populateAvroHeaders(hdrs, schema, message); flumeEvent = EventBuilder.withBody(serialize(message, schema), hdrs); } else { hdrs.put(Log4jAvroHeaders.MESSAGE_ENCODING.toString(), "UTF8"); String msg = layout != null ? layout.format(event) : message.toString(); flumeEvent = EventBuilder.withBody(msg, Charset.forName("UTF8"), hdrs); } try { rpcClient.append(flumeEvent); } catch (Exception e) { String msg = "Flume append() failed."; LogLog.error(msg); if (unsafeMode) { return; } throw new FlumeException(msg + " Exception follows.", e); } }
可以去github clone flume-log4j-appender https://github.com/kntao/flume/tree/flume-1.5/flume-ng-clients/flume-ng-log4jappender
0 1
- 从Spark Streaming 收集应用程序日志到Flume agent的配置方法
- 从flume到kafka,日志收集
- flume spark streaming配置详解
- flume-kafka- spark streaming(pyspark) - redis 实时日志收集实时计算
- [日志处理工作之三]使用flume采集DB2日志推送到kafka,并使用spark streaming拉取指定topic的日志
- flume 收集日志到HDFS
- flume收集日志到mysql
- Flume 日志收集、使用Flume收集日志到HDFS
- Flume Push数据到spark streaming或者接收Spark streaming的poll数据时实际运行程序总结
- Spark Streaming 和 Flume-NG的整合
- Spark Streaming和Flume的结合使用
- Spark streaming and flume
- Spark-streaming 连接flume
- flume kafka spark streaming
- td-agent收集日志到mongobd
- 第88讲:Spark Streaming从Flume Poll数据
- Spark Streaming从Flume读取数据流(pull模式)
- flume-ng 日志收集到hbase
- 浮点数比较大小的问题
- How to use cocoa pod in your iOS project
- Android 开发系列(2) - native代码调用java代码 - 获取硬件 IMEI 和硬件序列号
- How to use user’s location in your app?
- 面向GC的Java编程
- 从Spark Streaming 收集应用程序日志到Flume agent的配置方法
- maven使用命令行新建项目
- ssh-key Permission denied (publickey)
- Android酷炫实用的开源框架(UI框架)
- 经典算法学习——直接插入排序
- Permission denied (publickey)
- java注解的学习
- Swift: 是用Custom Segue还是用Transition动画
- Cassandra----暗示移交(hinted handoff)