⑴ 編程各個語言之間的區別很大嗎
編程各個語言之間的區別:下面列舉java語言、python語言、C語言、php語言。
1、java語言:java語言有跨平台的優勢以及強大的類庫,其他語言很難超越,java衍生除了非常多周邊產品(如jsp),非常多的開源系統都是基於java(hadoop、hive、hbase、lucene等),java和c一樣也是編譯執行的語言,區別在於java編譯出的位元組碼文件運行在一層java虛擬機之上,而虛擬機可以架設在各種操作系統上,所以java也就有了跨平台的優勢,一處編譯多處執行。Java一般應用於Android系統的應用開發。
2、python語言的強大在於它的多功能性,既是解釋執行,又可以編譯成文件,既是腳本語言,又具有面向對象的所有性質,如今python開源的類庫已經非常強大了,什麼功能都有,python也成了大數據方向必要的工具。python一般應用於人工智慧的應用開發。
3、C語言是編譯執行的語言,是萬物之源。linux下常用的編譯器是gcc,c語言源代碼可以直接被編譯成可執行程序(機器碼),被稱為萬物之源是因為各種語言都是用C語言寫的,如java、php、python……C語言一般應用於嵌入式底層技術的開發。
4、PHP語言的巨大生態系統使得在未來幾年裡全世界需要大量的開發人員對其提供支持。排名前三的內容管理系統-WordPress、Drupal和Joomla都是使用PHP構建的,而且迄今大概有80%的網站運行在PHP之上。PHP語言一般應用於網站的應用開發。
所以,你可以根據自己的應用來選擇學習語言。
⑵ 如何入門大數據(數據挖掘方面)
如何入門大數據(數據挖掘方面)?這是一個涵蓋了從自學基礎到實踐應用的綜合性問題。本文從個人經歷出發,結合對大數據和數據挖掘的理解,提出了一條相對系統的路徑供有意向轉行或入門數據挖掘的讀者參考。以下內容將分為基礎知識自學、機器學習自學、應用實踐、以及其它相關建議幾個部分,旨在提供一個相對全面的學習路徑。
### 基礎知識自學
#### 編程語言與數據結構演算法
- **C/C++與Java**:理解編程語言的基礎邏輯是關鍵。推薦先從C語言入手,閱讀《C程序設計語言》,隨後系統地學習《C++ Primer》,並嘗試《Effective C++》來提升C++編程技巧。
- **數據結構與演算法**:使用《演算法(第4版)》學習常見演算法,同時閱讀《劍指offer》和《程序員代碼面試指南》以提升演算法應用與面試准備能力。
#### 操作系統與網路編程
- 學習《深入理解計算機系統》的基礎概念,針對面試准備,將主要精力放在編程語言、數據結構演算法上,以背誦面試常見問題為主。
### 機器學習自學
#### 常見機器學習演算法
- **入門**:通過吳恩達的《機器學習》視頻課程作為起點,推薦同時參考《機器學習實戰》與《統計學習方法》,前者側重實踐,後者強調理論,二者結合學習效果更佳。
- **深入理解**:《機器學習》(周志華著)是後續深入學習的良好資源。確保理解各種演算法的原理,重點掌握決策樹(DT)、邏輯回歸(LR)、支持向量機(SVM)以及隨機森林(RF)、GBDT等演算法的原理與參數調整。
#### 實際應用與問題解決
- **實踐**:參與Kaggle比賽或使用Python數據分析工具(如numpy、pandas、matplotlib、sklearn)處理實際數據,提升解決問題的能力。
- **特徵處理**:學習特徵選擇、數據清洗等技能,了解不同機器學習模型的適用場景。
### 其它
- **大數據框架**:學習Hadoop或Spark的基礎知識,Java是Hadoop的首選開發語言,而Scala或Python的API適用於Spark。
- **實習經驗**:盡量在實習中積累經驗,面試時有實習經歷更有優勢。
- **筆試與面試准備**:准備充分,內推是避免筆試壓力的有效途徑。
### 推薦書單
- **編程語言與數據結構演算法**:《C程序設計語言》、《C++ Primer》、《演算法(第4版)》、《劍指offer》、《程序員代碼面試指南》。
- **機器學習**:《機器學習》(周志華)、《機器學習實戰》、《統計學習方法》、《推薦系統實踐》。
- **Python**:《Python核心編程(第二版)》、《利用Python進行數據分析》。
### 小結
數據挖掘與大數據領域涉及廣泛的知識體系,從基礎知識到實踐應用,都需要系統的學習與經驗積累。本文提供的路徑旨在提供一個學習起點,但具體路徑與進度應根據個人情況進行調整。保持持續學習的態度,不斷實踐與探索,是成功步入數據挖掘領域的關鍵。
⑶ hadoop支持什麼開發語言
hadoop支持C++,Java開發語言。
Hadoop帶有用Java語言編寫的框架,因此運行在 Linux 生產平台上是非常理想的。Hadoop 上的應用程序也可以使用其他語言編寫,比如 C++。MapRece是處理大量半結構化數據集合的編程模型。編程模型是一種處理並結構化特定問題的方式。
例如,在一個關系資料庫中,使用一種集合語言執行查詢,如SQL。告訴語言想要的結果,並將它提交給系統來計算出如何產生計算。還可以用更傳統的語言(C++,Java),一步步地來解決問題。這是兩種不同的編程模型,MapRece就是另外一種。
(3)hadoopc編程擴展閱讀
特點
1、確定哪些數據屬於企業的敏感數據。根據公司的隱私保護政策,以及相關的行業法規和政府規章來綜合確定。
2、確保數據保護方案同時採用了隱藏和加密技術,尤其是如果我們需要將敏感數據在Hadoop中保持獨立的話。
3、確保需要加密的時候有合適的技術(比如Java、Pig等)可被部署並支持無縫解密和快速訪問數據。
⑷ 如何在Hadoop上編寫MapRece程序
1. 概述
1970年,IBM的研究員E.F.Codd博士在刊物《Communication of the ACM》上發表了一篇名為「A Relational Model of Data for Large Shared Data Banks」的論文,提出了關系模型的概念,標志著關系資料庫的誕生,隨後幾十年,關系資料庫及其結構化查詢語言SQL成為程序員必須掌握的基本技能之一。
2005年4月,Jeffrey Dean和Sanjay Ghemawat在國際會議OSDI上發表「MapRece: Simplified Data Processing on Large Cluster」,標志著google的大規模數據處理系統MapRece公開。受這篇論文的啟發,當年秋天,Hadoop 由 Apache Software Foundation 公司作為 Lucene 的子項目 Nutch 的一部分正式被引入,2006 年 3 月份,MapRece 和 Nutch Distributed File System (NDFS) 分別被納入稱為 Hadoop 的項目中。如今,Hadoop已經被超過50%的互聯網公司使用,其他很多公司正准備使用Hadoop來處理海量數據,隨著Hadoop越來越受歡迎,也許在將來的某段時間,Hadoop會成為程序員必須掌握的技能之一,如果真是這樣的話,學會如何在Hadoop上編寫MapRece程序便是學習Hadoop的開始。
本文介紹了在Hadoop上編寫MapRece程序的基本方法,包括MapRece程序的構成,不同語言開發MapRece的方法等。
2. Hadoop 作業構成
2.1 Hadoop作業執行流程
用戶配置並將一個Hadoop作業提到Hadoop框架中,Hadoop框架會把這個作業分解成一系列map tasks 和rece tasks。Hadoop框架負責task分發和執行,結果收集和作業進度監控。
下圖給出了一個作業從開始執行到結束所經歷的階段和每個階段被誰控制(用戶 or Hadoop框架)。
下圖詳細給出了用戶編寫MapRee作業時需要進行那些工作以及Hadoop框架自動完成的工作:
在編寫MapRece程序時,用戶分別通過InputFormat和OutputFormat指定輸入和輸出格式,並定義Mapper和Recer指定map階段和rece階段的要做的工作。在Mapper或者Recer中,用戶只需指定一對key/value的處理邏輯,Hadoop框架會自動順序迭代解析所有key/value,並將每對key/value交給Mapper或者Recer處理。表面上看來,Hadoop限定數據格式必須為key/value形式,過於簡單,很難解決復雜問題,實際上,可以通過組合的方法使key或者value(比如在key或者value中保存多個欄位,每個欄位用分隔符分開,或者value是個序列化後的對象,在Mapper中使用時,將其反序列化等)保存多重信息,以解決輸入格式較復雜的應用。
2.2 用戶的工作
用戶編寫MapRece需要實現的類或者方法有:
(1) InputFormat介面
用戶需要實現該介面以指定輸入文件的內容格式。該介面有兩個方法
1
2
3
4
5
6
7
8
9
10
11
public interface InputFormat<K, V> {
InputSplit[] getSplits(JobConf job, int numSplits) throws IOException;
RecordReader<K, V> getRecordReader(InputSplit split,
JobConf job,
Reporter reporter) throws IOException;
}
其中getSplits函數將所有輸入數據分成numSplits個split,每個split交給一個map task處理。getRecordReader函數提供一個用戶解析split的迭代器對象,它將split中的每個record解析成key/value對。
Hadoop本身提供了一些InputFormat:
(2)Mapper介面
用戶需繼承Mapper介面實現自己的Mapper,Mapper中必須實現的函數是
1
2
3
4
5
6
7
8
9
void map(K1 key,
V1 value,
OutputCollector<K2,V2> output,
Reporter reporter
) throws IOException
其中,<K1 V1>是通過Inputformat中的RecordReader對象解析處理 的,OutputCollector獲取map()的輸出結果,Reporter保存了當前task處理進度。
Hadoop本身提供了一些Mapper供用戶使用:
(3)Partitioner介面
用戶需繼承該介面實現自己的Partitioner以指定map task產生的key/value對交給哪個rece task處理,好的Partitioner能讓每個rece task處理的數據相近,從而達到負載均衡。Partitioner中需實現的函數是
getPartition( K2 key, V2 value, int numPartitions)
該函數返回<K2 V2>對應的rece task ID。
用戶如果不提供Partitioner,Hadoop會使用默認的(實際上是個hash函數)。
(4)Combiner
Combiner使得map task與rece task之間的數據傳輸量大大減小,可明顯提高性能。大多數情況下,Combiner與Recer相同。
(5)Recer介面
用戶需繼承Recer介面實現自己的Recer,Recer中必須實現的函數是
1
2
3
4
5
6
7
8
9
void rece(K2 key,
Iterator<V2> values,
OutputCollector<K3,V3> output,
Reporter reporter
) throws IOException
Hadoop本身提供了一些Recer供用戶使用:
(6)OutputFormat
用戶通過OutputFormat指定輸出文件的內容格式,不過它沒有split。每個rece task將其數據寫入自己的文件,文件名為part-nnnnn,其中nnnnn為rece task的ID。
Hadoop本身提供了幾個OutputFormat:
3. 分布式緩存
Haoop中自帶了一個分布式緩存,即DistributedCache對象,方便map task之間或者rece task之間共享一些信息,比如某些實際應用中,所有map task要讀取同一個配置文件或者字典,則可將該配置文件或者字典放到分布式緩存中。
4. 多語言編寫MapRece作業
Hadoop採用java編寫,因而Hadoop天生支持java語言編寫作業,但在實際應用中,有時候,因要用到非java的第三方庫或者其他原因,要採用C/C++或者其他語言編寫MapRece作業,這時候可能要用到Hadoop提供的一些工具。
如果你要用C/C++編寫MpaRece作業,可使用的工具有Hadoop Streaming或者Hadoop Pipes。
如果你要用Python編寫MapRece作業,可以使用Hadoop Streaming或者Pydoop。
如果你要使用其他語言,如shell,php,ruby等,可使用Hadoop Streaming。
關於Hadoop Streaming編程,可參見我的這篇博文:《Hadoop Streaming編程》(http://dongxicheng.org/maprece/hadoop-streaming-programming/ )
關於Pydoop編程,可參見其官方網站:http://sourceforge.net/projects/pydoop/
關於Hadoop pipes編程,可參見《Hadoop Tutorial 2.2 — Running C++ Programs on Hadoop》。
5. 編程方式比較
(1)java。 Hadoop支持的最好最全面的語言,而且提供了很多工具方便程序員開發。
(2)Hadoop Streaming。 它最大的優點是支持多種語言,但效率較低,rece task需等到map 階段完成後才能啟動;它不支持用戶自定義InputFormat,如果用戶想指定輸入文件格式,可使用java語言編寫或者在命令行中指定分隔符;它採用標准輸入輸出讓C/C++與java通信,因而只支持text數據格式。
(3)Hadoop Pipes。 專門為C/C++語言設計,由於其採用了socket方式讓C/C++與java通信,因而其效率較低(其優勢在於,但作業需要大量,速度很快)。它支持用戶(用C/C++)編寫RecordReader。
(4)Pydoop。它是專門方便python程序員編寫MapRece作業設計的,其底層使用了Hadoop Streaming介面和libhdfs庫。
6. 總結
Hadoop使得分布式程序的編寫變得異常簡單,很多情況下,用戶只需寫map()和rece()兩個函數即可(InputFormat,Outputformat可用系統預設的)。正是由於Hadoop編程的簡單性,越來越多的公司或者研究單位開始使用Hadoop。
⑸ 十大編程語言特點及應用領域是什麼
計算機的發展,促使了一個新的職業的出現,程序員是近些年出現的並且得到了廣泛關注的一個職業,相信這也是很多莘莘學子的職業夢想。但程序員也有很多種,並不是每一個程序員能夠精通所有的編程語言。所謂術業有專攻,如果將來志在編程世界的網友就要注意了,今天西安卓新思創移動互聯網教育產業聯盟的雷老師給大家推薦一下2014年最流行的編程語言,他們可以說是未來程序員們生存的工具。
1.Java
首先我要推薦的就是Java語言,相信只要略微了解編程的人就會聽過Java,其如今依然展現出強勢的增長勢頭,說其是目前最流行的編程語言也不為過。並且隨著移動和大數據的發展,以基於Java的Hadoop如今發展迅速,這也是Java編程人員更加千金難尋。其可以用於各種各樣的領域,包括企業應用及基礎設施,以及Web應用和移動開發。 >>>測試你是否適合學習Java<<<
2.JavaScript
JavaScript在Web應用上有著非常大的需求,主要目的是為了解決伺服器端語言,比如Perl,遺留的速度問題,為客戶提供更流暢的瀏覽效果。JavaScript主要用於實現為Web瀏覽器,以提供增強的用戶界面和動態網站。>>>點擊了解何為JavaScript<<<
最流行的編程語言C/C++.
3.C/C++
C和C++都是基於C的語言,是目前最流行的編程語言, C常被用作系統以及應用程序的編程語言,如嵌入式系統的應用程序。C++語言為C的增強,其在出現後迅速成為開發人員之間最流行的語言之一。它是用於開發系統軟體,應用軟體,設備驅動程序,嵌入式軟體,高性能伺服器和客戶端應用及娛樂軟體,如視頻游戲。 >>>看職業規劃專家如何評價C/C++<<<
4.C#
C#是微軟公司發布的一種面向對象的、運行於.NET Framework之上的高級程序設計語言。C#是微軟公司用來替代Java而開發的一種語言,並借鑒了Java,C,C++和Delphi的一些特點,如今C#已經成為微軟應用商店和開發成員非常歡迎的開發語言。
5.PHP
PHP是一種通用開源腳本語言,特別適合於Web開發,可嵌入到HTML中,它最初是用來設計動態網頁產生的。語法吸收了C語言、Java和Perl的特點,入門門檻較低,易於學習,使用廣泛。
針對蘋果系統的Objective-C.
6.Python
Python是應用於設計各種各樣的應用程序的動態語言, 往往比Tcl,Perl,Ruby,Scheme和Java更容易編寫。Python語法簡潔而清晰,具有豐富和強大的類庫。它常被昵稱為膠水語言,它能夠很輕松的把用其他語言製作的各種模塊(尤其是C/C++)輕松地聯結在一起。>>>看學哥學姐選的語言方向<<<
7.Ruby
Ruby是一種動態的,側重於簡單個高效的開源語言,他是一個優雅的語法,能夠很自然的閱讀和編寫,適合於快速開發,一般開發效率是JAVA的5倍。
8.Objective-C
對於鍾情於Apple設備的網友來說,Objective-C的流行就得益於蘋果的成功,其是增加了Smalltalk風格的消息在C編程語言中的反射,面向對象的語言。主要使用於蘋果系統和GNUstep這兩個使用OpenStep的標準的系統。隨著蘋果平台的巨大人氣,如今Objective-C語言被人們逐漸知道。
Web應用領域的HTML5.
9.HTML5
HTML5是用於構建網際網路的核心技術的標准語言,用於Web呈現內容,它是HTML標準的第五次修訂,如今,HTML5繼續在移動開發領域發揮著重要的作用,為互聯網的發展提供了多樣化的發展道路,37%的開發者依賴HTML5開發移動網站和Web應用程序 。
10.CSS
CSS是一種用來表現HTML)或XML等文件樣式的計算機語言。最常用於Web樣式和HTML和Xhtml介面,該語言可以應用與任何類型的XML文檔, CSS的設計主要是為了使文檔內容從文檔表示的分離,包括元素,如布局,顏色和字體。
總結:這是目前最流行的十種編程語言,這些語言針對不同的領域,對於初學者來說,如果你想學編程開發,那麼你需要了解這些語言的不同用戶,選擇自己喜歡的領域去研究,術業有專攻,這樣才能夠在未來職場有更好的發展。
⑹ 如何使用Python為Hadoop編寫一個簡單的MapRece程序
在這個實例中,我將會向大家介紹如何使用Python 為 Hadoop編寫一個簡單的MapRece
程序。
盡管Hadoop 框架是使用Java編寫的但是我們仍然需要使用像C++、Python等語言來實現Hadoop程序。盡管Hadoop官方網站給的示常式序是使用Jython編寫並打包成Jar文件,這樣顯然造成了不便,其實,不一定非要這樣來實現,我們可以使用Python與Hadoop 關聯進行編程,看看位於/src/examples/python/WordCount.py 的例子,你將了解到我在說什麼。
我們想要做什麼?
我們將編寫一個簡單的 MapRece 程序,使用的是C-Python,而不是Jython編寫後打包成jar包的程序。
我們的這個例子將模仿 WordCount 並使用Python來實現,例子通過讀取文本文件來統計出單詞的出現次數。結果也以文本形式輸出,每一行包含一個單詞和單詞出現的次數,兩者中間使用製表符來想間隔。
先決條件
編寫這個程序之前,你學要架設好Hadoop 集群,這樣才能不會在後期工作抓瞎。如果你沒有架設好,那麼在後面有個簡明教程來教你在Ubuntu Linux 上搭建(同樣適用於其他發行版linux、unix)
如何使用Hadoop Distributed File System (HDFS)在Ubuntu Linux 建立單節點的 Hadoop 集群
如何使用Hadoop Distributed File System (HDFS)在Ubuntu Linux 建立多節點的 Hadoop 集群
Python的MapRece代碼
使用Python編寫MapRece代碼的技巧就在於我們使用了 HadoopStreaming 來幫助我們在Map 和 Rece間傳遞數據通過STDIN (標准輸入)和STDOUT (標准輸出).我們僅僅使用Python的sys.stdin來輸入數據,使用sys.stdout輸出數據,這樣做是因為HadoopStreaming會幫我們辦好其他事。這是真的,別不相信!
Map: mapper.py
將下列的代碼保存在/home/hadoop/mapper.py中,他將從STDIN讀取數據並將單詞成行分隔開,生成一個列表映射單詞與發生次數的關系:
注意:要確保這個腳本有足夠許可權(chmod +x /home/hadoop/mapper.py)。
#!/usr/bin/env python
import sys
# input comes from STDIN (standard input)
for line in sys.stdin:
# remove leading and trailing whitespace
line = line.strip()
# split the line into words
words = line.split()
# increase counters
for word in words:
# write the results to STDOUT (standard output);
# what we output here will be the input for the
# Rece step, i.e. the input for recer.py
#
# tab-delimited; the trivial word count is 1
print '%s\\t%s' % (word, 1)在這個腳本中,並不計算出單詞出現的總數,它將輸出 "<word> 1" 迅速地,盡管<word>可能會在輸入中出現多次,計算是留給後來的Rece步驟(或叫做程序)來實現。當然你可以改變下編碼風格,完全尊重你的習慣。
Rece: recer.py
將代碼存儲在/home/hadoop/recer.py 中,這個腳本的作用是從mapper.py 的STDIN中讀取結果,然後計算每個單詞出現次數的總和,並輸出結果到STDOUT。
同樣,要注意腳本許可權:chmod +x /home/hadoop/recer.py
#!/usr/bin/env python
from operator import itemgetter
import sys
# maps words to their counts
word2count = {}
# input comes from STDIN
for line in sys.stdin:
# remove leading and trailing whitespace
line = line.strip()
# parse the input we got from mapper.py
word, count = line.split('\\t', 1)
# convert count (currently a string) to int
try:
count = int(count)
word2count[word] = word2count.get(word, 0) + count
except ValueError:
# count was not a number, so silently
# ignore/discard this line
pass
# sort the words lexigraphically;
#
# this step is NOT required, we just do it so that our
# final output will look more like the official Hadoop
# word count examples
sorted_word2count = sorted(word2count.items(), key=itemgetter(0))
# write the results to STDOUT (standard output)
for word, count in sorted_word2count:
print '%s\\t%s'% (word, count)
測試你的代碼(cat data | map | sort | rece)
我建議你在運行MapRece job測試前嘗試手工測試你的mapper.py 和 recer.py腳本,以免得不到任何返回結果
這里有一些建議,關於如何測試你的Map和Rece的功能:
——————————————————————————————————————————————
\r\n
# very basic test
hadoop@ubuntu:~$ echo "foo foo quux labs foo bar quux" | /home/hadoop/mapper.py
foo 1
foo 1
quux 1
labs 1
foo 1
bar 1
——————————————————————————————————————————————
hadoop@ubuntu:~$ echo "foo foo quux labs foo bar quux" | /home/hadoop/mapper.py | sort | /home/hadoop/recer.py
bar 1
foo 3
labs 1
——————————————————————————————————————————————
# using one of the ebooks as example input
# (see below on where to get the ebooks)
hadoop@ubuntu:~$ cat /tmp/gutenberg/20417-8.txt | /home/hadoop/mapper.py
The 1
Project 1
Gutenberg 1
EBook 1
of 1
[...]
(you get the idea)
quux 2
quux 1
——————————————————————————————————————————————
在Hadoop平台上運行Python腳本
為了這個例子,我們將需要三種電子書:
The Outline of Science, Vol. 1 (of 4) by J. Arthur Thomson\r\n
The Notebooks of Leonardo Da Vinci\r\n
Ulysses by James Joyce
下載他們,並使用us-ascii編碼存儲 解壓後的文件,保存在臨時目錄,比如/tmp/gutenberg.
hadoop@ubuntu:~$ ls -l /tmp/gutenberg/
total 3592
-rw-r--r-- 1 hadoop hadoop 674425 2007-01-22 12:56 20417-8.txt
-rw-r--r-- 1 hadoop hadoop 1423808 2006-08-03 16:36 7ldvc10.txt
-rw-r--r-- 1 hadoop hadoop 1561677 2004-11-26 09:48 ulyss12.txt
hadoop@ubuntu:~$
復制本地數據到HDFS
在我們運行MapRece job 前,我們需要將本地的文件復制到HDFS中:
hadoop@ubuntu:/usr/local/hadoop$ bin/hadoop dfs -FromLocal /tmp/gutenberg gutenberg
hadoop@ubuntu:/usr/local/hadoop$ bin/hadoop dfs -ls
Found 1 items
/user/hadoop/gutenberg <dir>
hadoop@ubuntu:/usr/local/hadoop$ bin/hadoop dfs -ls gutenberg
Found 3 items
/user/hadoop/gutenberg/20417-8.txt <r 1> 674425
/user/hadoop/gutenberg/7ldvc10.txt <r 1> 1423808
/user/hadoop/gutenberg/ulyss12.txt <r 1> 1561677
執行 MapRece job
現在,一切准備就緒,我們將在運行Python MapRece job 在Hadoop集群上。像我上面所說的,我們使用的是
HadoopStreaming 幫助我們傳遞數據在Map和Rece間並通過STDIN和STDOUT,進行標准化輸入輸出。
hadoop@ubuntu:/usr/local/hadoop$ bin/hadoop jar contrib/streaming/hadoop-0.19.1-streaming.jar
-mapper /home/hadoop/mapper.py -recer /home/hadoop/recer.py -input gutenberg/*
-output gutenberg-output
在運行中,如果你想更改Hadoop的一些設置,如增加Rece任務的數量,你可以使用「-jobconf」選項:
hadoop@ubuntu:/usr/local/hadoop$ bin/hadoop jar contrib/streaming/hadoop-0.19.1-streaming.jar
-jobconf mapred.rece.tasks=16 -mapper ...
一個重要的備忘是關於Hadoop does not honor mapred.map.tasks
這個任務將會讀取HDFS目錄下的gutenberg並處理他們,將結果存儲在獨立的結果文件中,並存儲在HDFS目錄下的
gutenberg-output目錄。
之前執行的結果如下:
hadoop@ubuntu:/usr/local/hadoop$ bin/hadoop jar contrib/streaming/hadoop-0.19.1-streaming.jar
-mapper /home/hadoop/mapper.py -recer /home/hadoop/recer.py -input gutenberg/*
-output gutenberg-output
additionalConfSpec_:null
null=@@@userJobConfProps_.get(stream.shipped.hadoopstreaming
packageJobJar: [/usr/local/hadoop-datastore/hadoop-hadoop/hadoop-unjar54543/]
[] /tmp/streamjob54544.jar tmpDir=null
[...] INFO mapred.FileInputFormat: Total input paths to process : 7
[...] INFO streaming.StreamJob: getLocalDirs(): [/usr/local/hadoop-datastore/hadoop-hadoop/mapred/local]
[...] INFO streaming.StreamJob: Running job: job_200803031615_0021
[...]
[...] INFO streaming.StreamJob: map 0% rece 0%
[...] INFO streaming.StreamJob: map 43% rece 0%
[...] INFO streaming.StreamJob: map 86% rece 0%
[...] INFO streaming.StreamJob: map 100% rece 0%
[...] INFO streaming.StreamJob: map 100% rece 33%
[...] INFO streaming.StreamJob: map 100% rece 70%
[...] INFO streaming.StreamJob: map 100% rece 77%
[...] INFO streaming.StreamJob: map 100% rece 100%
[...] INFO streaming.StreamJob: Job complete: job_200803031615_0021
[...] INFO streaming.StreamJob: Output: gutenberg-output hadoop@ubuntu:/usr/local/hadoop$
正如你所見到的上面的輸出結果,Hadoop 同時還提供了一個基本的WEB介面顯示統計結果和信息。
當Hadoop集群在執行時,你可以使用瀏覽器訪問 http://localhost:50030/ ,如圖:
檢查結果是否輸出並存儲在HDFS目錄下的gutenberg-output中:
hadoop@ubuntu:/usr/local/hadoop$ bin/hadoop dfs -ls gutenberg-output
Found 1 items
/user/hadoop/gutenberg-output/part-00000 <r 1> 903193 2007-09-21 13:00
hadoop@ubuntu:/usr/local/hadoop$
可以使用dfs -cat 命令檢查文件目錄
hadoop@ubuntu:/usr/local/hadoop$ bin/hadoop dfs -cat gutenberg-output/part-00000
"(Lo)cra" 1
"1490 1
"1498," 1
"35" 1
"40," 1
"A 2
"AS-IS". 2
"A_ 1
"Absoluti 1
[...]
hadoop@ubuntu:/usr/local/hadoop$
注意比輸出,上面結果的(")符號不是Hadoop插入的。
轉載僅供參考,版權屬於原作者。祝你愉快,滿意請採納哦
⑺ 如何使用Python為Hadoop編寫一個簡單的MapRece程序
MichaelG.Noll在他的Blog中提到如何在Hadoop中用Python編寫MapRece程序,韓國的gogamza在其Bolg中也提到如何用C編汪瞎寫MapRece程序(我稍微修改了一下原程序,因為他的Map對單詞切分使用tab鍵)。我合並他們兩人的文章,也讓國內的Hadoop用戶能夠使用別的語言來編寫MapRece程序。首先您得配好您的Hadoop集群,這方面的介紹網上比較多,這兒給個鏈接(Hadoop學習筆記二安裝部署)。HadoopStreaming幫助返鋒我們用非Java的編程語言使用MapRece,Streaming用STDIN(標准輸入)和STDOUT(標准輸出)來和我們編寫的Map和Rece進行數據的交換數據。任何能夠使用STDIN和STDOUT都可以用來編寫MapRece程序,比如我們用Python的sys.stdin和sys.stdout,或者是C中的stdin和stdout。我們還是使用Hadoop的例子WordCount來做示範如何編寫MapRece,在WordCount的例子中漏陵晌我們要解決計算在一批文檔中每一個單詞的出現頻率。首先我們在Map程序中會接受到這批文檔每一行的數據,然後我們編寫的Map程序把這一行按空格切開成一個數組。並對這個數組遍歷按"1"用標準的輸出輸出來,代表這個單詞出現了一次。在Rece中我們來統計單詞的出現頻率。PythonCodeMap:mapper.py#!/usr/bin/envpythonimportsys#={}#inputcomesfromSTDIN(standardinput)forlineinsys.stdin:#=line.strip()#=filter(lambdaword:word,line.split())#:#writetheresultstoSTDOUT(standardoutput);##Recestep,i.e.theinputforrecer.py##tab-delimited;thetrivialwordcountis1print'%s\t%s'%(word,1)Rece:recer.py#!/usr/bin/#={}#.stdin:#=line.strip()#parsetheinputwegotfrommapper.pyword,count=line.split()#convertcount(currentlyastring)tointtry:count=int(count)word2count[word]=word2count.get(word,0)+countexceptValueError:#countwasnotanumber,sosilently#ignore/discardthislinepass#sortthewordslexigraphically;##thisstepisNOTrequired,wejustdoitsothatour##wordcountexamplessorted_word2count=sorted(word2count.items(),key=itemgetter(0))#writetheresultstoSTDOUT(standardoutput)forword,countinsorted_word2count:print'%s\t%s'%(word,count)CCodeMap:Mapper.c#include#include#include#include#defineBUF_SIZE2048#defineDELIM"\n"intmain(intargc,char*argv[]){charbuffer[BUF_SIZE];while(fgets(buffer,BUF_SIZE-1,stdin)){intlen=strlen(buffer);if(buffer[len-1]=='\n')buffer[len-1]=0;char*querys=index(buffer,'');char*query=NULL;if(querys==NULL)continue;querys+=1;/*nottoinclude'\t'*/query=strtok(buffer,"");while(query){printf("%s\t1\n",query);query=strtok(NULL,"");}}return0;}h>h>h>h>Rece:Recer.c#include#include#include#include#defineBUFFER_SIZE1024#defineDELIM"\t"intmain(intargc,char*argv[]){charstrLastKey[BUFFER_SIZE];charstrLine[BUFFER_SIZE];intcount=0;*strLastKey='\0';*strLine='\0';while(fgets(strLine,BUFFER_SIZE-1,stdin)){char*strCurrKey=NULL;char*strCurrNum=NULL;strCurrKey=strtok(strLine,DELIM);strCurrNum=strtok(NULL,DELIM);/*necessarytocheckerrorbut.*/if(strLastKey[0]=='\0'){strcpy(strLastKey,strCurrKey);}if(strcmp(strCurrKey,strLastKey)){printf("%s\t%d\n",strLastKey,count);count=atoi(strCurrNum);}else{count+=atoi(strCurrNum);}strcpy(strLastKey,strCurrKey);}printf("%s\t%d\n",strLastKey,count);/*flushthecount*/return0;}h>h>h>h>首先我們調試一下源碼:chmod+xmapper.pychmod+xrecer.pyecho"foofooquuxlabsfoobarquux"|./mapper.py|./recer.pybar1foo3labs1quux2g++Mapper.c-oMapperg++Recer.c-oRecerchmod+xMapperchmod+xRecerecho"foofooquuxlabsfoobarquux"|./Mapper|./你可能看到C的輸出和Python的不一樣,因為Python是把他放在詞典里了.我們在Hadoop時,會對這進行排序,然後相同的單詞會連續在標准輸出中輸出.在Hadoop中運行程序首先我們要下載我們的測試文檔wget頁面中摘下的用php編寫的MapRece程序,供php程序員參考:Map:mapper.php#!/usr/bin/php$word2count=array();//inputcomesfromSTDIN(standardinput)while(($line=fgets(STDIN))!==false){//$line=strtolower(trim($line));//$words=preg_split('/\W/',$line,0,PREG_SPLIT_NO_EMPTY);//increasecountersforeach($wordsas$word){$word2count[$word]+=1;}}//writetheresultstoSTDOUT(standardoutput)////Recestep,i.e.theinputforrecer.pyforeach($word2countas$word=>$count){//tab-delimitedecho$word,chr(9),$count,PHP_EOL;}?>Rece:mapper.php#!/usr/bin/php$word2count=array();//inputcomesfromSTDINwhile(($line=fgets(STDIN))!==false){//$line=trim($line);//parsetheinputwegotfrommapper.phplist($word,$count)=explode(chr(9),$line);//convertcount(currentlyastring)toint$count=intval($count);//sumcountsif($count>0)$word2count[$word]+=$count;}//sortthewordslexigraphically////thissetisNOTrequired,wejustdoitsothatour////wordcountexamplesksort($word2count);//writetheresultstoSTDOUT(standardoutput)foreach($word2countas$word=>$count){echo$word,chr(9),$count,PHP_EOL;}?>作者:馬士華發表於:2008-03-05