Hadoop葵花寶典(一)

1. 描述如何安裝配置Hadoophtml

參考:http://www.cnblogs.com/xia520pi/archive/2012/04/08/2437875.htmljava

  • 安裝Linux(虛擬機上)—CentOS:建立用戶,關閉防火牆,PS:不關防火牆沒法訪問Web管理頁面,刪除和增長節點時,會讓數據遷移處理時間長,可能假死,節點間沒法訪問等問題。若是須要防火牆對其餘的鏈接依舊起做用的話,就不能簡單的關閉它,而是能夠經過配置防火牆的過濾規則,即將hadoop須要監聽的那些端口配置到防火牆接受規則中。
  • 安裝VSFTP(FTP服務器軟件):yum –y install vsftpd,PS:FTP端口號爲20、21。
  • 本地安裝FlashFXP(FTP軟件):支持本地文件系統和服務器文件系統的文件互傳。
  • 本地安裝SecureSRT(支持SSH的終端仿真程序):用於鏈接Linux。
  • 網絡配置:修改主機名,修改ip,修改hosts文件(用來配置主機將用的DNS服務器信息,將集羣中的全部機器的IP與主機名添加,這樣就可經過主機名通訊)
  • 安裝JDK並配置環境變量(/etc/profile)
  • 設置ssh免密碼登陸:Master生成密碼對、設置SSH
  • 解壓縮hadoop安裝包,並配置環境變量
  • 修改配置文件($HADOOP_HOME/conf):hadoop-env.sh(添加java環境變量)  core-site.xml(配置HDFS的地址和端口號)  hdfs-site.xml(配置HDFS,默認副本爲3) mapred-site.xml(配置MapReduce,配置JobTracker的地址和端口)
  • 格式化hdfs文件系統 (hadoop namenode -format)
  • 啓動hadoop ($HADOOP_HOME/bin/start-all.sh)
  • 使用jps查看進程

2. 列出正常工做的Hadoop集羣中,Hadoop都啓動哪些進程,描述功能node

  • NameNode: HDFS的守護進程,負責記錄文件是如何分割成數據塊,以及這些數據塊分別被存儲到那些數據節點上,它的主要功能是對內存及IO進行集中管理
  • Secondary NameNode:輔助後臺程序,與NameNode進行通訊,以便按期保存HDFS元數據的快照。
  • DataNode:負責把HDFS數據塊讀寫到本地的文件系統。
  • JobTracker:負責分配task,並監控全部運行的task。
  • TaskTracker:負責執行具體的task,並與JobTracker進行交互

3. 啓動時報以下錯誤如何解決mysql

ERROR org-apache.hadoop.hdfs-server.namenode.NameNode org.apache.hadoop.hdfs.server.common.InconsistentFSStateException:   Direction /tmp/Hadoop-root/dfs/name is in an inconsisrtent state: storage directory dose not existent or is not accessible.程序員

…...sql

問題分析:NameNode沒有正常啓動數據庫

解決方法:apache

① hadoop namenode –format(格式化namenode):若是每次都要執行這個命令才能啓動namenode,那是萬萬不行的編程

② /tmp目錄下的文件是臨時文件,hadoop會將各類信息存到/tmp下,便會被按期清除,爲避免這種狀況,在hdfs-site.xml中添加屬性dfs.name.dir設置值爲想存的目錄。服務器

4. Hadoop命令(進入Hadoop_HOME目錄,/etc/profile中配置)

①啓動Hadoop;sh bin/start-all.sh

②關閉Hadoop:sh bin/stop-all.sh

③文件操做 :sh bin/hadoop fs ...(後面命令操做基本同Linux)

1)查看文件列表

查看hdfs中/user/admin/aaron目錄下的文件:sh bin/hadoop fs -ls /user/admin/aaron

2)建立文件目錄 

hdfs中/user/admin/aaron目錄下再新建一個叫作newDir的新目錄:sh bin/hadoop fs -mkdir /user/admin/aaron/newDir

3)刪除文件 

刪除hdfs中/user/admin/aaron目錄下一個名叫needDelete的文件:sh bin/hadoop fs -rm /user/admin/aaron/needDelete

刪除hdfs中/user/admin/aaron目錄以及該目錄下的全部文件 :sh bin/hadoop fs -rmr /user/admin/aaron

4)上傳文件 

上傳一個本機/home/admin/newFile的文件到hdfs中/user/admin/aaron目錄下:sh bin/hadoop fs –put /home/admin/newFile/user/admin/aaron/

5)下載文件 

下載hdfs中/user/admin/aaron目錄下的newFile文件到本機/home/admin/newFile中 :sh bin/hadoop fs –get /user/admin/aaron/newFile /home/admin/newFile

④MapReduce Job操做 

1)提交MapReduce Job

運行一個/home/admin/hadoop/job.jar的MapReduce Job:sh bin/hadoop jar /home/admin/hadoop/job.jar [jobMainClass] [jobArgs]

2)殺死某個正在運行的Job:(hadoop job -list, 假設Job_Id爲:job_201005310937_0053)sh bin/hadoop job -kill job_201005310937_0053

⑤添加datanode節點(在datanode中啓動執行啓動datanode命令):sh hadoop-daemon.sh start datanode 

⑥刪除datanode節點(namenode上):sh hadoop dfsadmin  -refreshServiceAcl

 5. Hadoop調度器

Hadoop調度器將系統中空閒的資源按必定策略分配給做業,比較流行的三種調度器有:默認調度器FIFO,計算能力調度器Capacity Scheduler,公平調度器Fair Scheduler

①默認調度器FIFO

hadoop中默認的調度器,採用先進先出的原則,按照到達時間的前後選擇被執行的做業。

② 計算能力調度器Capacity Scheduler

支持多個隊列,做業先按照運行任務數和計算資源的比值選擇小(資源佔用少)的隊列,在每一個隊列裏在按照FIFO調度策略。

③ 公平調度器Fair Scheduler

每一個隊列中的資源可配置,同一隊列中的做業公平共享隊列中全部資源

6. 當前日誌採樣格式爲

a,b,c,d

b,b,f,e

a,a,c,f

寫出MapReduce程序,計算第四列每一個元素出現的個數

 1 package org.apache.hadoop.WordCount1;  2 
 3 import java.io.IOException;  4 
 5 import org.apache.hadoop.conf.Configuration;  6 
 7 import org.apache.hadoop.fs.Path;  8 
 9 import org.apache.hadoop.io.IntWritable;  10 
 11 import org.apache.hadoop.io.Text;  12 
 13 import org.apache.hadoop.mapreduce.Job;  14 
 15 import org.apache.hadoop.mapreduce.Mapper;  16 
 17 import org.apache.hadoop.mapreduce.Reducer;  18 
 19 import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;  20 
 21 import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;  22 
 23 import org.apache.hadoop.util.GenericOptionsParser;  24 
 25 public class WordCount {  26 
 27   public static class MyMapper  28 
 29       extends Mapper<Object, Text, Text, IntWritable>{  30 
 31       public void map(Object key, Text value, Context context)  32 
 33         throws IOException, InterruptedException {  34 
 35         String[] split = value.toString().split("\t");  36                     
 37                     for(String word:split){  38 
 39         context.write(split[3], 1);  40                       
 41  }  42 
 43       }  44 
 45     }  46 
 47   }  48 
 49   public static class MyReducer  50 
 51       extends Reducer<Text,IntWritable,Text,IntWritable> {  52 
 53       private IntWritable result = new IntWritable();  54 
 55       public void reduce(Text key, Iterable<IntWritable> values,Context context)  56 
 57            throws IOException, InterruptedException {  58 
 59         int sum = 0;  60 
 61         for (IntWritable val : values) {  62 
 63            sum += val.get();  64 
 65         }  66 
 67       result.set(sum);  68 
 69       context.write(key, result);  70 
 71     }  72 
 73   }  74 
 75  
 76 
 77   public static void main(String[] args) throws Exception {  78 
 79     Configuration conf = new Configuration();  80 
 81     Job job = new Job(conf, "word count");  82 
 83        job.setJarByClass(WordCount1.class);  84 
 85       job.setMapperClass(MyMapper.class);  86 
 87     job.setReducerClass(MyReducer.class);  88 
 89     job.setOutputKeyClass(Text.class);  90 
 91     job.setOutputValueClass(IntWritable.class);  92 
 93     FileInputFormat.addInputPath(job, new Path(otherArgs[0]));  94 
 95     FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));  96 
 97     JobClient.runJob(conf);  98 }  99 
100 }

7. 你認爲用Java、Streaming、pipe方式開發MapReduce。各有哪些優缺點

Java:可實現複雜邏輯,編程繁瑣

Streaming:優勢:支持多種語言編寫程序,直接;缺點:細節沒法控制(不能寫自定義的partitioner, combiner,writablecomparable等),慢(交換過程不如Java API直接)

Pipe: 容許C++程序員編寫mapreduce程序,它容許用戶混用C++和Java的RecordReader, Mapper, Partitioner,Rducer和RecordWriter等五個組件。

Hadoop Streaming:

http://dongxicheng.org/mapreduce/hadoop-streaming-programming/

Hadoop Pipes:

http://dongxicheng.org/mapreduce/hadoop-pipes-programming/

8. Hive有哪些方式保存元數據,各有哪些特色(鏈接到數據庫的三種模式及存儲方式)

Hive的metastore組件是hive元數據集中存放地。Metastore組件包括兩個部分:metastore服務和後臺數據的存儲。後臺數據存儲的介質就是關係數據庫,例如hive默認的嵌入式磁盤數據庫derby,還有mysql數據庫。Metastore服務是創建在後臺數據存儲介質之上,而且能夠和hive服務進行交互的服務組件。

1) 單用戶模式:內存數據庫derby,較小,不經常使用

2) 多用戶模式:本地MySQL,較經常使用

3) 遠程服務器模式:遠程mysql,不經常使用

9. Hadoop實現join的幾種方法

1) reduce side join

reduce side join是一種最簡單的join方式,其主要思想以下:

在 map階段,map函數同時讀取兩個文件File1和File2,爲了區分兩種來源的key/value數據對,對每條數據打一個標籤(tag),比 如:tag=0表示來自文件File1,tag=2表示來自文件File2。即:map階段的主要任務是對不一樣文件中的數據打標籤。

在reduce階段,reduce函數獲取key相同的來自File1和File2文件的value list, 而後對於同一個key,對File1和File2中的數據進行join(笛卡爾乘積:在數學中,兩個集合XY的笛卡尓積表示爲X × Y,第一個對象是X的成員而第二個對象是Y的全部可能的有序對的其中一個成員。假設集合A={a, b},集合B={0, 1, 2},則兩個集合的笛卡爾積爲{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)})。即:reduce階段進行實際的鏈接操做。

2) map side join

之因此存在reduce side join,是由於在map階段不能獲取全部須要的join字段,即:同一個key對應的字段可能位於不一樣map中。Reduce side join是很是低效的,由於shuffle階段要進行大量的數據傳輸。

Map side join是針對如下場景進行的優化:兩個待鏈接表中,有一個表很是大,而另外一個表很是小,以致於小表能夠直接存放到內存中。這樣,咱們能夠將小表複製多份,讓每一個map task內存中存在一份(好比存放到hash table中),而後只掃描大表:對於大表中的每一條記錄key/value,在hash table中查找是否有相同的key的記錄,若是有,則鏈接後輸出便可。

PS:MySQL Join

① Inner Join:SELECT * FROM TableA INNERJOIN TableB

產生的結果是A、B表的交集

②Full Outer join:SELECT * FROM TableA FULLOUTER JOIN TableB

產生的結果是A、B表的並集,對於沒有匹配的記錄,則會以null作爲值

③Left outer join

SELECT * FROM TableA LEFTOUTER JOIN TableB ONTableA.name =TableB.name產生A的徹底集,B中匹配的則有值,沒匹配的NULL取代

SELECT* FROM TableA LEFTOUTER JOIN TableB ONTableA.name=TableB.nameWHERE TableB.id IS null

產生在A表有在B表沒有的集合

SELECT * FROM TableA FULLOUTER JOIN TableB ONTableA.name =TableB.nameWHERE TableA.id IS null ORTableB.id IS null

產生A表和B表都沒有出現的 即AB表除了交集的集合

10. Hadoop怎樣實現二級排序

在Hadoop中,默認狀況下是按照key進行排序,若是要按照value進行排序怎麼辦?

有兩種方法進行二次排序,分別爲:buffer and in memory sort和 value-to-key conversion。

buffer and in memory sort

主要思想是:在reduce()函數中,將某個key對應的全部value保存下來,而後進行排序。 這種方法最大的缺點是:可能會形成out of memory。

value-to-key conversion

主要思想是:將key和部分value拼接成一個組合key(實現WritableComparable接口或者調 setSortComparatorClass函數),這樣reduce獲取的結果即是先按key排序,後按value排序的結果,須要注意的是,用戶須要本身實現Paritioner,以便只按照key進行數據劃分。Hadoop顯式的支持二次排序,在Configuration類中有個 setGroupingComparatorClass()方法,可用於設置排序group的key值

http://dongxicheng.org/mapreduce/hadoop-join-two-tables/

相關文章
相關標籤/搜索