spark 发送日志到graylog

网上能搜到的方案都是,使用logback.xml去替换spark/conf/log4j.properties。但是我们的spark集群已经运行很长一段时间,进行全局替换,不太合适。

当前spark环境默认使用的log4j1.*, 应用程序里默认日志是存储在spark.log 和stderr、stdout三个文件里,要进行日志统一搜索不太方便,所以最近准备把日志迁移到graylog2 服务器上。

graylog: http://docs.graylog.org/en/2.4/

 

1 本地测试

添加gradle依赖包,版本自己确定:

compile “org.slf4j:slf4j-api:1.7.12”
compile "org.slf4j:log4j-over-slf4j:1.7.14"
compile “ch.qos.logback:logback-core:1.0.9”
compile “ch.qos.logback:logback-classic:1.0.9”
compile “me.moocar:logback-gelf:0.12”

最后一个是gelf模式的appender包。

logback.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration>

<configuration debug="true">

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
        </encoder>
    </appender>

    <appender name="GELF" class="me.moocar.logbackgelf.GelfAppender">
        <graylog2ServerHost>127.0.0.1</graylog2ServerHost>
        <graylog2ServerPort>12201</graylog2ServerPort>
        <additionalField>applicationId:_application_id</additionalField>
        <facility>logback-gelf</facility>
        <useLoggerName>true</useLoggerName>
        <messagePattern>%m%rEx</messagePattern>
        <shortMessagePattern>%.-100(%m%rEx)</shortMessagePattern>
    </appender>

    <logger name="com.coupang" level="INFO"/>
    <logger name="org.apache" level="WARN"/>

    <root level="INFO">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="GELF"/>
    </root>
</configuration>

本地测试通过。

 

2 部署到spark集群

hadoop 环境:

CDH 55.10.2-1.cdh5.10.2.p0.5

spark环境:

1.6.0 

运行模式yarn-cluster.

默认使用spark-submit提交的时候,不能加载logback相关的类,slf4j自动绑定到slf4j-log4j-*.jar使用系统默认的log4j.properties,这样logback的配置失效。需要添加下面的配置:

--jars “youUsedJars including list above”   \
--conf "spark.driver.userClassPathFirst=true" \
--conf "spark.executor.userClassPathFirst=true" \

添加这三个配置参数以后,日志可以发送到graylog2服务器了,但是抛出异常:

java.lang.UnsatisfiedLinkError: org.xerial.snappy.SnappyNative.maxCompressedLength(I)I at 

解决方案:https://blog.csdn.net/adorechen/article/details/80109625

至此所有问题解决。

 

spark依赖包加载顺序总结:

 

  1. 默认情况下,spark优先使用/etc/spark/conf/classpath.txt里自带的依赖包;
  2. 若是找不到则查找用户通过 --jar 提交的依赖包(位于driver、executor的classpath里);
  3. 若是两个路径下都有相同名字的依赖包(版本不同),则抛出linked exception用户解决冲突;

 

 

  • 使用 --spark.{driver,executor}.userClassPathFirst = true 优先启用用户提供的依赖包;
  • 使用 --spark.{driver,executor}.extraClassPath = conflict-jar 来解决同名冲突的包依赖;

 

参考:

https://www.cnblogs.com/jojo276/p/6498572.html spark logback replace log4j

http://spark.apache.org/docs/latest/configuration.html#runtime-environment    spark runtime configuration

http://community.cloudera.com/t5/Advanced-Analytics-Apache-Spark/Override-libraries-for-spark/td-p/32125 override class path of spark

https://github.com/broadinstitute/gatk/issues/1873 solve snappy maxLength exception

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值