Skip to content

Commit

Permalink
Merge branch 'master' into master
Browse files Browse the repository at this point in the history
  • Loading branch information
Vonng authored Oct 23, 2020
2 parents 08f299d + b1a76af commit eb514ff
Show file tree
Hide file tree
Showing 28 changed files with 11,122 additions and 9 deletions.
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
- Gitbook地址:[ddia-cn](https://www.gitbook.com/book/vonng/ddia-cn)
- 使用[Typora](https://www.typora.io)或Gitbook以获取最佳阅读体验。

* [繁體中文版本](zh-tw/README.md)



Expand Down Expand Up @@ -89,6 +90,7 @@
3. [第六章部分校正](https://github.com/Vonng/ddia/commit/d4eb0852c0ec1e93c8aacc496c80b915bb1e6d48)[第10章的初翻](https://github.com/Vonng/ddia/commit/9de8dbd1bfe6fbb03b3bf6c1a1aa2291aed2490e) by @[MuAlex](https://github.com/Vonng/ddia/commits?author=MuAlex)
4. 第一部分前言,ch2校正 by @jiajiadebug
5. 词汇表、后记关于野猪的部分 by @[Chowss](https://github.com/Vonng/ddia/commits?author=Chowss)
6. 感謝[@afunTW](https://github.com/afunTW)提供繁體中文的版本

https://github.com/Vonng/ddia/pulls)

Expand Down
13 changes: 13 additions & 0 deletions bin/Pipfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
opencc = "*"
click = "*"

[dev-packages]

[requires]
python_version = "3.6"
36 changes: 36 additions & 0 deletions bin/Pipfile.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

63 changes: 63 additions & 0 deletions bin/translate.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
"""Convert zh-cn to zh-tw
Refer to https://github.com/BYVoid/OpenCC
"""
import click
import opencc

from pathlib import Path
from pprint import pprint


@click.group()
def cli():
pass


def convert(infile: str, outfile: str, cfg: str):
"""read >> convert >> write file
Args:
infile (str): input file
outfile (str): output file
cfg (str): config
"""
converter = opencc.OpenCC(cfg)
with open(infile, "r") as inf, open(outfile, "w+") as outf:
data = inf.readlines()
data = list(map(converter.convert, data))
outf.writelines(data)
print(f"Convert to {outfile}")


@cli.command()
@click.option("-i", "--input", "infile", required=True)
@click.option("-o", "--output", "outfile", required=True)
@click.option("-c", "--config", "cfg", required=True, default="s2twp.json")
def file(infile: str, outfile: str, cfg: str):
"""read >> convert >> write file
Args:
infile (str): input file
outfile (str): output file
cfg (str): config
"""
convert(infile, outfile, cfg)


@cli.command()
@click.option("-i", "--input", "infolder", required=True)
@click.option("-o", "--output", "outfolder", required=True)
@click.option("-c", "--config", "cfg", required=True, default="s2twp.json")
def repo(infolder, outfolder, cfg):
if not Path(outfolder).exists():
Path(outfolder).mkdir(parents=True)
print(f"Create {outfolder}")
infiles = Path(infolder).resolve().glob("*.md")
pair = [
{"infile": str(infile), "outfile": str(Path(outfolder).resolve() / infile.name)}
for idx, infile in enumerate(infiles)
]
for p in pair:
convert(p["infile"], p["outfile"], cfg)


if __name__ == "__main__":
cli()
10 changes: 5 additions & 5 deletions ch10.md
Original file line number Diff line number Diff line change
Expand Up @@ -281,7 +281,7 @@ top5.each{|count, url| puts "#{count} #{url}" } # 5

​ Hadoop的各种高级工具(如Pig 【30】,Hive 【31】,Cascading 【32】,Crunch 【33】和FlumeJava 【34】)也能自动布线组装多个MapReduce阶段,生成合适的工作流。

### Reduce端连接与分组
### Reduce侧连接与分组

​ 我们在[第2章](ch2.md)中讨论了数据模型和查询语言的联接,但是我们还没有深入探讨连接是如何实现的。现在是我们再次捡起这条线索的时候了。

Expand Down Expand Up @@ -363,7 +363,7 @@ top5.each{|count, url| puts "#{count} #{url}" } # 5



### Map端连接
### Map侧连接

​ 上一节描述的连接算法在Reducer中执行实际的连接逻辑,因此被称为Reduce端连接。Mapper扮演着预处理输入数据的角色:从每个输入记录中提取键值,将键值对分配给Reducer分区,并按键排序。

Expand Down Expand Up @@ -395,13 +395,13 @@ top5.each{|count, url| puts "#{count} #{url}" } # 5

​ 分区散列连接在Hive中称为**Map端桶连接(bucketed map joins)【37】**

#### Map端合并连接
#### Map侧合并连接

​ 如果输入数据集不仅以相同的方式进行分区,而且还基于相同的键进行**排序**,则可适用另一种Map端联接的变体。在这种情况下,输入是否小到能放入内存并不重要,因为这时候Mapper同样可以执行归并操作(通常由Reducer执行)的归并操作:按键递增的顺序依次读取两个输入文件,将具有相同键的记录配对。

​ 如果能进行Map端合并连接,这通常意味着前一个MapReduce作业可能一开始就已经把输入数据做了分区并进行了排序。原则上这个连接就可以在前一个作业的Reduce阶段进行。但使用独立的仅Map作业有时也是合适的,例如,分好区且排好序的中间数据集可能还会用于其他目的。

#### MapReduce工作流与Map端连接
#### MapReduce工作流与Map侧连接

​ 当下游作业使用MapReduce连接的输出时,选择Map端连接或Reduce端连接会影响输出的结构。Reduce端连接的输出是按照**连接键**进行分区和排序的,而Map端连接的输出则按照与较大输入相同的方式进行分区和排序(因为无论是使用分区连接还是广播连接,连接较大输入端的每个文件块都会启动一个Map任务)。

Expand Down Expand Up @@ -909,4 +909,4 @@ top5.each{|count, url| puts "#{count} #{url}" } # 5

| 上一章 | 目录 | 下一章 |
| --------------------------------- | ------------------------------- | ------------------------ |
| [第三部分:派生数据](part-iii.md) | [设计数据密集型应用](README.md) | [第十一章:流处理](ch11.md) |
| [第三部分:派生数据](part-iii.md) | [设计数据密集型应用](README.md) | [第十一章:流处理](ch11.md) |
2 changes: 1 addition & 1 deletion ch3.md
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ $ cat database

#### 用SSTables制作LSM树

这里描述的算法本质上是LevelDB 【6】和RocksDB 【7】中使用的关键值存储引擎库,被设计嵌入到其他应用程序中。除此之外,LevelDB可以在Riak中用作Bitcask的替代品。在Cassandra和HBase中使用了类似的存储引擎【8】,这两种引擎都受到了Google的Bigtable论文【9】(引入了SSTable和memtable)的启发。
这里描述的算法本质上是LevelDB 【6】和RocksDB 【7】中使用的键值存储引擎库,被设计嵌入到其他应用程序中。除此之外,LevelDB可以在Riak中用作Bitcask的替代品。在Cassandra和HBase中使用了类似的存储引擎【8】,这两种引擎都受到了Google的Bigtable文档【9】(引入了SSTable和memtable)的启发。

最初这种索引结构是由Patrick O'Neil等人描述的。在日志结构合并树(或LSM树)【10】的基础上,建立在以前的工作上日志结构的文件系统【11】。基于这种合并和压缩排序文件原理的存储引擎通常被称为LSM存储引擎。

Expand Down
2 changes: 1 addition & 1 deletion ch7.md
Original file line number Diff line number Diff line change
Expand Up @@ -290,7 +290,7 @@ SELECT COUNT(*)FROM emails WHERE recipient_id = 2 AND unread_flag = true

### 快照隔离和可重复读

如果只从表面上看读已提交隔离级别你就认为它完成了事务所需的一切,那是可以原谅的。它允许**中止**(原子性的要求);它防止读取不完整的事务结果,并且防止并发写入造成的混合。事实上这些功能非常有用,比起没有事务的系统来,可以提供更多的保证。
如果只从表面上看读已提交隔离级别你就认为它完成了事务所需的一切,那是可以原谅的。它允许**中止**(原子性的要求);它防止读取不完整的事务结果,并且防止并发写入造成的混乱。事实上这些功能非常有用,比起没有事务的系统来,可以提供更多的保证。

但是在使用此隔离级别时,仍然有很多地方可能会产生并发错误。例如[图7-6](img/fig7-6.png)说明了读已提交时可能发生的问题。

Expand Down
4 changes: 2 additions & 2 deletions ch9.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

​ 现在我们将继续沿着同样的路线前进,寻求可以让应用忽略分布式系统部分问题的抽象概念。例如,分布式系统最重要的抽象之一就是**共识(consensus)****就是让所有的节点对某件事达成一致**。正如我们在本章中将会看到的那样,尽管存在网络故障和流程故障,可靠地达成共识是一个令人惊讶的棘手问题。

​ 一旦达成共识,应用可以将其用于各种目的。例如,假设你有一个单主复制的数据库。如果领导者挂掉,并且需要故障切换到另一个节点,剩余的数据库节点可以使用共识来选举新的领导者。正如在“[处理节点宕机](ch5.md#处理节点宕机)”中所讨论的那样,重要的是只有一个领导者,且所有的节点都认同其领导。如果两个节点都认为自己是领导者,这种情况被称为**脑裂(split brain)**,且经常导致数据丢失。正确实现共识有助于避免这种问题。
​ 一旦达成共识,应用可以将其用于各种目的。例如,假设你有一个单主复制的数据库。如果主库挂掉,并且需要故障切换到另一个节点,剩余的数据库节点可以使用共识来选举新的领导者。正如在“[处理节点宕机](ch5.md#处理节点宕机)”中所讨论的那样,重要的是只有一个领导者,且所有的节点都认同其领导。如果两个节点都认为自己是领导者,这种情况被称为**脑裂(split brain)**,且经常导致数据丢失。正确实现共识有助于避免这种问题。

​ 在本章后面的“[分布式事务和共识](#分布式事务和共识)”中,我们将研究解决共识和相关问题的算法。但首先,我们首先需要探索可以在分布式系统中提供的保证和抽象的范围。

Expand Down Expand Up @@ -73,7 +73,7 @@
​ 线性一致性背后的基本思想很简单:使系统看起来好像只有一个数据副本。然而确切来讲,实际上有更多要操心的地方。为了更好地理解线性一致性,让我们再看几个例子。

[图9-2](img/fig9-2.png) 显示了三个客户端在线性一致数据库中同时读写相同的键`x`。在分布式系统文献中,`x`被称为**寄存器(register)**,例如,它可以是键值存储中的一个****,关系数据库中的一****,或文档数据库中的一个**文档**

![](img/fig9-2.png)

**图9-2 如果读取请求与写入请求并发,则可能会返回旧值或新值**
Expand Down
100 changes: 100 additions & 0 deletions zh-tw/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
# 設計資料密集型應用 - 中文翻譯

- 作者: [Martin Kleppmann](https://martin.kleppmann.com)
- 原書名稱:[《Designing Data-Intensive Application》](http://shop.oreilly.com/product/0636920032175.do)
- 譯者:[馮若航]( http://vonng.com/about)fengruohang@outlook.com
- Gitbook地址:[ddia-cn](https://www.gitbook.com/book/vonng/ddia-cn)
- 使用[Typora](https://www.typora.io)或Gitbook以獲取最佳閱讀體驗。




## 譯序

> 不懂資料庫的全棧工程師不是好架構師
>
> —— Vonng
​ 現今,尤其是在網際網路領域,大多數應用都屬於資料密集型應用。本書從底層資料結構到頂層架構設計,將資料系統設計中的精髓娓娓道來。其中的寶貴經驗無論是對架構師,DBA、還是後端工程師、甚至產品經理都會有幫助。

​ 這是一本理論結合實踐的書,書中很多問題,譯者在實際場景中都曾遇到過,讀來讓人擊節扼腕。如果能早點讀到這本書,該少走多少彎路啊!

​ 這也是一本深入淺出的書,講述概念的來龍去脈而不是賣弄定義,介紹事物發展演化歷程而不是事實堆砌,將複雜的概念講述的淺顯易懂,但又直擊本質不失深度。每章最後的引用質量非常好,是深入學習各個主題的絕佳索引。

​ 本書為資料系統的設計、實現、與評價提供了很好的概念框架。讀完並理解本書內容後,讀者可以輕鬆看破大多數的技術忽悠,與技術磚家撕起來虎虎生風🤣。

​ 這是2017年譯者讀過最好的一本技術類書籍,這麼好的書沒有中文翻譯,實在是遺憾。某不才,願為先進技術文化的傳播貢獻一分力量。既可以深入學習有趣的技術主題,又可以鍛鍊中英文語言文字功底,何樂而不為?



## 前言

> 在我們的社會中,技術是一種強大的力量。資料、軟體、通訊可以用於壞的方面:不公平的階級固化,損害公民權利,保護既得利益集團。但也可以用於好的方面:讓底層人民發出自己的聲音,讓每個人都擁有機會,避免災難。本書獻給所有將技術用於善途的人們。
---------

> 計算是一種流行文化,流行文化鄙視歷史。 流行文化關乎個體身份和參與感,但與合作無關。流行文化活在當下,也與過去和未來無關。 我認為大部分(為了錢)編寫程式碼的人就是這樣的, 他們不知道自己的文化來自哪裡。
>
> ——阿蘭·凱接受Dobb博士的雜誌採訪時(2012年)


## 目錄

### [序言](preface.md)

### [第一部分:資料系統的基石](part-i.md)

* [第一章:可靠性、可擴充套件性、可維護性](ch1.md)
* [第二章:資料模型與查詢語言](ch2.md)
* [第三章:儲存與檢索](ch3.md)
* [第四章:編碼與演化](ch4.md)

### [第二部分:分散式資料](part-ii.md)

* [第五章:複製](ch5.md)
* [第六章:分割槽](ch6.md)
* [第七章:事務](ch7.md)
* [第八章:分散式系統的麻煩](ch8.md)
* [第九章:一致性與共識](ch9.md)

### [第三部分:衍生資料](part-iii.md)

* [第十章:批處理](ch10.md)
* [第十一章:流處理](ch11.md)
* [第十二章:資料系統的未來](ch12.md)

### [術語表](glossary.md)

### [後記](colophon.md)



## 法律宣告

從原作者處得知,已經有簡體中文的翻譯計劃,將於2018年末完成。

譯者純粹出於**學習目的****個人興趣**翻譯本書,不追求任何經濟利益。

譯者保留對此版本譯文的署名權,其他權利以原作者和出版社的主張為準。

本譯文只供學習研究參考之用,不得公開傳播發行或用於商業用途。有能力閱讀英文書籍者請購買正版支援。



## CONTRIBUTION

1. [序言初翻修正](https://github.com/Vonng/ddia/commit/afb5edab55c62ed23474149f229677e3b42dfc2c) by [@seagullbird](https://github.com/Vonng/ddia/commits?author=seagullbird)
2. [第一章語法標點校正](https://github.com/Vonng/ddia/commit/973b12cd8f8fcdf4852f1eb1649ddd9d187e3644) by [@nevertiree](https://github.com/Vonng/ddia/commits?author=nevertiree)
3. [第六章部分校正](https://github.com/Vonng/ddia/commit/d4eb0852c0ec1e93c8aacc496c80b915bb1e6d48)[第10章的初翻](https://github.com/Vonng/ddia/commit/9de8dbd1bfe6fbb03b3bf6c1a1aa2291aed2490e) by @[MuAlex](https://github.com/Vonng/ddia/commits?author=MuAlex)
4. 第一部分前言,ch2校正 by @jiajiadebug
5. 詞彙表、後記關於野豬的部分 by @[Chowss](https://github.com/Vonng/ddia/commits?author=Chowss)
6. 簡體與繁體中文轉換工具 by [@afunTW](https://github.com/afunTW) using [OpenCC](https://github.com/BYVoid/OpenCC)

感謝所有作出貢獻,提出意見的朋友們:[Issues](https://github.com/Vonng/ddia/issues)[Pull Requests](https://github.com/Vonng/ddia/pulls)



## LICENSE

CC-BY 4.0
23 changes: 23 additions & 0 deletions zh-tw/SUMMARY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Summary

* [簡介](README.md)
* [序言](preface.md)
* [第一部分:資料系統的基石](part-i.md)
* [第一章:可靠性、可擴充套件性、可維護性](ch1.md)
* [第二章:資料模型與查詢語言](ch2.md)
* [第三章:儲存與檢索](ch3.md)
* [第四章:編碼與演化](ch4.md)
* [第二部分:分散式資料](part-ii.md)
* [第五章:複製](ch5.md)
* [第六章:分割槽](ch6.md)
* [第七章:事務](ch7.md)
* [第八章:分散式系統的麻煩](ch8.md)
* [第九章:一致性與共識](ch9.md)
* [第三部分:衍生資料](part-iii.md)
* [第十章:批處理](ch10.md)
* [第十一章:流處理](ch11.md)
* [第十二章:資料系統的未來](ch12.md)
* [術語表](glossary.md)
* [後記](colophon.md)


Loading

0 comments on commit eb514ff

Please sign in to comment.