1.看启动start方法,spark中有哪些类调用了MetricsSystem类的start方法
SparkEnv,Master,SparkContext,Worker,ExternalShuffleService,主要讲ExternalShuffleService
ExternalShuffleService:这个类的作用是提供一个服务来读取shuffle程序,可以防止executor挂掉的时候还在不间断的访问文件。
这个类是如何添加度量系统的呢?
直接创建了通过MetricsSystem类创建了MetricsSystem
protected val masterMetricsSystem = MetricsSystem.createMetricsSystem("shuffleService", sparkConf, securityManager)
private val enabled = sparkConf.getBoolean("spark.shuffle.service.enabled", false)
private val port = sparkConf.getInt("spark.shuffle.service.port", 7337)
private val useSasl: Boolean = securityManager.isAuthenticationEnabled()默认为false通过spark.authenticate配置可调
start方法:
masterMetricsSystem.registerSource(shuffleServiceSource)
masterMetricsSystem.start()
注册这个做了什么操作呢?
又调用了MetricsSystem的registerSource方法
def registerSource(source: Source) {
//这个sources是一个lists的Source,那Source是什么?
//静态就是资源名字,动态方面,对于spark而言资源就是各个监听对我的反馈大小等信息。
sources += source
try {
val regName = buildRegistryName(source)
//注册可以理解为实际是初始化操作
registry.register(regName, source.metricRegistry)
} catch {
case e: IllegalArgumentException => logInfo("Metrics already registered", e)
}
}
上面代码主要关注private val blockHandler = newShuffleBlockHandler(transportConf)
这个方法产生了什么?
产生了new ExternalShuffleBlockHandler(conf, null)
又调用了
this(new OneForOneStreamManager(),
new ExternalShuffleBlockResolver(conf, registeredExecutorFile));
主要看这个ExternalShuffleBlockResolver做了啥?构造了一个ExternalShuffleBlockHandler对象
添加了度量的定义
注册上
调用start方法
全部注册上:
很多的实现都会被注册上
就可以调用一下方法进行度量一些值
下面是一个demo生成CSV的
//MetricRegistry这个类主要是一个Metric,MetricRegistryListener集合 private final static MetricRegistry registry= new MetricRegistry(); private static volatile int i=10; public static void handleRequest() { registry.register(MetricRegistry.name("memory", "maxMem_MB"), new Gauge<Integer>() { @Override public Integer getValue() { int res=i/13; System.out.println("---"+res); return res; }}); } public static void main(String[] args) throws InterruptedException { Thread thread=new Thread(new Runnable() { @Override public void run() { CsvTest.handleRequest(); while (true){ i+=1; } }}); thread.start(); CsvReporter csvReporter = CsvReporter.forRegistry(registry) .formatFor(Locale.CHINA) .convertDurationsTo(TimeUnit.MILLISECONDS) .convertRatesTo(TimeUnit.SECONDS) .build(new File("D:\\img")); csvReporter.start(1, TimeUnit.SECONDS); } 这个工具的主要架构后面讲解