標籤:style blog class java c ext
sudo apt-get install eclipse
安裝後開啟eclipse,提示出錯
An error has occurred. See the log file
/home/pengeorge/.eclipse/org.eclipse.platform_3.7.0_155965261/configuration/1342406790169.log.
查看錯誤記錄檔然後解決
開啟log檔案,看到下面的錯誤
!SESSION 2012-07-16 10:46:29.992 -----------------------------------------------
eclipse.buildId=I20110613-1736
java.version=1.7.0_05
java.vendor=Oracle Corporation
BootLoader constants: OS=linux, ARCH=x86, WS=gtk, NL=zh_CN
Command-line arguments: -os linux -ws gtk -arch x86
!ENTRY org.eclipse.osgi 4 0 2012-07-16 10:46:31.885
!MESSAGE Application error
!STACK 1
java.lang.UnsatisfiedLinkError: Could not load SWT library. Reasons:
no swt-gtk-3740 in java.library.path
no swt-gtk in java.library.path
Can‘t load library: /home/pengeorge/.swt/lib/linux/x86_64/libswt-gtk-3740.so
Can‘t load library: /home/pengeorge/.swt/lib/linux/x86/libswt-gtk.so
解決辦法
把相關檔案拷貝到~/.swt/lib/linux/x86下即可
cp /usr/lib/jni/libswt-*3740.so ~/.swt/lib/linux/x86_64然後重啟就可以了
eclipse在usr/lib/eclipse下
http://www.blogjava.net/hongjunli/archive/2007/08/15/137054.html 解決查看.class檔案
一個典型的hadoop工作流程會在別的地方產生資料檔案(如記錄檔),再將這些複製到HDFS中,接著由Mapreduce處理這個資料,通常不會直接讀取一個HDFS檔案,它們依靠MAPReduce架構讀取,並將之解析為獨立的記錄(鍵/值對),除非指定資料的匯入與匯出,否則幾乎用不到編程來讀寫HDFS檔案
Hadoop檔案命令既可以與HDFS檔案系統互動,也可以和本地檔案系統互動,也可以與Amazon S3檔案系統互動
hadoop fs -mkdir /user/chuck建立檔案夾 hadoop fs -ls/查看 hadoop fs -lsr /查看子目錄 hadoop fs -put example.txt . 添加檔案到/user/chuck後面的點相當於/user/chuck
注意這裡的example.txt是放在根目錄使用者下,比如student使用者,可以是 /home/student/example.txt 以上操作將本地檔案放入hdfs
當你把資料放入HDFS可以運行hadoop處理,處理過程將輸出一組新的HDFS檔案,查看hadoop fs -cat /user/chuck/pg20417.txt 讀取hadoop fs -get /user/chuck/pg20417.txt
可以在hadoop中使用UNIX的管道hadoop fs -cat /user/chuck/pg20417.txt | head 查看最後一KBhadoop fs -tail /user/chuck/pg20417.txt
刪除檔案hadoop fs -rm /user/chuck/pg20417.txt
查看Hadoop命令協助,例如要瞭解ls 則可以hadoop fs -help ls
Hadoop命令列有個getMerge用於將HDFS複製到本機電腦檔案之前進行合并,在Hadoop用於檔案操作的主類位於org.apache.hadoop.fs
輸入資料被分到不同節點之後,節點間的資料交換在“洗牌”階段,節點間通訊的唯一時間是“洗牌”階段,這個通訊約束對可擴充性有極大的協助
MapReduce提供了一種序列化鍵值對的方法,因此只有那些這些序列化的類能夠在這個架構中充當鍵或者值,實現Writable介面的可以是值,實現WritableComparable<T>介面的可以是鍵和值,鍵需要比較。一些預定義的類實現writablecomparable介面ti
實現的方法有:如何讀入資料,如何寫出資料,資料的排序比較
可以開始第一階段mapper,一個類要作為mapper,需要繼承mapreducebase基類和實現mapper介面
構造方法void configure(JobConif job)提取xml設定檔,或者應用程式主類中的參數,在資料處理之前調用該函數
析構方法void close()mapper結束前的一個方法,完成所有結尾工作,如關閉資料庫連接,開啟檔案等。
mapper只有一個方法map,用於處理一個單獨的鍵值對
reduce函數,通過迭代處理那些與指定鍵相關聯的值,產生一個(可能為空白)列表
在mapper和reduce之間還有個極其重要的步驟:將mapper的結果輸出給不同的reducer,這就是partitioner的工作
多個reducer實現並行計算,預設的做法是對鍵進行散列來確定reducer,hadoop通過國HashPartitionner來強制執行這個策略,但有時會讓你出錯
(上海,北京)和(上海,廣州),這兩行可以被送到不同的reducer航線離港地,若以上海為key,則處理兩次,若以北京為離港地,為key,也是處理兩次,若以廣州為可以,也是處理兩次,這時北京和廣州為key的各自兩次就是多餘的
這時我們應該對partitioner量身定製,只需要對departure進行散列,相同離港地的航線送往同一個reducer
一個partitioner需要實現configure函數(將hadoop作業應用在partitioner上),實現getPartition()函數(返回一個介於0到reduce任務數之間的整數,指向鍵值對要發送的reducer)
由partitioner決定鍵放入的位置(哪個reducer)
HDFS支持將多個檔案合并成一個大檔案到HDFS處理(效率還高點)處理後滿足MapReduce使用,MapReduce處理的原則之一就是將輸入資料分割成塊, 這些快可以在多台電腦上平行處理,在hadoop術語這些被稱之為輸入分區(Input split),這些分區應足夠小實現粒度並行,也不能太小
FSDataInputStream擴充了java.io.DataInputStream以支援隨機讀,MapReduce需要這個特性,因為一台機器可能被指派從輸入檔案的中間開始處理一個分區,如果沒有隨機訪問,則需要從頭一直讀到分區的位置
HDFS為了儲存MapReduce並行切分和處理的資料所做的設計,HDFS按Block Storage並分布在多個機器上,每個檔案塊為一個分區,如果每個分區/塊都由它所在的機器進行處理,就自動實現了並行,多個節點負責資料區塊以實現可靠性,MapReduce可以任意選擇一個包含分區/資料區塊副本的節點
輸入分區是一種邏輯劃分,而HDFS資料區塊是對輸入資料的物理劃分,當它們一致時,效率非常高,但在實際中從未達到完全一致,記錄可能會跨過資料區塊的邊界,處理特定分區的計算節點會從一個資料區塊中擷取記錄的一個片段