1. 程式人生 > >用 Hadoop 進行分散式資料處理,從 入門、進階到應用開發

用 Hadoop 進行分散式資料處理,從 入門、進階到應用開發

[email protected]:~# hadoop-0.20 fs -ls output
Found 2 items
drwxr-xr-x   - root supergroup          0 2010-05-12 19:04 /user/root/output/_logs
-rw-r--r--   2 root supergroup      30949 2010-05-12 19:05 /user/root/output/part-r-00000
[email protected]:~# hadoop-0.20 fs -cat output/part-r-00000 | head -13
!=	1
"Atomic	2
"Cache	2
"Control	1
"Examples	1
"Has	7
"Inter-CPU	1
"LOAD	1
"LOCK"	1
"Locking	1
"Locks	1
"MMIO	1
"Pending	5
[email protected]
:~#

儘管 hadoop-0.20 實用程式的功能極其豐富,但有時使用一個 GUI 會更方便。在執行檔案系統檢測時,您可以通過 http://master:50070 連結到名稱節點,通過 http://master:50030 連線到 jobtracker 。您可以通過名稱節點檢測 HDFS,如圖 5 所示,在這裡您檢測輸入目錄(包含輸入資料 — 見上面 清單 13)。

圖5 通過名稱節點檢測HDFS
通過名稱節點檢測 HDFS

通過 jobtracker,您可以檢測執行中或已完成的作業。在圖 6 中,您可以看到對最後一個作業的檢測(來自 清單 14)。該圖展示了作為 Java 存檔(JAR)請求的輸出發出的各種資料,以及任務的狀態和數量。注意,這裡執行了兩個對映任務(每個輸入檔案一個對映)和一個縮減任務(用於縮減兩個對映輸入)。

圖6 檢測一個已完成作業的狀態
檢查一個已完成作業的狀態

最後,您可以通過名稱節點檢查資料節點的狀態。名稱節點主頁確定活動節點和死節點(作為連結)的數量,且允許您進一步檢測它們。圖 7 所示的頁面顯示了活動資料節點以及每個節點的統計資料。

圖7 檢查活動資料節點的狀態
檢查活動資料節點的狀態

通過名稱節點和 jobtracker Web 介面,可以檢視許多其他檢視,但出於簡潔,只顯示該樣例集。在名稱節點和 jobtracker Web 頁面內,您會找到大量連結,從而引導您獲取有關 Hadoop 配置和操作的其他資訊(包括執行時日誌)。

此係列的文章 專注於單節點和多節點叢集的 Hadoop 安裝及配置。最後這篇文章探索了 Hadoop 程式設計 — 特別是在 Ruby 語言中 map 和 reduce 應用程式開發。我之所以選擇 Ruby,首先是因為,它是一個您應該知道的很棒的面向物件的指令碼語言,其次,您將在 

參考資料 部分發現很多參考,其中包括解決 Java™ 和 Python 語言的教程。通過這種 MapReduce 程式設計的探索,將向您介紹流式應用程式程式設計介面(Application Programming Interface,API)。此 API 提供方法以便在 Java 語言以外的多種語言中開發應用程式。

讓我們開始簡要介紹一下 map 和 reduce(從功能的角度考慮),然後再進一步鑽研 Hadoop 程式設計模型及其體系結構和用來雕刻、分配、管理工作的元素。

第 3 部分: 應用程式開發

maphe reduce的起源

是什麼功能性元素激發了 MapReduce 程式設計範例的創立?在 1958 年,John McCarthy 發明了名為 Lisp 的語言,其實現了數值和符號計算,但在遞迴形式下此語言非常不同於現在所使用的大多數語言。(在維基百科全書上記述著 Lisp 那段迷人的歷史,同時包括一個有用的教程 — 值得您花費時間來閱讀。)Lisp 最先是在 IBM® 704 中實現的,IBM® 704 是第一種大規模生產的計算機,也支援其他舊的語言,如 FORTRAN。

map 函式,源於功能性語言(如 Lisp)但如今在其他語言中也很常見,其中包含了一系列元素的函式的應用程式。這意味著什麼? 清單 1 通過 Scheme Shell (SCSH) 提供解釋會話,即一個 Lisp 衍生。第一行定義一個名為 square 的函式,該函式可接受引數併發出其平方根。下一行說明 map 函式的使用。如圖所示,通過 map,為已應用的函式提供您的函式和一系列元素。結果是一個包含平方元素的新列表。

清單1 SCSH上的map函式演示
> (define square (lambda (x) (* x x)))
> (map square '(1 3 5 7))
'(1 9 25 49)
>

Reduce 也適用於列表但是通常將列表縮減為標量值。清單 2中提供的示例說明用於將列表縮減為標量的其他 SCSH 函式 — 在這種情況下,用 (1 + (2 + (3 + (4 + (5))))) 的格式彙總值的列表。請注意這是典型的功能性程式設計,取決於迭代上的遞迴。

清單2 SCSH上的reduce函式演示
> (define (list-sum lis) (if (null? lis) 0 (+ (car lis) (list-sum (cdr lis)))))
> (list-sum '(1 2 3 4 5))
15
> 

有趣的是要注意遞迴與迭代在命令性語言中同樣高效,因為遞迴在幕後被轉化成迭代。

hadoop的程式設計模型

Google 引用 MapReduce 的概念作為處理或生成大型資料集的程式設計模型。在規範模型中,map 函式處理鍵值對,這將得出鍵值對的中間集。然後 reduce 函式會處理這些中間鍵值對,併合並相關鍵的值(請參考圖 1)。輸入資料使用這樣一種方法進行分割槽,即在並行處理的計算機叢集中分割槽的方法。使用相同的方法,已生成的中間資料將被並行處理,這是處理大量資料的理想方法。

圖1 MapReduce的處理的簡化流程
MapReduce 處理的簡化檢視

對於快速重新整理器來說,檢視圖 1 的體系結構,從 map 和 reduce 角度來進行字數統計(因為您將在本文中開發 map 和 reduce 應用程式)。在提供輸入資料時(進入 Hadoop 檔案系統 [HDFS]),首先分段,然後分配給 map 工作執行緒(通過作業跟蹤器)。雖然 圖 2 中的示例顯示了一個被分段的簡短語句,但是分段的工作數量通常在 128MB 範圍內,其原因是建立工作只需要很少的時間,因為有更多的工作要做,以便最大限度地減少這種開銷。map 工作執行緒(在規範的示例中)將工作分割成包含已標記單詞和初始值(在此情況下是 1)的單個向量。在 map 任務完成時(如通過任務跟蹤器在 Hadoop 中所定義的),提供工作給 reduce 工作執行緒。通過代表所發現的鍵的數量的值,reduce 工作執行緒將許多鍵縮減為一個惟一的集合。

圖2 簡單的maprecduce流程
簡單的 MapReduce 示例

請注意此過程可在相同的或不同的計算機中出現或者使用不同的資料分割槽來按順序或並行完成,且結果仍然是相同的。

雖然規範的檢視(用於使用字數統計生成搜尋索引)是一種用來檢視 Hadoop 方法,但結果是此計算模型被常規地應用到可計算問題上,正如您將要看到的那樣。

hadoop的靈活性

從 圖 2 中所示的簡單示例看,需注意 map 和 reduce 過程這兩個主要元素。雖然這裡存在一個這些過程如何工作的傳統檢視,但是它不是 map 和 reduce 體系結構所需要的。這就是 Hadoop 的真實力量 — 其靈活性用來實現在某種程度上活動的 map 和 reduce 過程,這解決了一個特定的應用程式。雖然字數統計示例對於大量的問題是有用且適用的,但是其他的模型仍然在此總體框架內適用。所需的就是使 map 和 reduce 應用程式的開發過程對於 Hadoop 可見。

在其他的應用程式中,Hadoop 已經被用於實現包括神經網路演算法的計算機學習應用程式,支援向量計算機以及 k-means 叢集(要獲得更多資訊,請參考 參考資料 部分)。

資料流

雖然 Hadoop 是一個基於 Java 的框架,但是其有可能在 Java 語言以外的語言中編寫 msp 和 reduce 應用程式。Hadoop 內的  實用工具實現了一種資料流膠的型別。通過  實用工具,您可以定義您自己的可執行 map 和 reduce(使用每一個從標準輸入 [stdin] 提取的輸入和每一個通過標準輸出 [stdout] 提供的輸出),且  實用工具可適當地讀取和寫入資料,根據需要呼叫您的應用程式(請參考清單 3)。

清單3  使用hadoop流工具
				
hadoop jar $HADOOP_HOME/hadoop-流.jar \
	-input inputData
	-output outputData
	-mapper map_exec
	-reducer reduce_exec

清單 3 說明如何在 Hadoop 內使用  實用工具,圖 3 圖形化地顯示瞭如何定義流。請注意這是一個流使用的簡單示例。大量的選項可用於制定如何解析資料、制定如何呼叫影象、為分割槽器和合成器指定替換影象以及調整其他配置(要獲得更多資訊,請參考 參考資料 部分)。

圖3 圖形流示例
圖形流示例

Ruby示例

通過已經獲得的在  實用工具基本理解上的經驗,您已經準備編寫一個簡單的 Ruby map 和 reduce 應用程式並檢視如何在 Hadoop 框架中使用過程。雖然此處的示例伴隨著規範的 MapReduce 應用程式,但是稍後您將看到其他的應用程式(取決於您將如何用 map 和 reduce 格式實現它們)。

首選是 mapper。此指令碼從 stdin 提取文字輸入,首先標記它,然後將一系列鍵值對傳送到 stdout。像大多數面向物件的指令碼語言一樣,這個任務幾乎太簡單了。如清單 4 中所示的 mapper 指令碼(通過一些註釋和空白區域可給與其大一點的大小)。此程式使用一個迭代器來從 stdin 中讀取一行,同時另一個迭代器將該行分割成單個的標記。使用為 1 的相關值(通過選項卡分隔)將每一個標記(單詞)傳送到 stdout。

清單4 map ruby指令碼
#!/usr/bin/env ruby

# Our input comes from STDIN
STDIN.each_line do |line|

  # Iterate over the line, splitting the words from the line and emitting
  # as the word with a count of 1.
  line.split.each do |word|
    puts "#{word}\t1"
  end

end

下一步,檢視 reduce 應用程式。雖然此應用程式稍微有些複雜,但是使用 Ruby hash(關聯陣列)可簡化 reduce 操作(請參考清單 5)。此指令碼可通過來自 stdin (通過  實用工具傳遞)的輸入資料再次工作且將該行分割成一個單詞或值。而後該 hash 會檢查該單詞;如果發現,則將計數新增到元素。否則,您需要在該單詞的 hash 中建立新的條目,然後載入計數(應該是來自 mapper 過程的 1)。在所有輸入都被處理以後,通過 hash 可簡單迭代且將鍵值對傳送到 stdout。

清單5 ruby reduce 指令碼
#!/usr/bin/env ruby

# Create an empty word hash
wordhash = {}

# Our input comes from STDIN, operating on each line
STDIN.each_line do |line|

  # Each line will represent a word and count
  word, count = line.strip.split

  # If we have the word in the hash, add the count to it, otherwise
  # create a new one.
  if wordhash.has_key?(word)
    wordhash[word] += count.to_i
  else
    wordhash[word] = count.to_i
  end

end

# Iterate through and emit the word counters
wordhash.each {|record, count| puts "#{record}\t#{count}"}

隨著 map 和 reduce 指令碼的完成,需從命令列測試它們。記得要使用 chmod +x 將這些檔案更改為可執行。通過生成輸入檔案來啟動,如清單 6 所示。

清單6 生成輸入檔案
# echo "Hadoop is an implementation of the map reduce framework for " \
	"distributed processing of large data sets." > input
#

通過單詞輸入,現在您可以測試您的 mapper 指令碼,如清單 7 所示。回想此指令碼簡單地將輸入標記到鍵值對,此處每個值都將是1(非惟一輸入)。

清單7 測試mapper指令碼
# cat input | ruby map.rb
Hadoop	1
is	1
an	1
implementation	1
of	1
the	1
map	1
reduce	1
framework	1
for	1
distributed	1
processing	1
of	1
large	1
data	1
sets.	1
#

到目前為止,一切都很順利。現在,在原始流格式中將整個應用程式一起調出。在清單 8 中,通過 map 指令碼傳遞您的輸入、排序輸出(可選步驟)、然後通過 reduce 指令碼傳遞由此產生的中間資料。

清單8 使用linux管道的簡單mapreduce

# cat input | ruby map.rb | sort | ruby reduce.rb
large	1
of	2
framework	1
distributed	1
data	1
an	1
the	1
reduce	1
map	1
sets.	1
Hadoop	1
implementation	1
for	1
processing	1
is	1
#

使用hadoop的ruby

在 shell 環境中您的 map 和 reduce 指令碼按預期工作,通過 Hadoop 將它們放入測試中。我將會跳過 Hadoop 安裝任務(參考本系列的 用 Hadoop 進行分散式資料處理,第 1 部分:入門 或 用 Hadoop 進行分散式資料處理,第 2 部分:進階 以便建立 Hadoop 並使其執行)。

第一步將要在 HDFS 內為您的輸入資訊建立輸入字典,然後提供一個將測試您指令碼的簡單檔案。清單 9 說明了此步驟(有關這些步驟的更多資訊,請參考本系列的 用 Hadoop 進行分散式資料處理,第 1 部分:入門 或 用 Hadoop 進行分散式資料處理,第 2 部分:進階)。

清單9 為mapreduce過程建立輸入檔案
# hadoop fs -mkdir input
# hadoop dfs -put /usr/src/linux-source-2.6.27/Documentation/memory-barriers.txt input
# hadoop fs -ls input
Found 1 items
-rw-r--r--  1 root supergroup  78031 2010-06-04 17:36 /user/root/input/memory-barriers.txt
# 

下一步,使用  實用工具,通過自定義指令碼來呼叫 Hadoop,簡化輸出的輸入資料和位置(請參考清單 10)。在此示例中請注意 -file 選項會簡單地告訴 Hadoop 來打包您的 Ruby 指令碼作為部分作業提交。

請單10 使用ruby mapreduce指令碼使用hadoop流

# hadoop jar /usr/lib/hadoop-0.20/contrib/streaming/hadoop-0.20.2+228-streaming.jar \
  -file /home/mtj/ruby/map.rb -mapper /home/mtj/ruby/map.rb \
  -file /home/mtj/ruby/reduce.rb -reducer /home/mtj/ruby/reduce.rb \
  -input input/* -output output
packageJobJar: [/home/mtj/ruby/map.rb, /home/mtj/ruby/reduce.rb, /var/lib/hadoop-0.20/...
10/06/04 17:42:38 INFO mapred.FileInputFormat: Total input paths to process : 1
10/06/04 17:42:39 INFO streaming.StreamJob: getLocalDirs(): [/var/lib/hadoop-0.20/...
10/06/04 17:42:39 INFO streaming.StreamJob: Running job: job_201006041053_0001
10/06/04 17:42:39 INFO streaming.StreamJob: To kill this job, run:
10/06/04 17:42:39 INFO streaming.StreamJob: /usr/lib/hadoop-0.20/bin/hadoop job ...
10/06/04 17:42:39 INFO streaming.StreamJob: Tracking URL: http://localhost:50030/...
10/06/04 17:42:40 INFO streaming.StreamJob:  map 0%  reduce 0%
10/06/04 17:43:17 INFO streaming.StreamJob:  map 100%  reduce 0%
10/06/04 17:43:26 INFO streaming.StreamJob:  map 100%  reduce 100%
10/06/04 17:43:29 INFO streaming.StreamJob: Job complete: job_201006041053_0001
10/06/04 17:43:29 INFO streaming.StreamJob: Output: output
# 

最後,通過 hadoop 實用工具使用 cat 檔案系統操作來探索輸出(請參考清單 11)。

清單11 exploring hadoop output
# hadoop fs -ls /user/root/output
Found 2 items
drwxr-xr-x  - root supergroup      0 2010-06-04 17:42 /user/root/output/_logs
-rw-r--r--  1 root supergroup  23014 2010-06-04 17:43 /user/root/output/part-00000
# hadoop fs -cat /user/root/output/part-00000 | head -12
+--->|	4
immediate	2
Alpha)	1
enable	1
_mandatory_	1
Systems	1
DMA.	2
AMD64	1
{*C,*D},	2
certainly	2
back	2
this	23
# 

在不到 30 行的指令碼中,您已經在 Hadoop 框架內實現了 map 和 reduce 元素並演示了它們的執行。雖然是一個簡單的示例,但是通過自定義的和專有的演算法說明了 Hadoop 背後真實的力量以及為什麼 Hadoop 正在成為一種用於處理大型資料集的流行框架。

hadoop其他的應用程式

Hadoop 可用於許多應用程式上,其已超越了為大型資料集簡單計算字數的工作。所有這一切的需要就是用向量格式表達 Hadoop 基礎設施可以使用的資料。雖然規範的示例使用矢量表達作為鍵和值,但是並沒有限制您如何來定義值(例如一些值的彙總)。在更加豐富的應用程式集中此靈活性可以為 Hadoop 創造新的機會。

一個一直適合 MapReduce 字數統計模型的有趣的應用程式正在把 Web 伺服器訪問的頻率製表(在開創性 Google 文章中討論)。對於此應用程式來說,URL 作為鍵來服務(從 Web 伺服器訪問日誌攝取)。reduce 過程的結果是基於 Web 伺服器日誌的給定 Web 站點的每次 URL 訪問的總數。

在計算機學習使用者程式中,Hadoop 已經作為處理大量 GA 個體的規模遺傳演算法的一種方法(潛在解決方案)。map 過程執行傳統的遺傳演算法,從本地池中搜索最佳單個解決方案。然後 reduce 應用程式成為來自 map 階段的單個解決方案的整合。這會允許單個節點識別最佳解決方案,然後允許這些解決方案在最適於生存的分散式顯示的 reduce 階段中相互競爭。

另外一個有趣的應用程式被建立用於識別僵屍網路的垃圾郵件。此過程的第一步將會為減少垃圾郵件為目的而對電子郵件按來自給定組織而進行分類(基於一組指紋)。根據過濾的這些資料,對以特定方式(例如參考電子郵件正文中的相同連結)連線的郵件生成一個圖表。然後這些相關電子郵件會減少至主機(靜態或動態 IP 地址)以識別有問題的僵屍網路。

在應用程式之外通過 map 和 reduce 基元來檢視世界,Hadoop 作為在計算機叢集之間分配工作的方式非常有用。 Map 和 reduce 並非必須強制某種特定型別的應用程式。相反地,Hadoop 可以被視為一種可以同時將資料和演算法分配到主機以獲得更快速的並行處理速度的方法。

hadoop應用程式生態環境

雖然 Hadoop 提供了一個靈活的架構,但也可以使用其他應用程式轉換與其他應用程式的介面。一個有趣的示例稱為 Hive,它是一個具有自己特定查詢語言(稱為 Hive QL)的資料倉庫基礎結構。Hive 使得 Hadoop 更加熟悉結構化查詢語言 (SQL) 背景,同時還支援傳統的 MapReduce 基礎結構來進行資料處理。

HBase 是另外一種位於 HDFS 頂部的有趣的應用程式。它是一個類似於 Google BigTable 的高效能資料庫系統。代替傳統的檔案處理,HBase 使資料庫將 MapReduce 處理的輸入和輸出格式列表。

最後,Pig 是 Hadoop 中用於分析大型資料集的平臺。Pig 提供可編譯 map 和 reduce 應用程式的高階語言。

這是 Hadoop 系列 的最後一篇文章,探索了在適用於 Hadoop 框架的 Ruby 中開發 map 和 reduce 應用程式。希望從這篇文章您可以看到 Hadoop 的真正力量。雖然 Hadoop 將您限制在一個特定的程式設計模型中,但是這種模型是靈活的且可被應用到大量的應用程式上。

參考文獻:

  • MapReduce:大型叢集中的簡化資料處理 是有關 MapReduce 的開創性文章,其由 Jeff Dean 和 Sanjay Ghemawat 於 2004 年編寫。本文仍是一個令人愉快的閱讀物。

  • 本文探索了 Hadoop 的  實用工具,其允許在 Java 語言以外的多種語言中開發 map 和 reduce 指令碼。Apache 為  提供了一套非常好的資源,包括 Hadoop 流 文件和 流 wiki(為各種命令列選項提供了很好的介紹)。

  • Wikipedia 為 Lisp 和 Scheme 語言提供了很好的介紹以及為 功能性程式設計概念 提供了一般介紹(和 MapReduce)。

  • 要演示 map 和 reduce 的功能性程式設計元素,本文使用了 Scheme shell。如果您曾經想嘗試 Scheme,則 SCSH 是一個很好的沙盒去嘗試這種強大的語言。您也可以在 Tim 的文章 用 Guile 編寫指令碼(developerWorks,2009 年 1 月)中學習有關 Scheme 和通過 C 編寫指令碼,或閱讀一個很好的 Scheme 介紹。 

  • 在文章 Map-Reduce for Machine Learning on Multicore 中,MapReduce 模型被用於為多核處理器實現各種不同的計算機學習演算法。這是一個有趣的閱讀用來探索 MapReduce 模型如何應用到各種不同的可計算演算法。

  • 配置單元 是一個建立在 Hadoop 頂部的資料艙庫基礎結構。其在 Hadoop 資料上提供查詢語言,此語言支援傳統的 Hadoop 程式設計模型。HBase 是資料庫在 Hadoop 的 HDFS 上的表現,在簡單檔案上執行 MapReduce 以操作資料庫表。最後,Pig 是一個包括適用於 Hadoop 程式設計的高階語言的大型資料庫集分析的平臺。

  • Ruby 語言是最新的面向物件的指令碼語言。其動態關注程式設計師工作效率。

  • 檢查 學術文章中的 Mapreduce 和 Hadoop 演算法 的列表。此站點提供有關 Hadoop 如何用於各種不同的應用程式的有趣觀點(來自科學、計算機學習、web 服務,等等)。

  • 在 developerWorks 上查閱所有 Linux 技巧 和 Linux 教程。 

  • 隨時關注 developerWorks 技術活動網路廣播。 

  • 觀看 developerWorks 演示中心,其範圍從適用於初學者的產品安裝和設定演示到適用於有經驗的開發人員的高階功能。
  • Yahoo! 的 Doug Cutting(現在在 Cloudera)為支援 Nutch 搜尋引擎的分發開發了 Hadoop。

  • Cloudera 提供預打包的 Hadoop 和 VM,簡化了 Hadoop 的安裝。 

  • 檢視 Google 最近授予 Hadoop 的 許可證,這個許可證讓使用者可以放心地使用 Hadoop,不需要擔心法律問題。Google 擁有 Hadoop 的思想的專利(專利 7,650,331 中定義的高效大規模資料處理)。

  • 閱讀 “使用 Linux 和 Hadoop 進行分散式計算”(developerWorks,2008 年 12 月)和最近的 "用 Linux 和 Apache Hadoop 進行雲計算"(developerWorks,2009 年 10 月),瞭解 Hadoop 及其架構的更多資訊。 

  • 瞭解 Hadoop on the horizon 和 IBM 的 jStart(新興技術專案)。在 jStart,還可以瞭解 BigSheets,這是通過 Web 資料擴充套件業務智慧化的 IBM mashup。 

  • 在 developerWorks 上查閱所有 Linux 技巧 和 Linux 教程。 

  • 隨時關注 developerWorks 技術活動網路廣播。 

  • 觀看 developerWorks 演示中心,包括面向初學者的產品安裝和設定演示,以及為經驗豐富的開發人員提供的高階功能。


相關推薦

Hadoop 進行分散式資料處理 入門應用開發

[email protected]:~# hadoop-0.20 fs -ls output Found 2 items drwxr-xr-x - root supergroup 0 2010-05-12 19:04 /user/root/output/_logs -rw-r

機器學習和python學習之路史上吐血整理機器學習python大資料技術書入門最全本(書籍推薦珍藏版)

“機器學習/深度學習並不需要很多數學基礎!”也許你在不同的地方聽過不少類似這樣的說法。對於鼓勵數學基礎不好的同學入坑機器學習來說,這句話是挺不錯的。不過,機器學習理論是與統計學、概率論、電腦科學、演算法等方面交叉的領域,對這些技術有一個全面的數學理解對理解演算法的內部工作機

NLP 學習祕笈入門 | 書單

自然語言處理(NLP)作為人工智慧研究的核心領域之一,長久以來都受到廣泛關注。微軟全球執行副總裁沈向洋博士曾表示“懂語言者得天下,人工智慧對人類影響最為深刻的就是自然語言方面。”現在很多研究人員都在進入自然語言領域,希望可以解決“讓機器理解人類語言”這一難題。

Hadoop大數據挖掘入門實戰

精華 技巧 共勉 參考 輔助 大數據時代 快速 elk 指導 1.概述   大數據時代,數據的存儲與挖掘至關重要。企業在追求高可用性、高擴展性及高容錯性的大數據處理平臺的同時還希望能夠降低成本,而Hadoop為實現這些需求提供了解決方案。面對Hadoop的普及和學習熱潮,

演算法與資料結構+一點點ACM入門吐血整理推薦書單(珍藏版)

轉載自某大佬部落格 https://pymlovelyq.github.io/2018/10/06/Algorithm/ 前言:技術書閱讀方法論 一.速讀一遍(最好在1~2天內完成) 人的大腦記憶力有限,在一天內快速看完一本書會在大腦裡留下深刻印象,對於之後複習以及總

演算法與資料結構技術書籍入門推薦適合大神小白附技術書閱讀方法論【附網盤連結】

轉載自某大佬部落格 https://pymlovelyq.github.io/2018/10/06/Algorithm/ 前言:技術書閱讀方法論 一.速讀一遍(最好在1~2天內完成) 人的大腦記憶力有限,在一天內快速看完一本書會在大腦裡留下深刻印象,對於之後複習以及總

SpringCloud入門(四)——生產環境下Eureka的完全分散式部署

內容   由於前兩節的內容我們知道,開啟了preferIpAddress後,Eureka的偽分散式部署會提示replica不可用。這一節我們講解如何在生產環境下部署完全分散式的Eureka叢集,確保開啟了preferIpAddress後replica的可用性。 版本   IDE:IDEA 2017.2.

入門必看51本Python精品書籍免費送!

Python是一種多功能語言。它經常用作Web應用程式的指令碼語言,嵌入到軟體產品中,以及人工智慧和系統任務管理。它既簡單又強大,非常適合初學者和專業程式設計師。 小編精選了51本高質量的Python書籍。裡面涵蓋各種各樣的書籍,其中包含適用於初學者,中級和高階程式設計師的,也有針對特別領域的,

【玩轉資料結構 入門】 佇列

package Arr; /** * 陣列佇列 * @author 大南海 * * @param <E> */ public class ArrayQueue<E> implements Queue<E> { private Array<E

玩轉資料結構入門 0基礎學好資料結構分享

課程簡介: 從資料結構基礎到二叉樹、紅黑樹、雜湊表,bobo老師精心設計本課程,詳細生動的為你講解資料結構。讓你面對資料結構可以學的會、玩的溜。掌握資料結構,完成從“搬磚”到“蓋樓”的蛻變,就在此課。各位小夥伴不要錯過! 本門課程更側重系統地介紹資料結構,涉及基礎資料結構如

最新玩轉資料結構入門

第1章 歡迎學習《玩轉資料結構》歡迎大家學習《玩轉資料結構》課程。在這個課程中,我們將從底層實現諸多資料結構,從簡單,到複雜,並且探索他們的應用。在這一章,我們將來看一看資料結構的具體作用,學習資料結構的誤區,學習這個課程的注意事項,和課程環境的基本搭建:) ...第2章 不要小瞧陣列陣列,看

最新玩轉資料結構入門 資料結構基礎

第1章 歡迎學習《玩轉資料結構》歡迎大家學習《玩轉資料結構》課程。在這個課程中,我們將從底層實現諸多資料結構,從簡單,到複雜,並且探索他們的應用。在這一章,我們將來看一看資料結構的具體作用,學習資料結構的誤區,學習這個課程的注意事項,和課程環境的基本搭建:) ...第2章 不要小瞧陣列陣列,看似是最

運維大師講堂7天入門

運維大師講堂,7天從入門到進階 想做運維,如何入門毫無頭緒? 選取工具和平臺,不清楚每款產品的功用? 面對複雜場景,怎樣結合日誌、指標及儀表盤等各種資料分析定位? 雲端計算時代,隨著企業對資訊系統的依賴性增強,雲上應用的規模與複雜度日趨增長,系統架構複雜、耦合度明顯增大,高併發流量對系統

【玩轉資料結構 入門】 連結串列

public class LinkList<E> { private class Node { public E e; public Node next; public Node(E e, Node next) { this.e = e; this.n

演算法與資料結構+一點點ACM入門吐血整理推薦書單pdf附網盤下載連結

前言: 技術書閱讀方法論 一.速讀一遍(最好在1~2天內完成) 人的大腦記憶力有限,在一天內快速看完一本書會在大腦裡留下深刻印象,對於之後複習以及總結都會有特別好的作用。對於每一章的知識,先閱讀標題,弄懂大概講的是什麼主題,再去快速看一遍,不懂也沒有關係,但是一定要在不懂的

玩轉資料結構 入門

第1章 歡迎學習《玩轉資料結構》 歡迎大家學習《玩轉資料結構》課程。在這個課程中,我們將從底層實現諸多資料結構,從簡單,到複雜,並且探索他們的應用。在這一章,我們將來看一看資料結構的具體作用,學習資料結構的誤區,學習這個課程的注意事項,和課程環境的基本搭建:)

【40本】演算法與資料結構技術書籍入門附技術書閱讀方法論

前言:技術書閱讀方法論 一.速讀一遍(最好在1~2天內完成) 人的大腦記憶力有限,在一天內快速看完一本書會在大腦裡留下深刻印象,對於之後複習以及總結都會有特別好的作用。 對於每一章的知識,先閱讀標題,弄懂大概講的是什麼主題,再去快速看一遍,不懂也沒有關係,但

Android大型實戰:《親信優雅的入門》-劉桂林-專題視訊課程

Android大型實戰:《親信,優雅的從入門到進階》—5972人已學習 課程介紹        課程從入門到,實戰經驗豐富,通俗易懂,我將帶領大家學習一些新技術,新概念! 課程基本上拜託了初學者的拖沓,完全面向進階知識,通過對比,論證知識點,來分析每個知識點的優缺點,以及原

入門這份完整的Python學習書籍單供你收藏

2018-01-08 小雨 小象 AlphaGo 都在使用的 Python 語言,是最接近 AI 的程式語言。 教育部考試中心近日釋出了“關於全國計算機等級(NCRE)體系調整”的通知,

學習Python就業有哪些方向附加視訊教程(python3入門(面向物件)實戰(爬蟲飛機遊戲GUI實戰)視訊教程)

python3從入門到進階(面向物件),實戰(爬蟲,飛機遊戲,GUI實戰)視訊教程連結:http://pan.baidu.com/s/1kUG0pLH密碼:加以下微信為好友,朋友圈獲取。入門與基礎面向物件程式設計爬蟲實戰GUI實戰飛機遊戲Python是一門面向物件的程式語言,