-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathatom.xml
420 lines (233 loc) · 35.1 KB
/
atom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>Liam's Blog</title>
<subtitle>Hi there, 2023!</subtitle>
<link href="https://liam-blog.ml/atom.xml" rel="self"/>
<link href="https://liam-blog.ml/"/>
<updated>2022-12-03T09:20:44.762Z</updated>
<id>https://liam-blog.ml/</id>
<author>
<name>Liam</name>
</author>
<generator uri="https://hexo.io/">Hexo</generator>
<entry>
<title>Extend Spark Data Source with DataFrame</title>
<link href="https://liam-blog.ml/2022/04/25/Extend-Spark-Data-Source/"/>
<id>https://liam-blog.ml/2022/04/25/Extend-Spark-Data-Source/</id>
<published>2022-04-25T14:39:17.000Z</published>
<updated>2022-12-03T09:20:44.762Z</updated>
<summary type="html"><p>In this article, we’ll implement a spark data source for reading and writing a Google spreadsheet, so that you’ll know how to extend the data source of Spark by yourself.</p>
<h2 id="What’s-a-customized-data-source-like"><a href="#What’s-a-customized-data-source-like" class="headerlink" title="What’s a customized data source like?"></a>What’s a customized data source like?</h2><h3 id="read-data-from-Google-Spreadsheet-into-a-DataFrame"><a href="#read-data-from-Google-Spreadsheet-into-a-DataFrame" class="headerlink" title="read data from Google Spreadsheet into a DataFrame"></a>read data from Google Spreadsheet into a DataFrame</h3><figure class="highlight scala"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">val</span> data = spark.read.format(<span class="string">&quot;google-spreadsheet&quot;</span>)</span><br><span class="line"> .option(<span class="string">&quot;credentialsPath&quot;</span>, credentialFile)</span><br><span class="line"> .option(<span class="string">&quot;spreadsheetId&quot;</span>, spreadsheetId)</span><br><span class="line"> .option(<span class="string">&quot;sheetName&quot;</span>, sheetName1)</span><br><span class="line"> .load()</span><br></pre></td></tr></table></figure>
<h3 id="write-data-of-a-DataFrame-into-Google-Spreadsheet"><a href="#write-data-of-a-DataFrame-into-Google-Spreadsheet" class="headerlink" title="write data of a DataFrame into Google Spreadsheet"></a>write data of a DataFrame into Google Spreadsheet</h3><figure class="highlight scala"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">df.write.format(<span class="string">&quot;google-spreadsheet&quot;</span>)</span><br><span class="line"> .option(<span class="string">&quot;credentialsPath&quot;</span>, credentialFile)</span><br><span class="line"> .option(<span class="string">&quot;spreadsheetId&quot;</span>, spreadsheetId)</span><br><span class="line"> .option(<span class="string">&quot;sheetName&quot;</span>, sheetName)</span><br><span class="line"> .mode(<span class="type">SaveMode</span>.<span class="type">Overwrite</span>)</span><br><span class="line"> .save()</span><br></pre></td></tr></table></figure></summary>
<category term="Spark" scheme="https://liam-blog.ml/tags/Spark/"/>
</entry>
<entry>
<title>How to solve dependency conflicts with Maven</title>
<link href="https://liam-blog.ml/2021/09/24/How-to-solve-dependency-conflicts-with-Maven/"/>
<id>https://liam-blog.ml/2021/09/24/How-to-solve-dependency-conflicts-with-Maven/</id>
<published>2021-09-24T12:25:25.000Z</published>
<updated>2022-12-03T09:20:44.743Z</updated>
<summary type="html"><h2 id="What-are-dependency-conflicts"><a href="#What-are-dependency-conflicts" class="headerlink" title="What are dependency conflicts?"></a>What are dependency conflicts?</h2><p>Here is an example, this project has 2 dependencies, and both of them depend on the Guava library with different versions.</p>
<figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- Project dependencies --&gt;</span></span><br><span class="line"> <span class="tag">&lt;<span class="name">dependencies</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>org.example<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>study-maven-2<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;<span class="name">version</span>&gt;</span>1.0-SNAPSHOT<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>org.example<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>study-maven-3<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;<span class="name">version</span>&gt;</span>1.0-SNAPSHOT<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;/<span class="name">dependencies</span>&gt;</span></span><br></pre></td></tr></table></figure>
<figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">groupId</span>&gt;</span>org.example<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>study-maven-2<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;<span class="name">version</span>&gt;</span>1.0-SNAPSHOT<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line"></span><br><span class="line"> <span class="tag">&lt;<span class="name">dependencies</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>com.google.guava<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>guava<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;<span class="name">version</span>&gt;</span>30.1.1-jre<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;/<span class="name">dependencies</span>&gt;</span></span><br></pre></td></tr></table></figure>
<figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">groupId</span>&gt;</span>org.example<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>study-maven-3<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;<span class="name">version</span>&gt;</span>1.0-SNAPSHOT<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line"></span><br><span class="line"> <span class="tag">&lt;<span class="name">dependencies</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>com.google.guava<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>guava<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;<span class="name">version</span>&gt;</span>29.0-jre<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;/<span class="name">dependencies</span>&gt;</span></span><br></pre></td></tr></table></figure>
<p>As you all know, we can’t have two classes with the same package and name in one project. So there would be conflicts if different versions of a package are imported. Obviously, in this case, only one version of Guava will be imported.</p></summary>
<category term="Maven" scheme="https://liam-blog.ml/tags/Maven/"/>
</entry>
<entry>
<title>Kafka Fundamental Concepts</title>
<link href="https://liam-blog.ml/2021/05/08/Kafka-Fundamental-Concepts/"/>
<id>https://liam-blog.ml/2021/05/08/Kafka-Fundamental-Concepts/</id>
<published>2021-05-08T09:16:13.000Z</published>
<updated>2022-12-03T09:20:44.725Z</updated>
<summary type="html"><h1 id="What-is-Kafka"><a href="#What-is-Kafka" class="headerlink" title="What is Kafka?"></a>What is Kafka?</h1><blockquote>
<p><a href="https://www.confluent.io/what-is-apache-kafka/">Apache Kafka</a> is an event streaming platform used to collect, process, store, and integrate data at scale. It has numerous use cases including distributed logging, stream processing, data integration, and pub&#x2F;sub messaging.</p>
</blockquote></summary>
<category term="Kafka" scheme="https://liam-blog.ml/tags/Kafka/"/>
</entry>
<entry>
<title>Details you need to know about Apache Parquet</title>
<link href="https://liam-blog.ml/2020/05/31/details-you-need-to-know-about-Apache-Parquet/"/>
<id>https://liam-blog.ml/2020/05/31/details-you-need-to-know-about-Apache-Parquet/</id>
<published>2020-05-31T04:25:42.000Z</published>
<updated>2022-12-03T09:20:44.703Z</updated>
<summary type="html"><p>Parquet is a columnar file format that supports nested data. Lots of data systems support this data format because of it’s great advantage of performance.</p></summary>
<category term="Spark" scheme="https://liam-blog.ml/tags/Spark/"/>
<category term="Apache Parquet" scheme="https://liam-blog.ml/tags/Apache-Parquet/"/>
</entry>
<entry>
<title>基于Redis实现分布式锁和分布式限流器</title>
<link href="https://liam-blog.ml/2020/03/29/redis-lock-rate-limiter/"/>
<id>https://liam-blog.ml/2020/03/29/redis-lock-rate-limiter/</id>
<published>2020-03-29T04:37:12.000Z</published>
<updated>2022-12-03T09:20:44.686Z</updated>
<summary type="html"><p>分布式锁和分布式限流器应该是算是比较常见的需求了,而Redis现在几乎是应用的标配了,于是很多人会倾向于选择基于Redis来实现,因为不需要引入额外的依赖。</p>
<p>分布式锁和分布式限流器在Java领域比较成熟和常用的开源实现是Redisson(<a href="https://github.com/redisson/redisson/wiki/Redisson%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D">中文官方介绍</a>),下面从它的极小部分源码,分析下分布式锁和分布式限流器的实现逻辑。</p></summary>
<category term="redis" scheme="https://liam-blog.ml/tags/redis/"/>
<category term="lock" scheme="https://liam-blog.ml/tags/lock/"/>
<category term="rate limiter" scheme="https://liam-blog.ml/tags/rate-limiter/"/>
</entry>
<entry>
<title>Spark Core 解析 4:内存模型</title>
<link href="https://liam-blog.ml/2020/02/29/spark-core-memory/"/>
<id>https://liam-blog.ml/2020/02/29/spark-core-memory/</id>
<published>2020-02-29T15:20:38.000Z</published>
<updated>2022-12-03T09:20:44.674Z</updated>
<summary type="html"><h2 id="Spark内存模型"><a href="#Spark内存模型" class="headerlink" title="Spark内存模型"></a>Spark内存模型</h2><p>Spark之所以快,很大程度上是因为它善于利用内存,大量利用内存进行存储和计算,从而减少磁盘IO,提升执行效率。</p>
<p>从1.6版本开始,Spark引入了统一内存管理模型(之前版本只有静态内存管理,这里不细说),找到两张图描述的很清楚:</p></summary>
<category term="Spark" scheme="https://liam-blog.ml/tags/Spark/"/>
<category term="Spark Core" scheme="https://liam-blog.ml/tags/Spark-Core/"/>
<category term="memory" scheme="https://liam-blog.ml/tags/memory/"/>
</entry>
<entry>
<title>Spark Core 解析 3:Shuffle</title>
<link href="https://liam-blog.ml/2019/12/29/spark-core-shuffle/"/>
<id>https://liam-blog.ml/2019/12/29/spark-core-shuffle/</id>
<published>2019-12-29T03:42:44.000Z</published>
<updated>2022-12-03T09:20:44.658Z</updated>
<summary type="html"><h2 id="Overview"><a href="#Overview" class="headerlink" title="Overview"></a>Overview</h2><p>所谓shuffle就是将数据按新的规则进行分区的过程,将数据分区从旧分区转变成新分区。</p>
<p><img src="https://raw.githubusercontent.com/Liam8/img/master/blog/20191229115009.png" alt="20191229115009.png"></p></summary>
<category term="Spark" scheme="https://liam-blog.ml/tags/Spark/"/>
<category term="Spark Core" scheme="https://liam-blog.ml/tags/Spark-Core/"/>
<category term="shuffle" scheme="https://liam-blog.ml/tags/shuffle/"/>
</entry>
<entry>
<title>Spark Core解析 2:Scheduler 调度体系</title>
<link href="https://liam-blog.ml/2019/11/07/spark-core-scheduler/"/>
<id>https://liam-blog.ml/2019/11/07/spark-core-scheduler/</id>
<published>2019-11-07T14:50:27.000Z</published>
<updated>2022-12-03T09:20:44.598Z</updated>
<summary type="html"><h2 id="Overview"><a href="#Overview" class="headerlink" title="Overview"></a>Overview</h2><p>调度系统,是贯穿整个Spark应用的主心骨,从调度系统开始入手了解Spark Core,比较容易理清头绪。</p>
<p>Spark的资源调度采用的是常见的两层调度,底层资源的管理和分配是第一层调度,交给YARN、Mesos或者Spark的Standalone集群处理,Application从第一层调度拿到资源后,还要进行内部的任务和资源调度,将任务和资源进行匹配,这是第二层调度,<strong>本文讲的就是这第二层调度</strong>。</p>
<p>Spark的调度体系涉及的任务包括3个粒度,分别是Job、Stage、Task。<br>Job代表用户提交的一系列操作的总体,一个具体的计算任务,有明确的输入输出,一个Job由多个Stage组成;<br>一个Stage代表Job计算流程的一个组成部分,一个阶段,包含多个Task;<br>一个Task代表对一个分区的数据进行计算的具体任务。</p>
<p>层级关系:Job &gt; Stage &gt; Task</p></summary>
<category term="Spark" scheme="https://liam-blog.ml/tags/Spark/"/>
<category term="Spark Core" scheme="https://liam-blog.ml/tags/Spark-Core/"/>
<category term="Scheduler" scheme="https://liam-blog.ml/tags/Scheduler/"/>
</entry>
<entry>
<title>Spark Core解析 1:RDD 弹性分布式数据集</title>
<link href="https://liam-blog.ml/2019/10/23/spark-core-rdd/"/>
<id>https://liam-blog.ml/2019/10/23/spark-core-rdd/</id>
<published>2019-10-23T15:25:37.000Z</published>
<updated>2022-12-03T09:20:44.583Z</updated>
<summary type="html"><h1 id="引言"><a href="#引言" class="headerlink" title="引言"></a>引言</h1><p>Spark Core是Spark的核心部分,是Spark SQL,Spark Streaming,Spark MLlib等等其他模块的基础, Spark Core提供了开发分布式应用的脚手架,使得其他模块或应用的开发者不必关心复杂的分布式计算如何实现,只需使用Spark Core提供的分布式数据结构RDD及丰富的算子API,以类似开发单机应用的方式来进行开发。</p>
<p><img src="https://raw.githubusercontent.com/Liam8/img/master/blog/spark.png" alt="spark.png"></p>
<p>图中最下面那个就是Spark Core啦,日常使用的RDD相关的API就属于Spark Core,而Dataset、DataFrame则属于Spark SQL。</p></summary>
<category term="Spark" scheme="https://liam-blog.ml/tags/Spark/"/>
<category term="Spark Core" scheme="https://liam-blog.ml/tags/Spark-Core/"/>
</entry>
<entry>
<title>Scala implicit 隐式转换安全驾驶指南</title>
<link href="https://liam-blog.ml/2019/09/28/scala-implicit/"/>
<id>https://liam-blog.ml/2019/09/28/scala-implicit/</id>
<published>2019-09-28T14:32:17.000Z</published>
<updated>2022-12-03T09:20:44.567Z</updated>
<summary type="html"><p>这篇短文将结合实例对隐式转换的各种场景进行解释和总结,希望看完的人能够安全驶过隐式转换这个大坑。</p></summary>
<category term="Scala" scheme="https://liam-blog.ml/tags/Scala/"/>
</entry>
<entry>
<title>Scala并发编程实战 5:Executor线程池</title>
<link href="https://liam-blog.ml/2019/09/22/Scala-Concurrency-Executor/"/>
<id>https://liam-blog.ml/2019/09/22/Scala-Concurrency-Executor/</id>
<published>2019-09-22T14:38:29.000Z</published>
<updated>2022-12-03T09:20:44.552Z</updated>
<summary type="html"><p>创建线程是一个重量级操作,因为需要调用操作系统内核的API,所以最好不要频繁的创建和销毁线程,为了能够复用创建的线程,常用的办法的就是创建线程池。</p></summary>
<category term="Scala" scheme="https://liam-blog.ml/tags/Scala/"/>
<category term="并发" scheme="https://liam-blog.ml/tags/%E5%B9%B6%E5%8F%91/"/>
</entry>
<entry>
<title>Scala并发编程实战 4:Semaphore 信号量模型</title>
<link href="https://liam-blog.ml/2019/08/26/Scala-Concurrency-Semaphore/"/>
<id>https://liam-blog.ml/2019/08/26/Scala-Concurrency-Semaphore/</id>
<published>2019-08-26T14:28:15.000Z</published>
<updated>2022-12-03T09:20:44.539Z</updated>
<summary type="html"><p>Semaphore信号量模型,是一种通过维护计数器数值来控制并发数量的模型,Lock实现的互斥锁只允许一个线程访问临界区,而Semaphore允许有限多个线程访问临界区。</p>
<p>什么情况需要允许多个线程同时访问?最常见的需求就是池化资源,连接池、线程池、对象池等等。</p></summary>
<category term="Scala" scheme="https://liam-blog.ml/tags/Scala/"/>
<category term="并发" scheme="https://liam-blog.ml/tags/%E5%B9%B6%E5%8F%91/"/>
</entry>
<entry>
<title>Scala并发编程实战 3:Condition 条件变量</title>
<link href="https://liam-blog.ml/2019/08/03/Scala-Concurrency-in-Practice-3/"/>
<id>https://liam-blog.ml/2019/08/03/Scala-Concurrency-in-Practice-3/</id>
<published>2019-08-03T14:00:45.000Z</published>
<updated>2022-12-03T09:20:44.524Z</updated>
<summary type="html"><p>在<a href="/2019/07/21/Scala-Concurrency-in-Practice-2/">Scala并发编程实战:Lock 锁</a>中我们了解到如何通过Lock来实现互斥操作,但是获取锁之后,如果发现条件不满足(如消费一个队列中的数据时,发现队列为空),线程要如何等待条件满足(如队列不为空)并让出锁呢?这需要用到Condition条件变量,又称作条件队列。</p></summary>
<category term="Scala" scheme="https://liam-blog.ml/tags/Scala/"/>
<category term="并发" scheme="https://liam-blog.ml/tags/%E5%B9%B6%E5%8F%91/"/>
</entry>
<entry>
<title>Scala并发编程实战 2:Lock 锁</title>
<link href="https://liam-blog.ml/2019/07/21/Scala-Concurrency-in-Practice-2/"/>
<id>https://liam-blog.ml/2019/07/21/Scala-Concurrency-in-Practice-2/</id>
<published>2019-07-21T02:04:21.000Z</published>
<updated>2022-12-03T09:20:44.510Z</updated>
<summary type="html"><p>synchronized作为内置锁,使用简单,不易出错,然鹅确有相当的局限性,例如,无法从等待获取锁的阻塞中中断,无法设置获取锁的超时。<br>所以JUC提供了另一种更灵活的加锁方式,即Lock。</p></summary>
<category term="Scala" scheme="https://liam-blog.ml/tags/Scala/"/>
<category term="并发" scheme="https://liam-blog.ml/tags/%E5%B9%B6%E5%8F%91/"/>
</entry>
<entry>
<title>Scala并发编程实战 1:Monitor与synchronized</title>
<link href="https://liam-blog.ml/2019/07/14/Scala-Concurrency-in-Practice-1/"/>
<id>https://liam-blog.ml/2019/07/14/Scala-Concurrency-in-Practice-1/</id>
<published>2019-07-14T10:15:48.000Z</published>
<updated>2022-12-03T09:20:44.494Z</updated>
<summary type="html"><p>Java并发编程最常用和易用的技术莫过于synchronized关键字,而Scala的并发编程之旅也可以从synchronized开始。而synchronized的背后其实是monitor技术。</p></summary>
<category term="Scala" scheme="https://liam-blog.ml/tags/Scala/"/>
<category term="并发" scheme="https://liam-blog.ml/tags/%E5%B9%B6%E5%8F%91/"/>
</entry>
<entry>
<title>Maven用户都应该知道的一些事:关于依赖的常见问题</title>
<link href="https://liam-blog.ml/2019/06/20/maven-details-about-dependency/"/>
<id>https://liam-blog.ml/2019/06/20/maven-details-about-dependency/</id>
<published>2019-06-20T12:15:59.000Z</published>
<updated>2022-12-03T09:20:44.473Z</updated>
<summary type="html"><h1 id="依赖范围-scope-不同选项的区别"><a href="#依赖范围-scope-不同选项的区别" class="headerlink" title="依赖范围(scope)不同选项的区别"></a>依赖范围(scope)不同选项的区别</h1><p>依赖范围参数的作用是控制依赖在不同阶段与classpath的关系,具体区别如下图所示。</p></summary>
<category term="Maven" scheme="https://liam-blog.ml/tags/Maven/"/>
</entry>
<entry>
<title>Maven用户都应该知道的一些事:构建生命周期和插件</title>
<link href="https://liam-blog.ml/2019/06/16/maven-lifecycle-and-plugin-goal/"/>
<id>https://liam-blog.ml/2019/06/16/maven-lifecycle-and-plugin-goal/</id>
<published>2019-06-16T09:11:31.000Z</published>
<updated>2022-12-03T09:20:44.451Z</updated>
<summary type="html"><p><strong>Maven的所有实际操作都是由插件完成的,如果没有插件,Maven什么都不会干。</strong><br>(即时你没有在POM中配置<code>&lt;plugin&gt;</code>元素,Super POM中也已经帮你引入了若干核心插件)</p>
<p>那么问题来了,项目构建过程中,Maven是怎么知道应该在什么时候调用哪个插件的呢?</p>
<p>插件的调用时机,跟’生命周期’和’插件目标’有很大关系。</p></summary>
<category term="Maven" scheme="https://liam-blog.ml/tags/Maven/"/>
</entry>
<entry>
<title>Hive窗口函数实战</title>
<link href="https://liam-blog.ml/2019/02/20/hive-window-sql/"/>
<id>https://liam-blog.ml/2019/02/20/hive-window-sql/</id>
<published>2019-02-20T14:43:20.000Z</published>
<updated>2022-12-03T09:20:44.434Z</updated>
<summary type="html"><p>本文将介绍使用Hive强大的窗口函数,解决实际问题的方法,仅供参考。</p></summary>
<category term="hive" scheme="https://liam-blog.ml/tags/hive/"/>
<category term="sql" scheme="https://liam-blog.ml/tags/sql/"/>
</entry>
<entry>
<title>[读书笔记] 黑客与画家</title>
<link href="https://liam-blog.ml/2019/01/19/Hackers-and-Painters-note/"/>
<id>https://liam-blog.ml/2019/01/19/Hackers-and-Painters-note/</id>
<published>2019-01-19T03:36:04.000Z</published>
<updated>2022-12-03T09:20:44.422Z</updated>
<summary type="html"><h1 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h1><p>《黑客与画家》是硅谷创业之父Paul Graham的文集,这里的黑客指的是优秀的软件工程师,作者将黑客与画家作比较,认为与黑客最接近的职业是画家,这便是这本书书名的由来了。<br>Paul Graham在1995年创办了Viaweb,帮助个人用户方便的开设网上商店,1998年以5千万美元的价格卖给Yahoo公司。<br>2005年他创建了风投公司YC,被称为全世界最牛的创业孵化器,YC帮助了大量的创业公司(到2018年投资了1450家公司),比较成功的案例有:Airbnb,Stripe,Dropbox,Docker,GitLab等等。</p>
<p>这本书中包含了作者对黑客精神,创业,互联网,社会,编程语言的诸多观点,读完让人感觉受益匪浅,甚至会有创业的冲动,哈哈。</p>
<blockquote>
<p>以下是对这本书内容的一些摘抄。</p>
</blockquote></summary>
<category term="book" scheme="https://liam-blog.ml/tags/book/"/>
</entry>
<entry>
<title>Spark 2.x读写MySQL</title>
<link href="https://liam-blog.ml/2018/12/25/spark-work-with-mysql-cn/"/>
<id>https://liam-blog.ml/2018/12/25/spark-work-with-mysql-cn/</id>
<published>2018-12-25T15:42:05.000Z</published>
<updated>2022-12-03T09:20:44.410Z</updated>
<summary type="html"><h1 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h1><p>从 spark 2.0 开始,我们可以使用DataFrameReader 和 DataFrameWriter来读写MySQL。</p></summary>
<category term="Spark" scheme="https://liam-blog.ml/tags/Spark/"/>
<category term="MySQL" scheme="https://liam-blog.ml/tags/MySQL/"/>
</entry>
</feed>