本文檔是Hadoop集羣的運維文檔,提供了Hadoop集羣安裝方法和部署, 以及對集羣的監控。php
Hadoop是開源的、分佈式的數據存儲和計算基礎框架,其核心包含HDFS和MapReduce等。html
HBase是基於Hadoop的HDFS之上的分佈式列存儲數據庫, 優點在處理大表。HBase對Hadoop進行了無縫的銜接,使得能夠在Hadoop的MapReduce框架中直接訪問HBase中的數據。java
Hive是基於Hadoop的數據倉庫,它提供類SQL的HQL語句,方便對數據的訪問。node
Hadoop,Apache的開源的分佈式的框架python
HDFS,Hadoop的分佈式文件系統。mysql
NameNode,Hadoop HDFS 元數據主節點服務器,負責保存DataNode文件元數據存儲信息。linux
DataNode,Hadoop HDFS的數據節點,負責存儲數據。ios
JobTracker,Hadoop的MapReduce調度器,負責計算任務的分配和調度,而且跟蹤任務的進度。git
TaskTracker,Hadoop的MapReduce任務的執行程序,向JobTracker回報任務執行進度。github
HBase,Apache的創建在HDFS之上的,面向大表,提供實時、隨機讀寫的開源的分佈式數據庫。
內存16G
硬盤500G
CPU2 Intel(R) Pentium(R) CPU G640 @ 2.80GHz 雙核
機器數目4臺
咱們對着4臺機器進行了規劃,讓JobTracker和NameNode以及SecondaryNameNode運行同一臺機器上,TaskTracker和DataNode運行在同一臺機器上。而且爲每臺機器制定了IP和域名映射。如表所示:
127.0.0.1 localhost 192.168.1.164 hadoop.online.master 192.168.1.165 hadoop.online.slave1 192.168.1.166 hadoop.online.slave2 192.168.1.167 hadoop.online.slave3 |
更改每臺機器的機器名,以下表所示,讓master運行JobTracker和NameNode以及SecondaryNamenode,其餘slave運行DataNode和TaskTracker。
[hadoop@hadoop ~]$ hostname hadoop.online.master |
http://www.oracle.com/technetwork/java/javase/downloads/jdk6downloads-1902814.html處下載java1.6.0_43。
上傳程序到四臺機器。先卸載機器上默認安裝的java程序
[hadoop@hadoop ~]$ rpm -qa |grep java|sudo xargs rpm -e --nodeps |
而後在/opt目錄下執行
[hadoop@hadoop opt]$ ./jdk-6u43-linux-x64.bin |
/etc/profile添加java環境變量以下所示:
[hadoop@hadoop ~]$ tail -n 5 /etc/profile export JAVA_HOME=/opt/jdk1.6.0_43 export ANT_HOME=/opt/apache-ant-1.9.0 export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$ANT_HOME/bin export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASSPATH |
執行Java -version 看java是否安裝成功。
[hadoop@hadoop ~]$ java -version java version "1.6.0_43" Java(TM) SE Runtime Environment (build 1.6.0_43-b01) Java HotSpot(TM) 64-Bit Server VM (build 20.14-b01, mixed mode) |
[hadoop@hadoop ~]$ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/hadoop/.ssh/id_rsa): |
將四臺機器的公鑰都添加到authorized_keys中:
[hadoop@hadoop ~]$ cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys [hadoop@hadoop ~]$ ssh hadoop.online.slave1 cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys [hadoop@hadoop ~]$ ssh hadoop.online.slave2 cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys [hadoop@hadoop ~]$ ssh hadoop.online.slave3 cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys |
改變authorized_keys讀寫權限:
[hadoop@hadoop ~]$ chmod 600 ~/.ssh/authorized_keys |
拷貝authorized_keys文件到另外三臺機器:
[hadoop@hadoop ~]$ scp ~/.ssh/authorized_keys hadoop.online.slave1:~/.ssh |
最後,在master節點經過SSH對每一個節點進行一次訪問,以創建鏈接:
[hadoop@hadoop ~]$ ssh hadoop.online.slave1 date Tue Sep 24 11:06:10 CST 2013 |
安裝lzo所須要軟件包:gcc、ant、lzo、lzo編碼/×××,另外,還須要lzo-devel依賴
[hadoop@hadoop ~]$ sudo yum -y install lzo lzo-devel lzop |
下載並安裝ant程序
http://ant.apache.org/bindownload.cgi,解壓到/opt目錄下,設置環境變量,如設置java變量
處所示。
安裝lzo-2.0.6
[hadoop@hadoop ~]$ wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.06.tar.gz [hadoop@hadoop ~]$ tar zxvf lzo-2.06.tar.gz [hadoop@hadoop ~]$ cd lzo-2.06 [hadoop@hadoop ~]$ ./configure --enable-shared [hadoop@hadoop ~]$ make&&make install |
庫文件被默認安裝到了/usr/local/lib,咱們須要進一步指定lzo庫文件的路徑,將/usr/local/lib/目錄下的全部文件拷到/usr/lib64文件夾下。
安裝hadoop-lzo
下載路徑:https://github.com/kevinweil/hadoop-lzo,請點擊zip下載,如圖所示:
編譯安裝hadoop-lzo
[hadoop@hadoop opt]$ cd hadoop-lzo-master/ [hadoop@hadoop hadoop-lzo-master]$ export CFLAGS=-m64 [hadoop@hadoop hadoop-lzo-master]$ ant compile-native tar |
將hadoop-lzo-0.4.15.jar以及native庫添加到hadoop的CLASSPATH中
[hadoop@hadoop hadoop-lzo-master]$ cp build/hadoop-lzo-0.4.15.jar /home/hadoop/hadoop-1.0.2/lib [hadoop@hadoop hadoop-lzo-master]$ tar -cBf - -C build/native . | tar -xBvf - -C /home/hadoop/hadoop-1.0.2/lib/native [hadoop@hadoop hadoop-lzo-master]$ cp build/native/Linux-amd64-64/lib/* /home/hadoop/hadoop-1.0.2/lib/native/Linux-amd64-64 |
設置環境變量.bash_profile 如圖(hbase和hive後面會用到)所示:
export HADOOP_HOME=/home/hadoop/hadoop-1.0.2 export HBASE_HOME=/home/hadoop/hbase-0.94.0-security export HIVE_HOME=/home/hadoop/hive-0.9.0 export JAVA_LIBRARY_PATH=/home/hadoop/hadoop-1.0.2/lib/native/Linux-amd64-64 export SQOOP_HOME=/home/hadoop/sqoop-1.4.2.bin__hadoop-1.0.0 PATH=$PATH:$HADOOP_HOME/bin:$HBASE_HOME/bin:$HIVE_HOME/bin:$SQOOP_HOME/bin export HADOOP_HOME_WARN_SUPPRESS=1 export PATH |
配置core-site.xml 增長:
<property> <name>io.compression.codecs</name> <value>org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.GzipCodec,org. apache.hadoop.io.compress.BZip2Codec,org.apache.hadoop.io.compress.SnappyCodec,com.hadoop. compression.lzo.LzoCodec</value> </property> |
配置mapred-site.xml 增長:
<property> <name>mapred.compress.map.output</name> <value>true</value> </property> <property> <name>mapred.map.output.compression.codec</name> <value>com.hadoop.compression.lzo.LzoCodec</value> </property> |
安裝Hadoop下載hadoop-1.0.2: http://hadoop.apache.org/releases.html#Download將hadoop-1.0.2解壓到home/hadoop/hadoop-1.0.2
配置Hadoop的環境變量, 設置hadoop-env.sh
這裏主要是指定JAVA_HOME,如圖所示:
# The java implementation to use. Required. export JAVA_HOME=/opt/jdk1.6.0_43 |
設置core-site.xml,如圖所示:
<configuration> <property> <name>io.compression.codecs</name> <value>org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress. GzipCodec,org.apache.hadoop.io.compress.BZip2Codec,org.apache.hadoop.io.compress.SnappyCodec, com.hadoop.compression.lzo.LzoCodec</value> </property> <property> <name>fs.default.name</name> <value>hdfs://hadoop.online.master:9571</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/home/hadoop/hadoop-1.0.2/datas/hadoop</value> <description>a base for other temp directories</description> </property> <property> <name>fs.trash.interval</name> <value>1440</value> </property> <property> <name>fs.chechpoint.dir</name> <value>/home/hadoop/hadoop-1.0.2/datas/hdfs/namesecondary</value> <description>secondary data storage path</description> </property> <property> <name>fs.checkpoint.size</name> <value>33554432</value> </property> <property> <name>hadoop.logfile.count</name> <value>10</value> </property> </configuration> |
設置hdfs-site.xml,若是所示:
<configuration> <property> <name>dfs.name.dir</name> <value>/home/hadoop/hadoop-1.0.2/datas/hdfs/name</value> </property> <property> <name>dfs.data.dir</name> <value>/home/hadoop/hadoop-1.0.2/datas/hdfs/data</value> </property> <property> <name>dfs.replication</name> <value>2</value> </property> <property> <name>dfs.block.size</name> <value>268435456</value> </property> <property> <name>dfs.hosts.exclude</name> <value>/home/hadoop/hadoop-1.0.2/conf/excludes</value> </property> <property> <name>dfs.support.append</name> <value>true</value> </property> <property> <name>dfs.permissions</name> <value>false</value> </property> </configuration> |
設置mapred-site.xml,如圖所示:
<configuration> <property> <name>mapred.compress.map.output</name> <value>true</value> </property> <property> <name>mapred.map.output.compression.codec</name> <value>com.hadoop.compression.lzo.LzoCodec</value> </property> <property> <name>mapred.job.tracker</name> <value>hadoop.online.master:9572</value> </property> <property> <name>mapred.job.reuse.jvm.num.tasks</name> <value>-1</value> </property> <property> <name>mapred.tasktracker.map.tasks.maximum</name> <value>4</value> </property> <property> <name>mapred.tasktracker.reduce.tasks.maximum</name> <value>4</value> </property> <property> <name>io.sort.mb</name> <value>512</value> </property> <property> <name>mapred.reduce.parallel.copie</name> <value>50</value> </property> <property> <name>mapred.reduce.copy.backoff</name> <value>8</value> </property> <property> <name>mapred.reduce.slowstart.completed.maps</name> <value>0.85</value> </property> <property> <name>mapred.child.java.opts</name> <value>-Xms1024m -Xmx1536m -XX:-UseGCOverheadLimit</value> </property> <property> <name>mapred.min.split.size</name> <value>536870912</value> </property> <property> <name>io.sort.factor</name> <value>30</value> </property> |
設置masters和slaves,如圖所示:
[hadoop@hadoop conf]$ more masters hadoop.online.master [hadoop@hadoop conf]$ more slaves hadoop.online.slave1 hadoop.online.slave2 hadoop.online.slave3 |
建議將以上hadoop配置在一臺機器上作好,而後scp到另外三臺
咱們選擇了4臺機器來搭建HBase集羣,具體是這樣規劃的:
HMaster:hadoop.online.master
RegionServer: hadoop.online.slave1
hadoop.online.slave2
hadoop.online.slave3
ZooKeeper: hadoop.online.slave1
hadoop.online.slave2
下載最新的穩定版本的HBase。http://www.apache.org/dyn/closer.cgi/hbase/,當前最新的穩定版本是hbase-0.94.5。咱們開發環境中用了hbase-0.94.0-security。將hbase-0.94.0-security解壓到/home/hadoop/hbase-0.94.0-security/
配置HBase環境變量:hbase-env.sh這裏咱們要設置JAVA_HOME
# The java implementation to use. Required. export JAVA_HOME=/opt/jdk1.6.0_43 |
其次,因爲咱們使用的是HBase託管的ZooKeeper,所以要將最後一行的HBASE_MANAGES_ZK設置爲true, 若是是使用獨立的ZooKeeper,那就將此值設置爲false。
# Tell HBase whether it should manage it's own instance of Zookeeper or not. export HBASE_MANAGES_ZK=true |
設置RegionServers,每行一個節點,如:
[hadoop@hadoop conf]$ more regionservers hadoop.online.slave1 hadoop.online.slave2 hadoop.online.slave3 |
設置hbase-site.xml,以下圖所示:
<configuration> <property> <name>hbase.rootdir</name> <value>hdfs://hadoop.online.master:9571/hbase</value> </property> <property> <name>hbase.master</name> <value>hdfs://hadoop.online.master</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>192.168.1.165,192.168.1.166</value> </property> <property> <name>hbase.zookeeper.property.authProvider.1</name> <value>org.apache.zookeeper.server.auth.SASLAuthenticationProvider</value> </property> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/home/hadoop/hbase-0.94.0-security/zookeeper_data</value> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>hbase.tmp.dir</name> <value>/home/hadoop/hbase-0.94.0-sercurity/hbase_tmp</value> </property> <property> <name>hbase.master.dns.interface</name> <value>eth0</value> </property> <property> <name>hbase.master.dns.nameserver</name> <value>192.168.1.164</value> </property> <property> <name>hbase.regionserver.dns.interface</name> <value>eth0</value> </property> <property> <name>hbase.regionserver.dns.nameserver</name> <value>192.168.1.164</value> </property> </configuration> |
將以上配置複製到全部節點上。
格式化
/home/hadoop/hadoop-1.0.2/bin/hadoop namenode -format |
相對Hadoop,和HBase,Hive的安裝相對,簡單的多。Hive其實只是Hadoop一個插件,提供了一個以相似SQL的DDL語句——HQL來訪問Hadoop。Hive是創建在Hadoop的HDFS之上的,利用Hadoop的MapReduce計算框架進行計算。此外,Hive須要一個地方來存放它的元數據。它能夠是默認的./metastore_db(在conf/hive-defualt.xml中指定),也能夠是任何支持JPOX的數據庫。
因爲Hive只是一個訪問Hadoop的接口,所以它不須要在全部節點都部署,如咱們的開發環境,只在MASTER節點hadoop.online.master上開啓了Hive服務。
接下來仍是以咱們的開發環境爲例,進行Hive的部署,咱們選擇mysql來存儲Hive的元數據。
l 搭建Hadoop集羣請先參照「分佈式Hadoop集羣搭建和配置」這一章,搭建Hadoop集羣。
l 下載安裝Hivehttp://www.apache.org/dyn/closer.cgi/hive/當前穩定版本的Hive是0.90.0解壓到/home/hadoop/hive-0.9.0
l 設置環境變量HIVE_HOME,使HIVE_HOME指向Hive的安裝目錄cd //home/hadoop/hive-0.9.0export HIVE_HOME=`pwd`
l 而後添加$HIVE_HOME/bin到PATH變量$ export PATH=$HIVE_HOME/bin:$PATH也能夠將HIVE_HOME 和添加到PATH放在~/.bashrc中實現。
l 將Hadoop添加到PATH中
在運行Hive以前,先保證hadoop是在環境變量PATH中,或者執行命令:
export HADOOP_HOME=/home/hadoop/hadoop-1.0.2
l 在HDFS上建立/tmp和/user/hive/warehouse,而且更改成g+w權限 $ $HADOOP_HOME/bin/hadoop fs -mkdir /tmp $$HADOOP_HOME/bin/hadoop fs -mkdir /user/hive/warehouse $ $HADOOP_HOME/bin/hadoop fs -chmod g+w /tmp $ $HADOOP_HOME/bin/hadoop fs -chmod g+w /user/hive/warehouse
設置元數據存放位置,咱們將它放在運行在slave3上的mysql中。編輯conf/hive-site.sh,如圖所示:
<configuration> <!-- Hive Execution Parameters --> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://hadoop.online.slave3/hivetest?createDatabaseIfNotExist=true</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> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>hivepass</value> <description>password to use against metastore database</description> </property> <property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive/warehouse</value> <description>location of default database for the warehouse</description> </property> <property> <name>hive.querylog.location</name> <value>/home/hadoop/hive-0.9.0/logs</value> </property> </configuration> |
在hadoop.online.slave3上新建mysql數據庫
[hadoop@hadoop ~]$ sudo yum -y install mysql-server |
啓動數據庫並修改root密碼
建立hivetest數據庫,並受權,以下圖所示
mysql> create database hivetest; mysql > grant all privileges on hivetest.* to hive@’192.168.1.%’ identified by ‘hivepass’; mysql > flush privileges; |
cp mysql-connector-java-5.1.22-bin.jar /home/hadoop/hive-0.9.0/lib/ |
啓動整個集羣
[hadoop@hadoop ~]$ hadoop-1.0.2/bin/start-all.sh |
也可單獨啓動:
啓動NameNode/home/hadoop/hadoop-1.0.2/bin/hadoop-daemon.shstartnamenode
啓動JobTracker/home/hadoop/hadoop-1.0.2/bin/hadoop-daemon.sh start jobtracker
啓動SecondaryNameNode/home/hadoop/hadoop-1.0.2/bin/hadoop-daemon.shstart secondarynamenode
啓動DataNode/home/hadoop/hadoop-1.0.2/bin/hadoop-daemon.sh start datanode
啓動TaskTracker/home/hadoop/hadoop-1.0.2/bin/hadoop-daemon.sh start tasktracker
經過web界面查看:
檢查NameNode和DataNode運行是否正常:http://hadoop.online.master:50070
檢查JobTracker和TaskTracker是否運行正常 經過example來檢查集羣是否運行成功
[hadoop@hadoop ~]$ hadoop jar hadoop-1.0.2/hadoop-examples-1.0.2.jar pi 10 100 |
結果以下所示:
13/09/24 13:21:05 INFO mapred.JobClient: Virtual memory (bytes) snapshot=36923928576 13/09/24 13:21:05 INFO mapred.JobClient: Map output records=20 Job Finished in 52.28 seconds Estimated value of Pi is 3.14800000000000000000 |
經過進程查看
slave上:有TaskTracker和DataNode兩個進程(二者跑在同一個節點上)
[hadoop@hadoop ~]$ jps 9616 TaskTracker 9514 DataNode |
在master上,有NameNode、JobTracker兩個進程(二者運行在同一個物理節點上)
[hadoop@hadoop ~]$ jps 30199 Jps 10245 NameNode 16955 RunJar 24895 RunJar 10437 SecondaryNameNode 10537 JobTracker |
在新增節點時,注意將防火牆關閉。
修改host修改NameNode上的host,添加新增節點的ip,而且將host複製分發到全部節點, 包括新增節點。
修改NameNode的配置文件conf/slaves在slaves上增長新增節點的ip,而且複製分發到全部節點,包括新增節點
在新增節點上開啓服務,執行:hadoop-daemon.sh start datanodehadoop-daemon.sh start tasktracker
均衡start-balancer.sh
集羣配置若是集羣配置conf/hdfs-site.xml中沒有配置dfs.hosts.exclude,則添加如下配置:<property> <name>dfs.hosts.exclude</name><value>/data/soft/hadoop/conf/excludes</value></property>
肯定要下架的機器在dfs.hosts.exclude中指定的文件excludes中,添加要下架的機器,一行一個。如:hadoop.online.slave2hadoop.online.slave3
輕質集羣從新加載配置hadoop dfsadmin -refreshNodes
等上上述過程結束時,要下架的機器就能夠安全關機了,此時執行report能夠看到整個過程已經完成。hadoop dfsadmin -reportDecommission Status : Decommissioned 若是還在執行下架過程當中,那麼會顯示:Decommission Status : Decommission in progress
啓動hive服務hive --service hiveserver 指定端口號 &
啓動web 接口hive --service hwi &
默認客戶端方式啓動hive --service cli
Tips:
Hive的三種啓動方式,推薦只啓動web和hiveserver便可。
中止Hive,直接kill掉相對應的進程便可。
若是Hive運行成功,咱們能夠點擊左側DATABASE中查看到數據庫,以及數據庫中的表。
咱們使用Ganglia來對集羣進行監控。Ganglia是一個監控服務器、集羣的開源軟件,可以用曲線圖表現最近一個小時,最近一天,最近一週,最近一月,最近一年的服務器或者集羣的cpu負載,內存,網絡,硬盤等指標。
Ganglia的強大在於:ganglia服務端可以經過一臺客戶端收集到同一個網段的全部客戶端的數據,ganglia集羣服務端可以經過一臺服務端收集到它下屬的全部客戶端數據。這個體系設計表示一臺服務器可以經過不一樣的分層可以管理上萬臺機器。這個功能是其餘mrtg,nagios,cacti所不能比擬。
咱們把ganglia的服務端安裝在 hadoop.online.master上,客戶端安裝在全部節點上。
依賴包的安裝
sudo yum -y install libconfuse-devel pcre-devel rrdtool-devel rrdtool apr-devel |
因爲libconfuse-devel包不在倉庫中,咱們搭建了epel倉庫(用過以後可刪除)
sudo rpm -ivh epel-release-5-4.noarch.rpm |
Web服務器安裝
sudo yum -y install httpd php gd php-gd |
建立ganglia程序
rpmbuild -tb ganglia-web-3.5.0.tar.gz rpmbuild -tb ganglia-3.5.0.tar.gz |
在/usr/src/redhat/RPMS目錄下的x86_64和noarch,程序如圖所示:
[root@hadoop x86_64]# ll total 748 -rw-r--r-- 1 root root 396176 Apr 11 11:38 ganglia-debuginfo-3.5.0-1.x86_64.rpm -rw-r--r-- 1 root root 49592 Apr 11 11:38 ganglia-devel-3.5.0-1.x86_64.rpm -rw-r--r-- 1 root root 40172 Apr 11 11:38 ganglia-gmetad-3.5.0-1.x86_64.rpm -rw-r--r-- 1 root root 115276 Apr 11 11:38 ganglia-gmond-3.5.0-1.x86_64.rpm -rw-r--r-- 1 root root 107936 Apr 11 11:38 ganglia-gmond-modules-python-3.5.0-1.x86_64.rpm -rw-r--r-- 1 root root 43076 Apr 11 11:38 libganglia-3.5.0-1.x86_64.rpm |
安裝以上全部程序
配置服務器端/etc/ganglia/gmetad.conf
添加數據源,全部的四臺機器都加上
data_source "hadooponline" 192.168.1.164:8649 192.168.1.165:8649 192.168.1.166:8649 192.168.1.167:8649 |
修改gridname
gridname "hadoop online status" |
配置客戶端/etc/ganglia/gmond.conf
修改online名稱,和服務端相同
online { name = "hadooponline" owner = "unspecified" latlong = "unspecified" url = "unspecified" } |
配置acl,只容許和服務器通訊
tcp_accept_channel { port = 8649 acl{ default ="deny" access{ ip= 192.168.1.164 mask = 32 action = "allow" } } } |
拷貝客戶端程序到另三臺配置文件同上
修改httpd.conf 文件,以下圖所示:
DirectoryIndex index.php index.html index.html.var |
啓動ganglia服務器和客戶端,以及http服務器
經過頁面訪問http://192.168.1.164/ganglia以下圖所示