部署hadoop集羣

Hadoop部署


1. 安裝完全分佈式Hadoop


1.1 安裝準備工作


1.1.1 規劃 

本安裝示例將使用六臺服務器(CentOS 6.5 64bit)來實現,其規劃如下所示:

     IP地址                主機名            運行的進程或扮演的角色
192.168.40.30  master.dbq168.com        NameNode,JobTracker,Hive,Hbase
192.168.40.31  snn.dbq168.com           SecondaryNameNode
192.168.40.32  datanode-1.dbq168.com    DataNode,TaskTracker,zookeeper,regionserver
192.168.40.33  datanode-2.dbq168.com    DataNode,TaskTracker,zookeeper,regionserver
192.168.40.35  datanode-3.dbq168.com    DataNode,TaskTracker,zookeeper,regionserver
192.168.40.34  mysql.dbq168.com         MySQL


1.1.2 版本說明:

用到的應用程序:

CentOS   release 6.5 (Final)
kernel:  2.6.32-431.el6.x86_64
JDK:     jdk-7u45-linux-x64.gz
Hadoop: hadoop-2.6.1.tar.gz
Hive:    apache-hive-1.2.1-bin.tar.gz
Hbase:   hbase-1.1.2-bin.tar.gz
zookeeper:zookeeper-3.4.6.tar.gz


1.1.3 hosts文件:

設置集羣各節點的/etc/hosts文件內容如下:

192.168.40.30   master master.dbq168.com
192.168.40.31   snn     snn.dbq168.com
192.168.40.32   datanode-1 datanode-1.dbq168.com
192.168.40.33   datanode-2 datanode-2.dbq168.com
192.168.40.35   datanode-3 datanode-3.dbq168.com
192.168.40.34   mysql   mysql.dbq168.com


1.1.4 SSH免密碼登陸

主要是爲了方便管理,或者可以使用自動化管理工具,如ansible等;

[root@master ~]# ssh-keygen -t rsa -P ''
[root@master ~]# ssh-copy-id -i .ssh/id_rsa.pub root@master
[root@master ~]# ssh-copy-id -i .ssh/id_rsa.pub root@snn
[root@master ~]# ssh-copy-id -i .ssh/id_rsa.pub root@datanode-1
[root@master ~]# ssh-copy-id -i .ssh/id_rsa.pub root@datanode-2
[root@master ~]# ssh-copy-id -i .ssh/id_rsa.pub root@datanode-3
[root@master ~]# ssh-copy-id -i .ssh/id_rsa.pub root@mysql


先在集羣中的每個節點上建立運行hadoop進程的用戶hadoop並給其設定密碼。

# useradd hadoop
# echo "hadoop" | passwd --stdin hadoop 
[root@master ~]# for i in 30 31 32 33 35;do ssh 192.168.40.$i "useradd hadoop && echo 'hadoop'|passwd --stdin hadoop";done



而後配置master節點的hadoop用戶能夠以基於密鑰的驗正方式登錄其它各節點,以便啓動進程並執行監控等額外的管理工作。以下命令在master節點上執行即可。

[root@master ~]# su - hadoop
[hadoop@master ~]$ ssh-keygen -t rsa -P '' 
[hadoop@master ~]$ ssh-copy-id -i .ssh/id_rsa.pub hadoop@datanode-1
[hadoop@master ~]$ ssh-copy-id -i .ssh/id_rsa.pub hadoop@datanode-2
[hadoop@master ~]$ ssh-copy-id -i .ssh/id_rsa.pub hadoop@snn
......


測試執行命令:

[hadoop@master ~]$ ssh snn 'ls /home/hadoop/ -la' 
[hadoop@master ~]$ ssh datanode 'ls /home/hadoop/ -la'


1.2 安裝JDK

[root@master ~]# for i in 30 31 32 33 35;do scp jdk-7u45-linux-x64.gz 192.168.40.$i:/usr/local/;done
[root@master ~]# for i in 30 31 32 33 35;do ssh 192.168.40.$i 'tar -xf /usr/local/jdk-7u45-linux-x64.gz -C /usr/local/';done
[root@master ~]# for i in 30 31 32 33 35;do ssh 192.168.40.$i 'ln -sv /usr/local/jdk-7u45-linux-x64 /usr/local/java';done

編輯/etc/profile.d/java.sh,在文件中添加如下內容:

JAVA_HOME=/usr/local/java/
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME PATH

複製變量文件到其他節點:

[root@master ~]# for i in 30 31 32 33 35;do scp /etc/profile.d/java.sh 192.168.40.$i:/etc/profile.d/;done


切換至hadoop用戶,並執行如下命令測試jdk環境配置是否就緒。

# su - hadoop
$ java -version
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)


1.3 安裝Hadoop

Hadoop通常有三種運行模式:本地(獨立)模式、僞分佈式(Pseudo-distributed)模式和完全分佈式(Fully distributed)模式。

    本地模式,也是Hadoop的默認模式,此時hadoop使用本地文件系統而非分佈式文件系統,而且也不會啓動任何hadoop相關進程,map和reduce都作爲同一進程的不同部分來執行。因此本地模式下的hadoop僅運行於本機,適合開發調試map reduce應用程序但卻避免複雜的後續操作;

    僞分佈式模式:Hadoop將所有進程運行於同一個主機,但此時Hadoop將使用分佈式文件系統,而且各Job也是由Jobtracker服務管理的獨立進程;同時僞分佈式的hadoop集羣只有一個節點,因此HDFS的塊複製將限制爲單個副本,其中Secondary-master和slave也都將運行於本機。 這種模式除了並非真正意義上的分佈式以外,其程序執行邏輯完全類似於分佈式,因此常用於開發人員測試程序執行;

    完全分佈式:能真正發揮Hadoop的威力,由於Zookeeper實現高可用依賴於基數法定票數(an odd-numbered quorum),因此,完全分佈式環境至少需要三個節點。


本文檔採用完全分佈式模式安裝。


集羣中的每個節點均需要安裝Hadoop,以根據配置或需要啓動相應的進程等,因此,以下安裝過程需要在每個節點上分別執行。

# tar xf hadoop-2.6.1.tar.gz -C /usr/local
# for i in 30 31 32 33 35;do ssh 192.168.40.$i 'chown hadoop.hadoop -R /usr/local/hadoop-2.6.1';done
# for i in 30 31 32 33 35;do ssh 192.168.40.$i 'ln -sv /usr/local/hadoop-2.6.1 /usr/local/hadoop';done


Master上執行:

然後編輯/etc/profile,設定HADOOP_HOME環境變量的值爲hadoop的解壓目錄,並讓其永久有效。編輯/etc/profile.d/hadoop.sh,添加如下內容:

HADOOP_HOME=/usr/local/hadoop
PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
export HADOOP_BASE PATH


切換至hadoop用戶,並執行如下命令測試jdk環境配置是否就緒。

$ hadoop version
Hadoop 2.6.1
Subversion https://git-wip-us.apache.org/repos/asf/hadoop.git -r b4d876d837b830405ccdb6af94742f99d49f9c04
Compiled by jenkins on 2015-09-16T21:07Z
Compiled with protoc 2.5.0
From source with checksum ba9a9397365e3ec2f1b3691b52627f
This command was run using /usr/local/hadoop-2.6.1/share/hadoop/common/hadoop-common-2.6.1.jar



1.4 配置Hadoop


集羣中的每個節點上Hadoop的配置均相同,Hadoop在啓動時會根據配置文件判定當前節點的角色及所需要運行的進程等,因此,下述的配置文件修改需要在每一個節點上運行。


(1) 修改core-site.xml內容如下

[hadoop@master ~]$ cd /usr/local/hadoop/etc/hadoop/
[hadoop@master hadoop]$ vim core-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
    <property>
        <name>fs.default.name</name>
        <value>hdfs://master.dbq168.com:8020</value>
        <final>true</final>
        <description>The name of the default file system. A URI whose scheme and authority determine the FileSystem implimentation.</description>
    </property>
</configuration>


(2)修改mapred-site.xml文件爲如下內容

[hadoop@master ~]$ cd /usr/local/hadoop/etc/hadoop/
[hadoop@master hadoop]$ cp mapred-site.xml.template mapred-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
    <property>
        <name>mapred.job.tracker</name>
        <value>master.dbq168.com:8021</value>
        <final>true</final>
        <description>The host and port that the MapReduce JobTracker runs at. </description>
    </property>
</configuration>

(3) 修改hdfs-site.xml文件爲如下內容 

[hadoop@master hadoop]$ cd /usr/local/hadoop/etc/hadoop
<configuration>
    <property>
          <name>dfs.replication</name>
          <value>3</value>
          <description>The actual number of replications can be specified when the file is created.</description>
    </property>
     <property>
        <name>dfs.data.dir</name>
        <value>/hadoop/data</value>
        <final>ture</final>
        <description>The directories where the datanode stores blocks.</description>
    </property>
     <property>
        <name>dfs.name.dir</name>
        <value>/hadoop/name</value>
        <final>ture</final>
        <description>The directories where the namenode stores its persistent matadata.</description>
    </property>
    <property>
        <name>fs.checkpoint.dir</name>
        <value>/hadoop/namesecondary</value>
        <final>ture</final>
        <description>The directories where the secondarynamenode stores checkpoints.</description>
    </property>                                                                                                
</configuration>



說明:根據此配置,需要事先在各節點上創建/hadoop/,並讓hadoop用戶對其具有全部權限。也可以不指定最後三個屬性,讓Hadoop爲其使用默認位置。

[root@master ~]# for i in 30 31 32 33 35;do ssh 192.168.40.$i 'mkdir /hadoop/{name,data,namesecondary} -pv; chown -R hadoop.hadoop -R /hadoop';done


(4)指定SecondaryNameNode節點的主機名或IP地址,本示例中爲如下內容:

hadoop從2.2.0以後就沒有masters文件了,更改需要在hdfs-site.xml裏寫下本例中的:

<property>    
        <name>dfs.secondary.http.address</name>    
        <value>snn:50090</value>    
        <description>NameNode get the newest fsimage via dfs.secondary.http.address</description>    
    </property>



(5)修改/usr/local/hadoop/etc/hadoop/slaves文件,指定各DataNode節點的主機名或IP地址,本示例中只有一個DataNode:

datanode-1
datanode-2
datanode-3


(6)初始化數據節點,在master上執行如下命令

$ hadoop namenode -format


(7)copy文件到兩個節點:

[hadoop@master hadoop]$ for i in 30 31 32 33 35;do scp mapred-site.xml core-site.xml slaves yarn-site.xml hdfs-site.xml 192.168.40.$i:/usr/local/hadoop/etc/hadoop/;done


1.5 啓動Hadoop


在master節點上執行Hadoop的start-all.sh腳本即可實現啓動整個集羣。

[hadoop@master ~]$ start-all.sh

其輸出內容如下所示:

starting namenode, logging to /usr/local/hadoop/logs/hadoop-hadoop-namenode-master.dbq168.com.out
datanode.dbq168.com: starting datanode, logging to /usr/local/hadoop/logs/hadoop-hadoop-datanode-datanode.dbq168.com.out
snn.dbq168.com: starting secondarynamenode, logging to /usr/local/hadoop/logs/hadoop-hadoop-secondarynamenode-node3.dbq168.com.out
starting jobtracker, logging to /usr/local/hadoop/logs/hadoop-hadoop-jobtracker-master.dbq168.com.out
datanode.dbq168.com: starting tasktracker, logging to /usr/local/hadoop/logs/hadoop-hadoop-tasktracker-datanode.dbq168.com.out


如果要停止Hadoop的各進程,則使用stop-all.sh腳本即可。


不過,在一個較大規模的集羣環境中,NameNode節點需要在內在中維護整個名稱空間中的文件和塊的元數據信息,因此,其有着較大的內在需求;而在運行着衆多MapReduce任務的環境中,JobTracker節點會用到大量的內存和CPU資源,因此,此場景中通常需要將NameNode和JobTracker運行在不同的物理主機上,這也意味着HDFS集羣的主從節點與MapReduce的主從節點將分屬於不同的拓撲。啓動HDFS的主從進程則需要在NameNode節點上使用start-dfs.sh腳本,而啓動MapReduce的各進程則需要在JobTracker節點上通過start-mapred.sh腳本進行。這兩個腳本事實上都是通過hadoop-daemons.sh腳本來完成進程啓動的。



1.6 管理JobHistory Server


啓動可以JobHistory Server,能夠通過Web控制檯查看集羣計算的任務的信息,執行如下命令:

[hadoop@master logs]$ /usr/local/hadoop/sbin/mr-jobhistory-daemon.sh start historyserver


默認使用19888端口。

通過訪問http://master:19888/查看任務執行歷史信息。

終止JobHistory Server,執行如下命令:

[hadoop@master logs]$ /usr/local/hadoop/sbin/mr-jobhistory-daemon.sh stop historyserver

1.7 檢查

Master:

[hadoop@master hadoop]$ jps
14846 NameNode
15102 ResourceManager
15345 Jps
12678 JobHistoryServer

DataNode:

[hadoop@datanode ~]$ jps
12647 Jps
12401 DataNode
12523 NodeManager

SecondaryNode:

[hadoop@snn ~]$ jps
11980 SecondaryNameNode
12031 Jps
#查看服務器監聽端口:
[hadoop@master ~]$ netstat -tunlp |grep java
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 192.168.40.30:8020          0.0.0.0:*                   LISTEN      1294/java           
tcp        0      0 0.0.0.0:50070               0.0.0.0:*                   LISTEN      1294/java           
tcp        0      0 ::ffff:192.168.40.30:8088   :::*                        LISTEN      1551/java           
tcp        0      0 ::ffff:192.168.40.30:8030   :::*                        LISTEN      1551/java           
tcp        0      0 ::ffff:192.168.40.30:8031   :::*                        LISTEN      1551/java           
tcp        0      0 ::ffff:192.168.40.30:16000  :::*                        LISTEN      2008/java           
tcp        0      0 ::ffff:192.168.40.30:8032   :::*                        LISTEN      1551/java           
tcp        0      0 ::ffff:192.168.40.30:8033   :::*                        LISTEN      1551/java           
tcp        0      0 :::16010                    :::*                        LISTEN      2008/java

用瀏覽器打開:

    http://master:8088   #查看、配置集羣信息
    http://master:50070  #類似於Hadoop的一個dashboard


1.8 測試Hadoop

    Hadoop提供了MapReduce編程框架,其並行處理能力的發揮需要通過開發Map及Reduce程序實現。爲了便於系統測試,Hadoop提供了一個單詞統計的應用程序算法樣例,其位於Hadoop安裝目錄下${HADOOP_BASE}/share/hadoop/mapreduce/名稱類似hadoop-examples-*.jar的文件中。除了單詞統計,這個jar文件還包含了分佈式運行的grep等功能的實現,這可以通過如下命令查看。    

[hadoop@master ~]$ hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.1.jar 
An example program must be given as the first argument.
Valid program names are:
  aggregatewordcount: An Aggregate based map/reduce program that counts the words in the input files.
  aggregatewordhist: An Aggregate based map/reduce program that computes the histogram of the words in the input files.
  bbp: A map/reduce program that uses Bailey-Borwein-Plouffe to compute exact digits of Pi.
  dbcount: An example job that count the pageview counts from a database.
  distbbp: A map/reduce program that uses a BBP-type formula to compute exact bits of Pi.
  grep: A map/reduce program that counts the matches of a regex in the input.
  join: A job that effects a join over sorted, equally partitioned datasets
  multifilewc: A job that counts words from several files.
  pentomino: A map/reduce tile laying program to find solutions to pentomino problems.
  pi: A map/reduce program that estimates Pi using a quasi-Monte Carlo method.
  randomtextwriter: A map/reduce program that writes 10GB of random textual data per node.
  randomwriter: A map/reduce program that writes 10GB of random data per node.
  secondarysort: An example defining a secondary sort to the reduce.
  sort: A map/reduce program that sorts the data written by the random writer.
  sudoku: A sudoku solver.
  teragen: Generate data for the terasort
   terasort: Run the terasort
  teravalidate: Checking results of terasort
  wordcount: A map/reduce program that counts the words in the input files.
  wordmean: A map/reduce program that counts the average length of the words in the input files.
  wordmedian: A map/reduce program that counts the median length of the words in the input files.
  wordstandarddeviation: A map/reduce program that counts the standard deviation of the length of the words in the input files.

 

下面我們用wordcount來計算單詞顯示數量:

在HDFS的wc-in目錄中存放兩個測試文件,而後運行wordcount程序實現對這兩個測試文件中各單詞出現次數進行統計的實現過程。首先創建wc-in目錄,並複製文件至HDFS文件系統中。

$ hadoop fs -mkdir wc-in
$ hadoop fs -put /etc/rc.d/init.d/functions /etc/profile wc-in


接下來啓動分佈式任務,其中的WC-OUT爲reduce任務執行結果文件所在的目錄,此目標要求事先不能存在,否則運行將會報錯。

[hadoop@master ~]$ hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.1.jar wordcount wc-in WC-OUT
15/11/05 15:18:59 INFO Configuration.deprecation: session.id is deprecated. Instead, use dfs.metrics.session-id
15/11/05 15:18:59 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId=
15/11/05 15:19:00 INFO input.FileInputFormat: Total input paths to process : 2
15/11/05 15:19:00 INFO mapreduce.JobSubmitter: number of splits:2
15/11/05 15:19:01 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_local244789678_0001
15/11/05 15:19:02 INFO mapreduce.Job: The url to track the job: http://localhost:8080/
15/11/05 15:19:02 INFO mapreduce.Job: Running job: job_local244789678_0001
15/11/05 15:19:02 INFO mapred.LocalJobRunner: OutputCommitter set in config null
15/11/05 15:19:02 INFO mapred.LocalJobRunner: OutputCommitter is
org.apache.hadoop.mapreduce.lib.output.FileOutputCommitter
15/11/05 15:19:02 INFO mapred.LocalJobRunner: Waiting for map tasks
15/11/05 15:19:02 INFO mapred.LocalJobRunner: Starting task: attempt_local244789678_0001_m_000000_0
15/11/05 15:19:02 INFO mapred.Task:  Using ResourceCalculatorProcessTree : [ ]
15/11/05 15:19:02 INFO mapred.MapTask: Processing split: hdfs://master.dbq168.com:8020/user/hadoop/wc-in/functions:0+18586
15/11/05 15:19:03 INFO mapreduce.Job: Job job_local244789678_0001 running in uber mode : false
15/11/05 15:19:03 INFO mapreduce.Job:  map 0% reduce 0%
15/11/05 15:19:03 INFO mapred.MapTask: (EQUATOR) 0 kvi 26214396(104857584)
15/11/05 15:19:03 INFO mapred.MapTask: mapreduce.task.io.sort.mb: 100
15/11/05 15:19:03 INFO mapred.MapTask: soft limit at 83886080
15/11/05 15:19:03 INFO mapred.MapTask: bufstart = 0; bufvoid = 104857600
15/11/05 15:19:03 INFO mapred.MapTask: kvstart = 26214396; length = 6553600
15/11/05 15:19:03 INFO mapred.MapTask: Map output collector class = org.apache.hadoop.mapred.MapTask$MapOutputBuffer
15/11/05 15:19:03 INFO mapred.LocalJobRunner: 
15/11/05 15:19:03 INFO mapred.MapTask: Starting flush of map output
15/11/05 15:19:03 INFO mapred.MapTask: Spilling map output
15/11/05 15:19:03 INFO mapred.MapTask: bufstart = 0; bufend = 27567; bufvoid = 104857600
15/11/05 15:19:03 INFO mapred.MapTask: kvstart = 26214396(104857584); kvend = 26203416(104813664); length = 10981/6553600
15/11/05 15:19:04 INFO mapred.MapTask: Finished spill 0
15/11/05 15:19:04 INFO mapred.Task: Task:attempt_local244789678_0001_m_000000_0 is done. And is in the process of committing
15/11/05 15:19:04 INFO mapred.LocalJobRunner: map
15/11/05 15:19:04 INFO mapred.Task: Task 'attempt_local244789678_0001_m_000000_0' done.
15/11/05 15:19:04 INFO mapred.LocalJobRunner: Finishing task: attempt_local244789678_0001_m_000000_0
15/11/05 15:19:04 INFO mapred.LocalJobRunner: Starting task: attempt_local244789678_0001_m_000001_0
15/11/05 15:19:04 INFO mapred.Task:  Using ResourceCalculatorProcessTree : [ ]
15/11/05 15:19:04 INFO mapred.MapTask: Processing split: hdfs://master.dbq168.com:8020/user/hadoop/wc-in/profile:0+1796
15/11/05 15:19:04 INFO mapred.MapTask: (EQUATOR) 0 kvi 26214396(104857584)
15/11/05 15:19:04 INFO mapred.MapTask: mapreduce.task.io.sort.mb: 100
15/11/05 15:19:04 INFO mapred.MapTask: soft limit at 83886080
15/11/05 15:19:04 INFO mapred.MapTask: bufstart = 0; bufvoid = 104857600
15/11/05 15:19:03 INFO mapred.MapTask: Map output collector class = org.apache.hadoop.mapred.MapTask$MapOutputBuffer
15/11/05 15:19:03 INFO mapred.LocalJobRunner: 
15/11/05 15:19:03 INFO mapred.MapTask: Starting flush of map output
15/11/05 15:19:03 INFO mapred.MapTask: Spilling map output
15/11/05 15:19:03 INFO mapred.MapTask: bufstart = 0; bufend = 27567; bufvoid = 104857600
15/11/05 15:19:03 INFO mapred.MapTask: kvstart = 26214396(104857584); kvend = 26203416(104813664); length = 10981/6553600
15/11/05 15:19:04 INFO mapred.MapTask: Finished spill 0
15/11/05 15:19:04 INFO mapred.Task: Task:attempt_local244789678_0001_m_000000_0 is done. And is in the process of committing
15/11/05 15:19:04 INFO mapred.LocalJobRunner: map
15/11/05 15:19:04 INFO mapred.Task: Task 'attempt_local244789678_0001_m_000000_0' done.
15/11/05 15:19:04 INFO mapred.LocalJobRunner: Finishing task: attempt_local244789678_0001_m_000000_0
15/11/05 15:19:04 INFO mapred.LocalJobRunner: Starting task: attempt_local244789678_0001_m_000001_0
15/11/05 15:19:04 INFO mapred.Task:  Using ResourceCalculatorProcessTree : [ ]
15/11/05 15:19:04 INFO mapred.MapTask: Processing split: hdfs://master.dbq168.com:8020/user/hadoop/wc-in/profile:0+1796
15/11/05 15:19:04 INFO mapred.MapTask: (EQUATOR) 0 kvi 26214396(104857584)
15/11/05 15:19:04 INFO mapred.MapTask: mapreduce.task.io.sort.mb: 100
15/11/05 15:19:04 INFO mapred.MapTask: soft limit at 83886080
15/11/05 15:19:04 INFO mapred.MapTask: bufstart = 0; bufvoid = 104857600
15/11/05 15:19:04 INFO mapred.MapTask: kvstart = 26214396; length = 6553600
15/11/05 15:19:04 INFO mapred.MapTask: Map output collector class = org.apache.hadoop.mapred.MapTask$MapOutputBuffer
15/11/05 15:19:04 INFO mapred.LocalJobRunner: 
15/11/05 15:19:04 INFO mapred.MapTask: Starting flush of map output
15/11/05 15:19:04 INFO mapred.MapTask: Spilling map output
15/11/05 15:19:04 INFO mapred.MapTask: bufstart = 0; bufend = 2573; bufvoid = 104857600
15/11/05 15:19:04 INFO mapred.MapTask: kvstart = 26214396(104857584); kvend = 26213368(104853472); length = 1029/6553600
15/11/05 15:19:04 INFO mapreduce.Job:  map 50% reduce 0%
15/11/05 15:19:04 INFO mapred.MapTask: Finished spill 0
15/11/05 15:19:04 INFO mapred.Task: Task:attempt_local244789678_0001_m_000001_0 is done. And is in the process of committing
15/11/05 15:19:04 INFO mapred.LocalJobRunner: map
15/11/05 15:19:04 INFO mapred.Task: Task 'attempt_local244789678_0001_m_000001_0' done.
15/11/05 15:19:04 INFO mapred.LocalJobRunner: Finishing task: attempt_local244789678_0001_m_000001_0
15/11/05 15:19:04 INFO mapred.LocalJobRunner: map task executor complete.
15/11/05 15:19:04 INFO mapred.LocalJobRunner: Waiting for reduce tasks
15/11/05 15:19:04 INFO mapred.LocalJobRunner: Starting task: attempt_local244789678_0001_r_000000_0
15/11/05 15:19:04 INFO mapred.Task:  Using ResourceCalculatorProcessTree : [ ]
15/11/05 15:19:04 INFO mapred.ReduceTask: Using ShuffleConsumerPlugin: org.apache.hadoop.mapreduce.task.reduce.Shuffle@775b8754
15/11/05 15:19:04 INFO reduce.MergeManagerImpl: MergerManager: memoryLimit=363285696, maxSingleShuffleLimit=90821424, mergeThreshold=239768576, ioSortFactor=10, memToMemMergeOutputsThreshold=10
15/11/05 15:19:04 INFO reduce.EventFetcher: attempt_local244789678_0001_r_000000_0 Thread started: EventFetcher for fetching Map Completion Events
15/11/05 15:19:04 INFO reduce.LocalFetcher: localfetcher#1 about to shuffle output of map attempt_local244789678_0001_m_000001_0 decomp: 2054 len: 2058 to MEMORY
15/11/05 15:19:04 INFO reduce.InMemoryMapOutput: Read 2054 bytes from map-output for attempt_local244789678_0001_m_000001_0


命令的執行結果按上面命令的指定存儲於WC-OUT目錄中:

[hadoop@master ~]$ hadoop fs -ls WC-OUT
Found 2 items
-rw-r--r--   2 hadoop supergroup          0 2015-11-05 15:19 WC-OUT/_SUCCESS
-rw-r--r--   2 hadoop supergroup      10748 2015-11-05 15:19 WC-OUT/part-r-00000


其中的part-r-00000正是其執行結果的輸出文件,使用如下命令查看其執行結果。

[hadoop@master ~]$ hadoop fs -cat WC-OUT/part-r-00000
!       3
!=      15
"       7
""      1
"",     1
"$#"    4
"$-"    1
"$1"    21
"$1")"  2
"$2"    5
"$3"    1
"$4"    1
"$?"    2
"$@"    2
"$BOOTUP"       17
"$CONSOLETYPE"  1
"$EUID" 2
"$HISTCONTROL"  1
"$RC"   4
"$STRING        1
"$answer"       4
"$base  1
"$base" 1
"$corelimit     2
"$count"        1
"$dst"  4
"$dst:  1
"$file" 3
"$force"        1
"$fs_spec"      1
"$gotbase"      1
"$have_random"  1
"$i"    3
"$key"  6
"$key"; 3
"$killlevel"    3
"$line" 2
"$makeswap"     2
"$mdir" 4
"$mke2fs"       1
"$mode" 1
"$mount_point"  1
"$mount_point") 1
......



2. Hive 部屬:

2.1 環境介紹:

    Hive:1.2.1
    Mysql-connector-jar: Mysql-connector-java-5.1.37
    Hadoop: 2.6.1 
    MySQL: 5.6.36 64

2.1.1 Hive介紹:

Hive, 適用於數據倉庫類的應用程序,但其並不是一個全狀態的數據庫,這主要受限於Hadoop自身設計的缺陷。其最大的缺陷在於Hive不支持行級別的更新、插入和刪除操作。其次,Hadoop是面向批處理的系統,其MapReduce job的啓動有着很大的開銷,因此Hive查詢有着很高的延遲,通常在傳統數據上可以幾秒鐘完成的查詢操作在Hive需要更長的時間,即使數據集非常小也無法避免。再次,Hive無法支持OLTP(Online Transaction Processing)的關鍵特性,而是接近於OLAP(Online Analytic Processing),然而在Online能力方面的表現仍然與期望有着一定的差距。故此,Hive最適用於數據倉庫類的應用場景,即通過數據挖掘完成數據分析、生成報告並支持智能決策等。


鑑於Hive本身的限制,如果期望在大數據集上實現OLTP式的特性,就得認真考慮NoSQL數據庫了,比如HBase、Cassandra和DynamoDB等。    

2.2 Hive 運行模式

與 Hadoop 類似,Hive 也有 3 種運行模式:

2.2.1 內嵌模式

將元數據保存在本地內嵌的 Derby 數據庫中,這是使用 Hive 最簡單的方式。但是這種方式缺點也比較明顯,因爲一個內嵌的 Derby 數據庫每次只能訪問一個數據文件,這也就意味着它不支持多會話連接。

2.2.2 本地模式

這種模式是將元數據保存在本地獨立的數據庫中(一般是 MySQL),這用就可以支持多會話和多用戶連接了。

2.2.3 遠程模式

此模式應用於 Hive 客戶端較多的情況。把 MySQL 數據庫獨立出來,將元數據保存在遠端獨立的 MySQL 服務中,避免了在每個客戶端都安裝 MySQL 服務從而造成冗餘浪費的情況。


2.3 安裝 Hive

Hive 是基於 Hadoop 文件系統之上的數據倉庫,由Facebook提供。因此,安裝Hive之前必須確保 Hadoop 已經成功安裝。

2.3.1下載完成後解壓:

[root@master src]# wget http://119.255.9.53/mirror.bit.edu.cn/apache/hive/stable/apache-hive-1.2.1-bin.tar.gz
[root@master src]# tar xf apache-hive-1.2.1-bin.tar.gz  -C /usr/local/

# 修改屬主屬組,hadoop用戶已在hadoop集羣中添加

[root@master src]# chown hadoop.hadoop -R apache-hive-1.2.1-bin/

# 創建軟鏈接: 

[root@master src]# ln -sv apache-hive-1.2.1-bin hive


2.3.2 配置系統環境變量

# vim /etc/profile.d/hive.sh                                  
HIVE_HOME=/usr/local/hive
PATH=$PATH:$HIVE_HOME/bin
export HIVE_HOME


使之立即生效

# .  /etc/profile.d/hive.sh

                     


2.3.3 修改hive配置腳本

# vim /usr/local/hive/bin/hive-config.sh        
export JAVA_HOME=/usr/local/java
export HIVE_HOME=/usr/local/hive
export HADOOP_HOME=/usr/local/hadoop


2.3.4 創建必要目錄

前面我們看到 hive-site.xml 文件中有兩個重要的路徑,切換到 hadoop 用戶下查看 HDFS 是否有這些路徑:

[hadoop@master conf]$ hadoop fs -ls /
Found 4 items
drwxr-xr-x   - hadoop supergroup          0 2015-11-04 06:38 /hbase
drwxr-xr-x   - hadoop supergroup          0 2015-11-05 09:38 /hive_data
drwx-wx-wx   - hadoop supergroup          0 2015-10-28 17:04 /tmp
drwxr-xr-x   - hadoop supergroup          0 2015-11-02 14:29 /user


沒有發現上面提到的路徑,需要自己新建這些目錄,並且給它們賦予用戶寫(W)權限。

$ hadoop dfs -mkdir /user/hive/warehouse
$ hadoop dfs -mkdir /tmp/hive
$ hadoop dfs -chmod 777 /user/hive/warehouse
$ hadoop dfs -chmod 777 /tmp/hive


檢查是否新建成功 hadoop dfs -ls / 以及 hadoop dfs -ls /user/hive/ :

[hadoop@master conf]$ hadoop fs -ls /user/hive/
Found 1 items
drwxrwxrwx   - hadoop supergroup          0 2015-11-05 15:57 /user/hive/warehouse


2.4 配置遠程模式的數據庫MySQL


2.4.1 安裝 MySQL:

此處使用的是通用二進制5.6.26版本,mysql安裝在/usr/local/mysql,過程略...


2.4.2 創建數據庫並授權:

    mysql> CREATE DATABASE `hive` /*!40100 DEFAULT CHARACTER SET latin1 */;
    mysql> GRANT ALL PRIVILEGES ON `hive`.* TO 'hive'@'192.168.40.%' IDENTIFIED BY 'hive';
    mysql> FLUSH PRIVILEGES;


2.4.3 下載jdbc驅動:

下載MySQL 的 JDBC 驅動包。這裏使用 mysql-connector-java-5.1.37-bin.jar,將其複製到 $HIVE_HOME/lib 目錄下:

下載地址: http://dev.mysql.com/downloads/connector/j/

$ tar xf mysql-connector-java-5.1.37.tar.gz && cd mysql-connector-java-5.1.37
$ cp mysql-connector-java-5.1.37-bin.jar /usr/local/hive/lib/


2.5 修改Hive配置文件

[root@master conf]# su - hadoop
[hadoop@master ~]$ cd /usr/local/hive/conf/
[hadoop@master conf]$ cp hive-site.xml.template hive-site.xml
[hadoop@master conf]$ vim hive-site.xml
[hadoop@master conf]$ cp hive-site.xml.template hive-site.xml
 <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>hive</value>
    <description>password to use against metastore database</description>
  </property>
  <property>
    <name>javax.jdo.option.Multithreaded</name>
    <value>true</value>
    <description>Set this to true if multiple threads access metastore through JDO concurrently.</description>
  </property>
   <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://mysql:3306/hive</value>
    <description>JDBC connect string for a JDBC metastore</description>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
    <description>Driver class name for a JDBC metastore</description>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>hive</value>     
    <description>Username to use against metastore database</description>                  </property>

                                                            

2.6 刪除多餘文件,啓動Hive:

Hive 中的 Jline jar 包和 Hadoop 中的 Jline 衝突了,在路徑:$HADOOP_HOME/share/hadoop/yarn/lib/jline-0.9.94.jar 將其刪除,不然啓動Hive會報錯。

[hadoop@master lib]$ mv /usr/local/hadoop/share/hadoop/yarn/lib/jline-0.9.94.jar ~/

2.6.2 啓動hive

[hadoop@master conf]$ hive
Logging initialized using configuration in jar:file:/usr/local/apache-hive-1.2.1-bin/lib/hive-common-1.2.1.jar!/hive-log4j.properties
hive> show tables;
OK
gold_log
gold_log_tj1
person
student
Time taken: 2.485 seconds, Fetched: 4 row(s)


3. Hbase安裝

3.0.1 環境介紹:

    HBase:1.1.2 
    Zookeeper:3.4.6 
    http://hbase.apache.org/
    http://zookeeper.apache.org/

3.1 解壓包設置權限:(以下操作Master上執行)

# tar xf hbase-1.1.2-bin.tar.gz -C /usr/local/
# cd /usr/local
# chown -R hadoop.hadoop hbase-1.1.2/
# ln -sv hbase-1.1.2 hbase


3.2 添加環境變量:

# vim /etc/profile.d/hbase.sh
export HBASE_HOME=/usr/local/hbase
export PATH=$PATH:$HBASE_HOME/bin


3.3 完全分佈式模式配置:

主要的修改的配置文件-- hbase-site.xml, regionservers, 和 hbase-env.sh -- 可以在 conf目錄

# cd /usr/local/hbase
3.3.1 修改hbase-site.xml

要想運行完全分佈式模式,你要進行如下配置,先在 hbase-site.xml, 加一個屬性 hbase.cluster.distributed 設置爲 true 然後把 hbase.rootdir 設置爲HDFS的NameNode的位置。 例如,你的namenode運行在master.dbq168.com,端口是8020 你期望的目錄是 /hbase,使用如下的配置:

<configuration>
  <property>
    <name>hbase.rootdir</name>
    <value>hdfs://master:8020/hbase</value>
    <description>The directory shared by RegionServers.
    </description>
  </property>
  <property>
    <name>hbase.cluster.distributed</name>
    <value>true</value>
    <description>The mode the cluster will be in. Possible values are
      false: standalone and pseudo-distributed setups with managed Zookeeper
      true: fully-distributed with unmanaged Zookeeper Quorum (see hbase-env.sh)
    </description>
  </property>
</configuration>


3.3.2 修改regionservers

完全分佈式模式的還需要修改conf/regionservers

$ vim regionservers
datanode-1
datanode-2
datanode-3

3.4 ZooKeeper

一個分佈式運行的Hbase依賴一個zookeeper集羣。所有的節點和客戶端都必須能夠訪問zookeeper。默認的情況下Hbase會管理一個zookeep集羣。這個集羣會隨着Hbase的啓動而啓動。當然,你也可以自己管理一個zookeeper集羣,但需要配置Hbase。你需要修改conf/hbase-env.sh裏面的HBASE_MANAGES_ZK 來切換。這個值默認是true的,作用是讓Hbase啓動的時候同時也啓動zookeeper.

當Hbase管理zookeeper的時候,你可以通過修改zoo.cfg來配置zookeeper,一個更加簡單的方法是在 conf/hbase-site.xml裏面修改zookeeper的配置。Zookeep的配置是作爲property寫在 hbase-site.xml裏面的。option的名字是 hbase.zookeeper.property. 打個比方, clientPort 配置在xml裏面的名字是 hbase.zookeeper.property.clientPort. 所有的默認值都是Hbase決定的,包括zookeeper,  “HBase 默認配置”. 可以查找 hbase.zookeeper.property 前綴,找到關於zookeeper的配置。


對於zookeepr的配置,你至少要在 hbase-site.xml中列出zookeepr的ensemble servers,具體的字段是 hbase.zookeeper.quorum. 該這個字段的默認值是 localhost,這個值對於分佈式應用顯然是不可以的. (遠程連接無法使用).


你運行一個zookeeper也是可以的,但是在生產環境中,你最好部署3,5,7個節點。部署的越多,可靠性就越高,當然只能部署奇數個,偶數個是不可以的。你需要給每個zookeeper 1G左右的內存,如果可能的話,最好有獨立的磁盤。 (獨立磁盤可以確保zookeeper是高性能的。).如果你的集羣負載很重,不要把Zookeeper和RegionServer運行在同一臺機器上面。就像DataNodes 和 TaskTrackers一樣

打個比方,Hbase管理着的ZooKeeper集羣在節點 rs{1,2,3,4,5}.dbq168.com, 監聽2222 端口(默認是2181),並確保conf/hbase-env.sh文件中 HBASE_MANAGE_ZK的值是 true ,再編輯 conf/hbase-site.xml 設置 hbase.zookeeper.property.clientPort 和 hbase.zookeeper.quorum。你還可以設置 hbase.zookeeper.property.dataDir屬性來把ZooKeeper保存數據的目錄地址改掉。默認值是 /tmp ,這裏在重啓的時候會被操作系統刪掉,可以把它修改到 /hadoop/zookeeper.


3.4.1 配置zookeeper

$ vim hbase-site.xml 
    <property>
      <name>hbase.zookeeper.property.clientPort</name>
      <value>2222</value>
      <description>Property from ZooKeeper's config zoo.cfg.The port at which the clients will connect.</description>
    </property>                                                                                                                                      
    <property>
      <name>hbase.zookeeper.quorum</name>
      <value>datanode-1,datanode-2,datanode-3</value>
      <description>Comma separated list of servers in the ZooKeeper Quorum.                                                                          
      For example, "host1.mydomain.com,host2.mydomain.com,host3.mydomain.com".
      By default this is set to localhost for local and pseudo-distributed modes
      of operation. For a fully-distributed setup, this should be set to a full
      list of ZooKeeper quorum servers. If HBASE_MANAGES_ZK is set in hbase-env.sh
      this is the list of servers which we will start/stop ZooKeeper on.                                                                             
      </description>
    </property>
    <property>
      <name>hbase.zookeeper.property.dataDir</name>
      <value>/hadoop/zookeeper</value>
      <description>Property from ZooKeeper's config zoo.cfg.
      The directory where the snapshot is stored.
      </description>
    </property>

    

    

3.4.2 複製包到其他節點:(包括secondarynode、datanode1-3)

[root@master src]# for i in 31 32 33 35;do scp hbase-1.1.2-bin.tar.gz zookeeper-3.4.6.tar.gz 192.168.40.$i:/usr/local/src/;done


3.4.3 datanode三個節點的操作:

# cd /usr/local/src
# tar xf hbase-1.1.2-bin.tar.gz -C ..
# chown hadoop.hadoop -R hbase-1.1.2/
# ln -sv hbase-1.1.2 hbase
# tar xf zookeeper-3.4.6.tar.gz -C ..
# chown hadoop.hadoop zookeeper-3.4.6/ -R
# ln -sv zookeeper-3.4.6/ zookeeper
[root@datanode-1 ~]$ cd /usr/local/zookeeper/conf/ 
[root@datanode-1 ~]$ cp zoo_sample.cfg zoo.cfg
[root@datanode-1 ~]$ vim zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/hadoop/zookeeper
clientPort=2222
[root@datanode-1 ~]# mkdir /hadoop/zookeeper
[root@datanode-1 ~]# chown hadoop.hadoop -R /hadoop/zookeeper/


以上操作在每個datanode節點上都執行,其餘兩個節點不再演示。


3.4.4 複製Hbase配置文件到Datanode各節點:

[hadoop@master conf]$ cd /usr/local/hbase/conf
[hadoop@master conf]$ for i in 31 32 33 35;do scp -p hbase-env.sh hbase-site.xml regionservers 192.168.40.$i:/usr/local/hbase/conf/;done


3.5 啓動Hbase:

[hadoop@master conf]$ start-hbase.sh 
datanode-2: starting zookeeper, logging to /usr/local/hbase/bin/../logs/hbase-hadoop-zookeeper-datanode-2.cnfol.com.out
datanode-3: starting zookeeper, logging to /usr/local/hbase/bin/../logs/hbase-hadoop-zookeeper-datanode-3.cnfol.com.out
datanode-1: starting zookeeper, logging to /usr/local/hbase/bin/../logs/hbase-hadoop-zookeeper-datanode-1.cnfol.com.out
starting master, logging to /usr/local/hbase/logs/hbase-hadoop-master-master.cnfol.com.out
datanode-3: starting regionserver, logging to /usr/local/hbase/bin/../logs/hbase-hadoop-regionserver-datanode-3.cnfol.com.out
datanode-2: starting regionserver, logging to /usr/local/hbase/bin/../logs/hbase-hadoop-regionserver-datanode-2.cnfol.com.out
datanode-1: starting regionserver, logging to /usr/local/hbase/bin/../logs/hbase-hadoop-regionserver-datanode-1.cnfol.com.out


3.5.1 檢驗啓動情況:

[hadoop@master conf]$ jps
3750 Jps
32515 NameNode
301 ResourceManager
3485 HMaster
[hadoop@datanode-1 ~]$ jps
3575 DataNode
3676 NodeManager
5324 Jps
5059 HQuorumPeer
5143 HRegionServer
[hadoop@datanode-2 ~]$ jps
4512 Jps
3801 NodeManager
4311 HRegionServer
4242 HQuorumPeer
3700 DataNode
[hadoop@datanode-3 ~]$ jps
2128 HRegionServer
2054 HQuorumPeer
1523 DataNode
1622 NodeManager
2289 Jps


3.5.2 查看master上監聽的端口:

[hadoop@master conf]$ netstat -tunlp
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 192.168.40.30:8020          0.0.0.0:*                   LISTEN      32515/java          
tcp        0      0 0.0.0.0:50070               0.0.0.0:*                   LISTEN      32515/java          
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      -                   
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      -                   
tcp        0      0 :::22                       :::*                        LISTEN      -                   
tcp        0      0 ::ffff:192.168.40.30:8088   :::*                        LISTEN      301/java            
tcp        0      0 ::1:25                      :::*                        LISTEN      -                   
tcp        0      0 ::ffff:192.168.40.30:8030   :::*                        LISTEN      301/java            
tcp        0      0 ::ffff:192.168.40.30:8031   :::*                        LISTEN      301/java            
tcp        0      0 ::ffff:192.168.40.30:16000  :::*   
   LISTEN      3485/java           
tcp        0      0 ::ffff:192.168.40.30:8032   :::*                        LISTEN      301/java            
tcp        0      0 ::ffff:192.168.40.30:8033   :::*                        LISTEN      301/java            
tcp        0      0 :::16010                    :::*                        LISTEN      3485/java


3.5.3 通過瀏覽器訪問,查看HBase情況:

http://192.168.40.30:16010/master-status

最後是幾張截圖:

wKioL1Y8JsmghoT_AAKZUFDGucw293.jpg

wKioL1Y8JsnTu0ZGAASk9Vwqs3s326.jpg

wKiom1Y8JonwXR7hAALmHxj4MYc152.jpg


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章