.NetCore實踐篇:使用zipkin4net推送資料到分散式監控zipkin(2)
前言
《牧神記》有一句話說的好,破心中神。當不再對分散式,微服務,CLR畏懼迷茫的時候,你就破了心中神。
zipkin複習
第一篇: ofollow,noindex" target="_blank">.Net架構篇:思考如何設計一款實用的分散式監控系統?
第二篇: NetCore實踐篇:分散式監控客戶端ZipkinTracer從入門到放棄之路 ,我們提到了zipkin的原理和架構說明,以及用zipkintracer實踐失敗的記錄。
今天我們來複習下。
zipkin作用
全鏈路追蹤工具(根據依賴關係)
檢視每個介面、每個service的執行速度(定位問題發生點或者尋找效能瓶頸)
zipkin工作原理
創造一些追蹤識別符號(tracingId,spanId,parentId),最終將一個request的流程樹構建出來
zipkin架構
Collector接收各service傳輸的資料;
Cassandra作為Storage的一種,預設儲存在記憶體中,也支援ElasticSearch和mysql用於生產落庫;
Query負責查詢Storage中儲存的資料,提供簡單的JSON API獲取資料,主要提供給web UI使用;
Web 提供簡單的web介面;
zipkin分散式跟蹤系統的目的
zipkin為分散式鏈路呼叫監控系統,聚合各業務系統呼叫延遲資料,達到鏈路呼叫監控跟蹤;
zipkin通過採集跟蹤資料可以幫助開發者深入瞭解在分散式系統中某一個特定的請求時如何執行的;
參考如下
zipkin4net簡介
zipkin4net是.NET客戶端庫。
它為您提供:
-
Zipkin 原語(跨度,註釋,二進位制註釋,......)【Zipkin primitives (spans, annotations, binary annotations, ...)】
-
非同步跟蹤傳送
-
跟蹤傳輸抽象
zipkin4net是.NET客戶端庫。
它為您提供:
-
Zipkin 原語(跨度,註釋,二進位制註釋,......)【Zipkin primitives (spans, annotations, binary annotations, ...)】
-
非同步跟蹤傳送
-
跟蹤傳輸抽象
簡單用法
var logger = CreateLogger(); //它應該實現ILogger
var sender = CreateYourTransport(); //它應該實現IZipkinSender
TraceManager.SamplingRate = 1.0f; //全監控
var tracer = new ZipkinTracer(sender);
TraceManager.RegisterTracer(tracer);
TraceManager.Start(logger);
//執行你的程式
//當關閉時。
TraceManager.Stop();
簡介到此為止,剩餘您可參考 zipkin4net 。
var logger = CreateLogger(); //它應該實現ILogger var sender = CreateYourTransport(); //它應該實現IZipkinSender TraceManager.SamplingRate = 1.0f; //全監控 var tracer = new ZipkinTracer(sender); TraceManager.RegisterTracer(tracer); TraceManager.Start(logger); //執行你的程式 //當關閉時。 TraceManager.Stop();
簡介到此為止,剩餘您可參考 zipkin4net 。
Show me the Code
廢話少說,一杯程式碼為敬。
進入程式碼之前,我先來演示下程式碼結構。這個結構對應我之前的程式碼實踐。記憶體佇列,爬蟲在我的部落格內都能找到部落格對應。
演示結構圖
今天我們只說zipkin4Net的實踐。為了測試檢視zipkin是否能夠彙集不同的站點,我特意建立了兩個站點Demo.ZipKinWeb和Demo.ZipKinWeb2。類似下圖:
image.png
為了能真實落庫,我建立了FanQuick.Repository,用於提供mongodb儲存幫助。IRepository泛型介面宣告如下
namespace FanQuick.Repository
{
public interface IRepository<TDocument> where TDocument:EntityBase
{
IQueryable<TDocument> Queryable { get; }
bool Any(Expression<Func<TDocument, bool>> filter);
/// <summary>
/// 刪除
/// </summary>
/// <param name="filter"></param>
/// <returns></returns>
bool Delete(Expression<Func<TDocument, bool>> filter);
/// <summary>
/// 查詢
/// </summary>
/// <param name="filter"></param>
/// <returns></returns>
IEnumerable<TDocument> Find(Expression<Func<TDocument, bool>> filter);
/// <summary>
/// 新增
/// </summary>
/// <param name="document"></param>
void Insert(TDocument document);
/// <summary>
/// 批量插入
/// </summary>
/// <param name="documents"></param>
void Insert(IEnumerable<TDocument> documents);
/// <summary>
/// 統計。
/// </summary>
/// <param name="filter"></param>
/// <returns></returns>
long Count(Expression<Func<TDocument, bool>> filter);
TDocument FindOneAndDelete(Expression<Func<TDocument, bool>> filter);
TDocument FindOneAndUpdate(FilterDefinition<TDocument> filter, UpdateDefinition<TDocument> update);
}
}
為了兩個站點能夠複用呼叫zipkin4net的通知,我將程式碼抽離出來放到了 Demo.ZipkinCommon。
可複用的抽象類CommonStartUp,程式碼如下:重點關注下呼叫zipkin4net的程式碼。並將抽象Run方法暴漏給了子類,需要子類實現。要特別注意,appsettings.json需要設定
applicationName
,不然傳送到zipkin就是未命名服務,這就不能區分站點了!
namespace Demo.ZipkinCommon
{
public abstract class CommonStartup
{
// This method gets called by the runtime. Use this method to add services to the container.
// For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
public abstract void ConfigureServices(IServiceCollection services);
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
var config = ConfigureSettings.CreateConfiguration();
var applicationName = config["applicationName"];
//if (env.IsDevelopment())
//{
// app.UseDeveloperExceptionPage();
//}
//else
//{
// app.UseExceptionHandler("/Home/Error");
// app.UseHsts();
//}
var lifetime = app.ApplicationServices.GetService<IApplicationLifetime>();
lifetime.ApplicationStarted.Register(() =>
{
TraceManager.SamplingRate = 1.0f;
var logger = new TracingLogger(loggerFactory, "zipkin4net");
var httpSender = new HttpZipkinSender("http://weixinhe.cn:9411", "application/json");
var tracer = new ZipkinTracer(httpSender, new JSONSpanSerializer());
TraceManager.RegisterTracer(tracer);
TraceManager.Start(logger);
});
lifetime.ApplicationStopped.Register(() => TraceManager.Stop());
app.UseTracing(applicationName);
Run(app, config);
}
protected abstract void Run(IApplicationBuilder app, IConfiguration configuration);
}
}
讀取配置類,也獨立了出來,可支援讀取appsettings.json, 每個站點需要把appsettings.json設定允許複製 ,不然會找不到檔案!!
namespace Demo.ZipkinCommon
{
public class ConfigureSettings
{
public static IConfiguration CreateConfiguration()
{
var builder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddEnvironmentVariables();
return builder.Build();
}
}
}
公用部分完成了。我們看看站點Demo.ZipKinWeb程式碼。Startup繼承抽象類CommonStartup,並利用.netCore內建依賴注入,將Service和倉儲注入進來。由於不支援直接注入泛型,但支援type型別的注入,間接也解決了泛型注入問題。關於依賴注入的講解,你可以參考上篇文中依賴注入部分,加深理解。
namespace Demo.ZipKinWeb
{
public class Startup : CommonStartup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public override void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddScoped(typeof(IRepository<>), typeof(BaseRepository<>));
services.AddScoped<IUserService, UserService>();
services.AddScoped<IAddressService, AddressService>();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
protected override void Run(IApplicationBuilder app, IConfiguration configuration)
{
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
}
}
為了實現聚合兩個站點的效果,在Add的方法內,特意呼叫一下另外個站點的get
[HttpPost]
public IActionResult Add([FromBody]User user)
{
_userService.AddUser(user);
//模擬呼叫其他站點請求。
var client = new RestClient($"{ConfigEx.WebSite}");
var request = new RestRequest($"/user/get", Method.POST);
request.AddParameter("id", user.Id); // adds to POST or URL querystring based on Method
IRestResponse response = client.Execute(request);
var content = response.Content;
// return Json(new { data = content });
return Content(content+_addressService.Test());
}
建好必要的Controller和Action後,將兩個站點都設為已啟動。就可以檢視效果了。
postman是個測試介面的好工具,點選Send。
postman介面測試
開啟我們的zipkin伺服器連結,在WebUI上,可以看到兩條請求資料。這是正確的,一條是Add,裡面又調了另外一個站點的get,也能看到消耗的時間。
監測資料
點選去檢視詳情,我們能看到更多資料。
請求詳情
然後繼續點選 選單中的 Dependencies ,確發現是空值,按道理來講,請求了兩個站點,又訪問了資料庫。怎麼會是空值呢???
依賴
這個時候,我只能又求助bing了。
zipkin Dependencies no data
果然網友是萬能的。 elasticsearch儲存,zipkin依賴沒有資料
裡面有位外國同仁提到了
當你用你elasticsearch 或 Cassandra的時候,需要執行zipkin-dependencies
(you need to run https://github.com/openzipkin/zipkin-dependencies when using elasticsearch or Cassandra)
廢話少說,一杯程式碼為敬。
進入程式碼之前,我先來演示下程式碼結構。這個結構對應我之前的程式碼實踐。記憶體佇列,爬蟲在我的部落格內都能找到部落格對應。
演示結構圖
今天我們只說zipkin4Net的實踐。為了測試檢視zipkin是否能夠彙集不同的站點,我特意建立了兩個站點Demo.ZipKinWeb和Demo.ZipKinWeb2。類似下圖:
image.png
為了能真實落庫,我建立了FanQuick.Repository,用於提供mongodb儲存幫助。IRepository泛型介面宣告如下
namespace FanQuick.Repository { public interface IRepository<TDocument> where TDocument:EntityBase { IQueryable<TDocument> Queryable { get; } bool Any(Expression<Func<TDocument, bool>> filter); /// <summary> /// 刪除 /// </summary> /// <param name="filter"></param> /// <returns></returns> bool Delete(Expression<Func<TDocument, bool>> filter); /// <summary> /// 查詢 /// </summary> /// <param name="filter"></param> /// <returns></returns> IEnumerable<TDocument> Find(Expression<Func<TDocument, bool>> filter); /// <summary> /// 新增 /// </summary> /// <param name="document"></param> void Insert(TDocument document); /// <summary> /// 批量插入 /// </summary> /// <param name="documents"></param> void Insert(IEnumerable<TDocument> documents); /// <summary> /// 統計。 /// </summary> /// <param name="filter"></param> /// <returns></returns> long Count(Expression<Func<TDocument, bool>> filter); TDocument FindOneAndDelete(Expression<Func<TDocument, bool>> filter); TDocument FindOneAndUpdate(FilterDefinition<TDocument> filter, UpdateDefinition<TDocument> update); } }
為了兩個站點能夠複用呼叫zipkin4net的通知,我將程式碼抽離出來放到了 Demo.ZipkinCommon。
可複用的抽象類CommonStartUp,程式碼如下:重點關注下呼叫zipkin4net的程式碼。並將抽象Run方法暴漏給了子類,需要子類實現。要特別注意,appsettings.json需要設定
applicationName
,不然傳送到zipkin就是未命名服務,這就不能區分站點了!
namespace Demo.ZipkinCommon { public abstract class CommonStartup { // This method gets called by the runtime. Use this method to add services to the container. // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940 public abstract void ConfigureServices(IServiceCollection services); // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { var config = ConfigureSettings.CreateConfiguration(); var applicationName = config["applicationName"]; //if (env.IsDevelopment()) //{ // app.UseDeveloperExceptionPage(); //} //else //{ // app.UseExceptionHandler("/Home/Error"); // app.UseHsts(); //} var lifetime = app.ApplicationServices.GetService<IApplicationLifetime>(); lifetime.ApplicationStarted.Register(() => { TraceManager.SamplingRate = 1.0f; var logger = new TracingLogger(loggerFactory, "zipkin4net"); var httpSender = new HttpZipkinSender("http://weixinhe.cn:9411", "application/json"); var tracer = new ZipkinTracer(httpSender, new JSONSpanSerializer()); TraceManager.RegisterTracer(tracer); TraceManager.Start(logger); }); lifetime.ApplicationStopped.Register(() => TraceManager.Stop()); app.UseTracing(applicationName); Run(app, config); } protected abstract void Run(IApplicationBuilder app, IConfiguration configuration); } }
讀取配置類,也獨立了出來,可支援讀取appsettings.json, 每個站點需要把appsettings.json設定允許複製 ,不然會找不到檔案!!
namespace Demo.ZipkinCommon { public class ConfigureSettings { public static IConfiguration CreateConfiguration() { var builder = new ConfigurationBuilder() .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .AddEnvironmentVariables(); return builder.Build(); } } }
公用部分完成了。我們看看站點Demo.ZipKinWeb程式碼。Startup繼承抽象類CommonStartup,並利用.netCore內建依賴注入,將Service和倉儲注入進來。由於不支援直接注入泛型,但支援type型別的注入,間接也解決了泛型注入問題。關於依賴注入的講解,你可以參考上篇文中依賴注入部分,加深理解。
namespace Demo.ZipKinWeb { public class Startup : CommonStartup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } public override void ConfigureServices(IServiceCollection services) { services.Configure<CookiePolicyOptions>(options => { // This lambda determines whether user consent for non-essential cookies is needed for a given request. options.CheckConsentNeeded = context => true; options.MinimumSameSitePolicy = SameSiteMode.None; }); services.AddScoped(typeof(IRepository<>), typeof(BaseRepository<>)); services.AddScoped<IUserService, UserService>(); services.AddScoped<IAddressService, AddressService>(); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); } protected override void Run(IApplicationBuilder app, IConfiguration configuration) { app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseCookiePolicy(); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); } } }
為了實現聚合兩個站點的效果,在Add的方法內,特意呼叫一下另外個站點的get
[HttpPost] public IActionResult Add([FromBody]User user) { _userService.AddUser(user); //模擬呼叫其他站點請求。 var client = new RestClient($"{ConfigEx.WebSite}"); var request = new RestRequest($"/user/get", Method.POST); request.AddParameter("id", user.Id); // adds to POST or URL querystring based on Method IRestResponse response = client.Execute(request); var content = response.Content; // return Json(new { data = content }); return Content(content+_addressService.Test()); }
建好必要的Controller和Action後,將兩個站點都設為已啟動。就可以檢視效果了。
postman是個測試介面的好工具,點選Send。
postman介面測試
開啟我們的zipkin伺服器連結,在WebUI上,可以看到兩條請求資料。這是正確的,一條是Add,裡面又調了另外一個站點的get,也能看到消耗的時間。
點選去檢視詳情,我們能看到更多資料。
請求詳情
然後繼續點選 選單中的 Dependencies ,確發現是空值,按道理來講,請求了兩個站點,又訪問了資料庫。怎麼會是空值呢???
依賴
這個時候,我只能又求助bing了。
zipkin Dependencies no data
果然網友是萬能的。 elasticsearch儲存,zipkin依賴沒有資料
裡面有位外國同仁提到了
當你用你elasticsearch 或 Cassandra的時候,需要執行zipkin-dependencies
(you need to run https://github.com/openzipkin/zipkin-dependencies when using elasticsearch or Cassandra)
zipkin-dependencies簡介
這是一個Spark作業,它將從您的資料儲存區收集跨度,分析服務之間的連結,並存儲它們以供以後在 Web UI中 呈現(例如 http://localhost:8080/dependency )。
什麼是Spark?
Apache Spark 是專為大規模資料處理而設計的快速通用的計算引擎。
此作業以UTC時間分析當天的所有跟蹤。這意味著您應該將其安排在UTC午夜之前執行。
支援所有Zipkin 儲存元件 ,包括Cassandra,SQL/">MySQL和Elasticsearch。
這真是一個弱雞的設計,作為記憶體執行的演示,竟然不提供及時彙總分析,還要跑定時任務
依據官方提示,按最快的方式進行。
wget -O zipkin-dependencies.jar 'https://search.maven.org/remote_content?g=io.zipkin.dependencies&a=zipkin-dependencies&v=LATEST'
STORAGE_TYPE=cassandra3 java -jar zipkin-dependencies.jar
或者用Docker啟動
docker run --env STORAGE_TYPE=cassandra3 --env CASSANDRA_CONTACT_POINTS=host1,host2 openzipkin/zipkin-dependencies
這是一個Spark作業,它將從您的資料儲存區收集跨度,分析服務之間的連結,並存儲它們以供以後在 Web UI中 呈現(例如 http://localhost:8080/dependency )。
什麼是Spark?
Apache Spark 是專為大規模資料處理而設計的快速通用的計算引擎。
此作業以UTC時間分析當天的所有跟蹤。這意味著您應該將其安排在UTC午夜之前執行。
支援所有Zipkin 儲存元件 ,包括Cassandra,SQL/">MySQL和Elasticsearch。
這真是一個弱雞的設計,作為記憶體執行的演示,竟然不提供及時彙總分析,還要跑定時任務
依據官方提示,按最快的方式進行。
wget -O zipkin-dependencies.jar 'https://search.maven.org/remote_content?g=io.zipkin.dependencies&a=zipkin-dependencies&v=LATEST' STORAGE_TYPE=cassandra3 java -jar zipkin-dependencies.jar
或者用Docker啟動
docker run --env STORAGE_TYPE=cassandra3 --env CASSANDRA_CONTACT_POINTS=host1,host2 openzipkin/zipkin-dependencies
用法
預設情況下,此作業解析自UTC午夜以來的所有跟蹤。您可以通過YYYY-mm-dd格式的引數解析不同日期的跟蹤,如2016-07-16。
# ex to run the job to process yesterday's traces on OS/X
STORAGE_TYPE=cassandra3 java -jar zipkin-dependencies.jar `date -uv-1d +%F`
# or on Linux
STORAGE_TYPE=cassandra3 java -jar zipkin-dependencies.jar `date -u -d '1 day ago' +%F`
執行失敗
STORAGE_TYPE=cassandra3 java -jar zipkin-dependencies.jar `date -u -d '1 day ago' +%F`
18/09/14 20:24:50 INFO CassandraDependenciesJob: Running Dependencies job for 2018-09-13: 1536796800000000 ≤ Span.timestamp 1536883199999999
18/09/14 20:24:50 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
18/09/14 20:24:51 ERROR SparkContext: Error initializing SparkContext.
java.lang.IllegalArgumentException: System memory 466288640 must be at least 471859200. Please increase heap size using the --driver-memory option or spark.driver.memory in Spark configuration.
at org.apache.spark.memory.UnifiedMemoryManager$.getMaxMemory(UnifiedMemoryManager.scala:217)
at org.apache.spark.memory.UnifiedMemoryManager$.apply(UnifiedMemoryManager.scala:199)
at org.apache.spark.SparkEnv$.create(SparkEnv.scala:330)
at org.apache.spark.SparkEnv$.createDriverEnv(SparkEnv.scala:175)
at org.apache.spark.SparkContext.createSparkEnv(SparkContext.scala:256)
at org.apache.spark.SparkContext.<init>(SparkContext.scala:423)
at zipkin2.dependencies.cassandra3.CassandraDependenciesJob.run(CassandraDependenciesJob.java:181)
at zipkin2.dependencies.ZipkinDependenciesJob.main(ZipkinDependenciesJob.java:57)
Exception in thread "main" java.lang.IllegalArgumentException: System memory 466288640 must be at least 471859200. Please increase heap size using the --driver-memory option or spark.driver.memory in Spark configuration.
at org.apache.spark.memory.UnifiedMemoryManager$.getMaxMemory(UnifiedMemoryManager.scala:217)
at org.apache.spark.memory.UnifiedMemoryManager$.apply(UnifiedMemoryManager.scala:199)
at org.apache.spark.SparkEnv$.create(SparkEnv.scala:330)
at org.apache.spark.SparkEnv$.createDriverEnv(SparkEnv.scala:175)
at org.apache.spark.SparkContext.createSparkEnv(SparkContext.scala:256)
at org.apache.spark.SparkContext.<init>(SparkContext.scala:423)
at zipkin2.dependencies.cassandra3.CassandraDependenciesJob.run(CassandraDependenciesJob.java:181)
at zipkin2.dependencies.ZipkinDependenciesJob.main(ZipkinDependenciesJob.java:57)
意思是系統記憶體太小了。。。渣渣。
搜尋到相關連結,如下:
Zipkin 使用api呼叫沒有資料 Zipkin api traces為空
Zinkin進階篇-Zipkin-dependencies的應用
ERROR SparkContext: Error initializing SparkContext.
System memory..must be at least ... Please use a larger heap
裡面似乎有個有用的答案
您可以通過編輯“
{SPARK_HOME} / conf /”,但是有一個檔案“spark-defaults.conf.template”,您可以使用以下命令建立“spark-defaults.conf”檔案:
cp spark-defaults.conf.template spark-defaults.conf
然後,編輯它:
# Example:
# spark.master spark://master:7077
# spark.eventLog.enabled true
# spark.eventLog.dir hdfs://namenode:8021/directory
# spark.serializer org.apache.spark.serializer.KryoSerializer
# spark.driver.memory 5g
# spark.executor.extraJavaOptions -XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three"
spark.driver.memory
但我沒查到SPARK_HOME的環境變數。
繼續調整工作重心。
java.lang.IllegalArgumentException:系統記憶體
裡面作者或網友提到:
gc是可選的JAVA_OPTS=-verbose:gc -Xms1G -Xmx1G, https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html#BABDJJFI
預設情況下,此作業解析自UTC午夜以來的所有跟蹤。您可以通過YYYY-mm-dd格式的引數解析不同日期的跟蹤,如2016-07-16。
# ex to run the job to process yesterday's traces on OS/X STORAGE_TYPE=cassandra3 java -jar zipkin-dependencies.jar `date -uv-1d +%F` # or on Linux STORAGE_TYPE=cassandra3 java -jar zipkin-dependencies.jar `date -u -d '1 day ago' +%F`
執行失敗
STORAGE_TYPE=cassandra3 java -jar zipkin-dependencies.jar `date -u -d '1 day ago' +%F` 18/09/14 20:24:50 INFO CassandraDependenciesJob: Running Dependencies job for 2018-09-13: 1536796800000000 ≤ Span.timestamp 1536883199999999 18/09/14 20:24:50 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 18/09/14 20:24:51 ERROR SparkContext: Error initializing SparkContext. java.lang.IllegalArgumentException: System memory 466288640 must be at least 471859200. Please increase heap size using the --driver-memory option or spark.driver.memory in Spark configuration. at org.apache.spark.memory.UnifiedMemoryManager$.getMaxMemory(UnifiedMemoryManager.scala:217) at org.apache.spark.memory.UnifiedMemoryManager$.apply(UnifiedMemoryManager.scala:199) at org.apache.spark.SparkEnv$.create(SparkEnv.scala:330) at org.apache.spark.SparkEnv$.createDriverEnv(SparkEnv.scala:175) at org.apache.spark.SparkContext.createSparkEnv(SparkContext.scala:256) at org.apache.spark.SparkContext.<init>(SparkContext.scala:423) at zipkin2.dependencies.cassandra3.CassandraDependenciesJob.run(CassandraDependenciesJob.java:181) at zipkin2.dependencies.ZipkinDependenciesJob.main(ZipkinDependenciesJob.java:57) Exception in thread "main" java.lang.IllegalArgumentException: System memory 466288640 must be at least 471859200. Please increase heap size using the --driver-memory option or spark.driver.memory in Spark configuration. at org.apache.spark.memory.UnifiedMemoryManager$.getMaxMemory(UnifiedMemoryManager.scala:217) at org.apache.spark.memory.UnifiedMemoryManager$.apply(UnifiedMemoryManager.scala:199) at org.apache.spark.SparkEnv$.create(SparkEnv.scala:330) at org.apache.spark.SparkEnv$.createDriverEnv(SparkEnv.scala:175) at org.apache.spark.SparkContext.createSparkEnv(SparkContext.scala:256) at org.apache.spark.SparkContext.<init>(SparkContext.scala:423) at zipkin2.dependencies.cassandra3.CassandraDependenciesJob.run(CassandraDependenciesJob.java:181) at zipkin2.dependencies.ZipkinDependenciesJob.main(ZipkinDependenciesJob.java:57)
意思是系統記憶體太小了。。。渣渣。
搜尋到相關連結,如下:
Zipkin 使用api呼叫沒有資料 Zipkin api traces為空
Zinkin進階篇-Zipkin-dependencies的應用ERROR SparkContext: Error initializing SparkContext.
System memory..must be at least ... Please use a larger heap
裡面似乎有個有用的答案
您可以通過編輯“ {SPARK_HOME} / conf /”,但是有一個檔案“spark-defaults.conf.template”,您可以使用以下命令建立“spark-defaults.conf”檔案:
cp spark-defaults.conf.template spark-defaults.conf 然後,編輯它: # Example: # spark.master spark://master:7077 # spark.eventLog.enabled true # spark.eventLog.dir hdfs://namenode:8021/directory # spark.serializer org.apache.spark.serializer.KryoSerializer # spark.driver.memory 5g # spark.executor.extraJavaOptions -XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three" spark.driver.memory
但我沒查到SPARK_HOME的環境變數。
繼續調整工作重心。
java.lang.IllegalArgumentException:系統記憶體
裡面作者或網友提到:
gc是可選的JAVA_OPTS=-verbose:gc -Xms1G -Xmx1G, https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html#BABDJJFI
JAVA_OPTS的一些介紹
360" target="_blank" rel="nofollow,noindex">Linux下vi查詢關鍵字
按照以上操作修改仍未成功。。。有某位仁兄知道處理辦法,可否告知?
罷了,罷了,不留個尾巴,怎麼能引起我的求知慾。原本只是想簡簡單單看看zipkin,卻邁向了Spark,JVM之路,留個問題待以後深思。
下篇將繼續zipkin熟悉之路,持久化mysql,還有今天未結束的主題,zipkin-dependencies
360" target="_blank" rel="nofollow,noindex">Linux下vi查詢關鍵字
按照以上操作修改仍未成功。。。有某位仁兄知道處理辦法,可否告知?
罷了,罷了,不留個尾巴,怎麼能引起我的求知慾。原本只是想簡簡單單看看zipkin,卻邁向了Spark,JVM之路,留個問題待以後深思。
下篇將繼續zipkin熟悉之路,持久化mysql,還有今天未結束的主題,zipkin-dependencies
總結
標題是.NetCore,大部分是在找java問題,我也是醉了。沒辦法用的監控是java開源的,不要抱怨,繼續研究。這應該是個小問題。這就是寫部落格擴充套件的學習範圍,原本不在我的計劃之類。堅持就有收穫,至少我現在知道了Spark的一些介紹,jvm的一些引數。
感謝觀看,本篇結束。