hadoop,hbase,hive 安裝snappy壓縮

      最近又安裝了一次hadoop系列,以前裝過幾次,但總也是磕磕碰碰的,本來想這次安裝一步到位,可惜以前記錄不夠詳細,中間還是過程還是有些遺漏,這次把過程詳細記錄起來。hadoop-1.1.2,  hbase-0.95-hadoop1, hive-0.10 + snappy壓縮。中間遇到不少坑,記錄下來;由於這次目標是三件套一步到位,因此配置的時候是一塊配置了,三臺ubuntu機器分別爲zmhadoop (hadoop master)、xbhadoop(hbase master)、 gnhadoop


     首先下載三件套tar.gz 放到一臺機器的/data/cloud目錄下, 解壓; 最好建立軟連接 ln -s hadoop-1.1.2 hadoop;  hbase hive同理。

配置三件套首先有要做的幾件事:

1. 修改Host,(之前以爲不需要,後來配置好以後發現reduce階段的copy卡住,不知道原因,stackoverflow看到有人給出這個解決方案)
2. 打通SSH
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
sudo chmod 400 ~/.ssh/authorized_keys
     應該是master與 slaves之間需要互通,slave之間不需要, 把slave 所有的id_dsa.pub改名拷貝到master 上進行第二步,master的id_dsa.pub 拷貝到每臺slave上進行第二步,弄完以後自己登陸確定一下是否OK。
3. 找臺機器安裝mysql,爲hive創建用戶(這步也有坑;如果是Ubuntu自動安裝需要修改/etc/mysql/my.conf的地址重啓,否則只能本機使用;創建用戶時候注意%和localhost等不一樣,我最後是連着幾句create user 再連着grant privilege ,總之得保證你hive那臺機器配置上的連接字符串能登陸)
4. 安裝zookeeper, 這個比較容易,網上教程比較多,要部署奇數個節點。
5  在一臺機上編譯snappy(壓縮對於IO密集應用來說很重要,我曾經部署過LZO,一番折騰,這次看到個snappy部署詳細資料,過程稍微好點;網址在這 http://shitouer.cn/2013/01/hadoop-hbase-snappy-setup-final-tutorial/ 爲了中間沒麻煩,最後編譯snappy之前先把GCC的版本降到4.4、還有鏈接好libjvm.so;之後是編譯hadoop-snappy, 這步需要裝maven, 完成後從target目錄解壓hadoop-snappy-0.0.1-SNAPSHOT.tar.gz, 把lib裏所有東西拷貝到Hadoop和hbase對應的lib裏),把/usr/local/lib下的snappy和分發到其他機器的/usr/local/lib下


完成這幾點開始正式配置hadoop三件套:

2. 創建幾個目錄, 很多網上教程都沒這麼多,不過我配得多點。
mkdir -p /data/cloud/dfs/name;
mkdir -p /data/cloud/dfs/tmp;
mkdir -p /data/cloud/dfs/namesecondary;
mkdir -p /data/cloud/dfs/data;   //記住這個目錄要修改到權限 755,忘記修改導致啓動datanode沒法啓動
mkdir -p /data/cloud/dfs/mapred/system;
mkdir -p /data/cloud/dfs/mapred/local;
mkdir -p /data/cloud/dfs/mapred/tmp;

3. 配置
3.1 hadoop
conf/core-site.xml:
<property>
<name>fs.default.name</name>
<value>hdfs://zmhadoop:9000</value>
</property>
<property>
<name>fs.checkpoint.dir</name>
<value>/data/cloud/dfs/namesecondary</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/data/cloud/dfs/tmp</value>
</property>
<property>
<name>fs.checkpoint.period</name>
<value>1800</value>
</property>
<property>
<name>io.compression.codecs</name>
<value>org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.BZip2Codec,org.apache.hadoop.io.compress.SnappyCodec</value>
</property>
<property>
<name>mapred.output.compress</name>
<value>true</value>
<description>Should the job outputs be compressed?
  </description>
</property>
<property>
<name>mapred.output.compression.codec</name>
<value>org.apache.hadoop.io.compress.SnappyCodec</value>
<description>If the job outputs are compressed, how should they be compressed?
  </description>
</property>
注意io.compression.codecs項裏面的東西不能有空格換行,

conf/hdfs-site.xml
<property>
       <name>dfs.replication</name>
       <value>2</value>
    </property>
<property>
       <name>dfs.data.dir</name>
       <value>/data/cloud/dfs/data</value>
    </property>
<property>
    <name>dfs.balance.bandwidthPerSec</name>
    <value>10485760</value>
</property>
<property>
       <name>dfs.name.dir</name>
       <value>/data/cloud/dfs/name</value>
    </property>

conf/mapred-site.xml
<property>
        <name>mapred.job.tracker</name>
        <value>zmhadoop:9001</value>
    </property>

<property>
<name>mapred.system.dir</name>
<value>/data/cloud/dfs/mapred/system</value>
</property>
<property>
<name>mapred.local.dir</name>
<value>/data/cloud/dfs/mapred/local</value>
</property>

<property>
<name>mapred.temp.dir</name>
<value>/data/cloud/dfs/mapred/tmp</value>
</property>

<property>
<name>mapred.compress.map.output</name>
<value>true</value>
</property>

<property>
<name>mapred.map.output.compression.codec</name>
<value>org.apache.hadoop.io.compress.SnappyCodec</value>
</property>

conf/hadoop-env.sh
export JAVA_HOME=/data/jdk1.7.0_21/
export HBASE_HOME=/data/cloud/hbase
export HADOOP_HOME=/data/cloud/hadoop
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HADOOP_HOME/lib/native/Linux-amd64-64:/usr/local/lib
export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native/Linux-amd64-64
 #Extra Java CLASSPATH elements.  Optional.
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HADOOP_HOME/lib/hadoop-snappy-0.0.1-SNAPSHOT.jar:$HBASE_HOME/conf:$HBASE_HOME/lib/zookeeper-3.4.5.jar:$HBASE_HOME/lib/hbase*.jar


LD_LIBRARY_PATH和JAVA_LIBRARY_PATH 是爲了hadoop能找到snappy,但哪個起作用不清楚了,網上有各種寫法,爲了保險都寫上吧。 HADOOP_CLASSPATH加入hbase的環境變量是爲了讓hbase也能跑mapreduce,這點在hbase的javadoc上就有特別說明。

conf/master
zmhadoop

conf/slaves
三臺機

3.2 hbase
conf/hbase-site.xml
<property>
 <name>hbase.rootdir</name>
 <value>hdfs://zmhadoop:9000/hbase</value>
</property>
<property>
 <name>hbase.cluster.distributed</name>
 <value>true</value>
</property>
<property>
<name>hbase.master</name>
<value>xbhadoop:60000</value>
</property>
 <property>
 <name>hbase.master.port</name>
 <value>60000</value>
 <description>The port master should bind to.</description>
 </property>
 <property>
   <name>hbase.zookeeper.quorum</name>
   <value>xbhadoop,zmhadoop,gnhadoop</value>
 </property>
Hmaster設在另一臺機器了

conf/hbase-env.sh
export JAVA_HOME=/data/jdk1.7.0_21/
export HBASE_OPTS="$HBASE_OPTS -XX:+HeapDumpOnOutOfMemoryError -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode"
export HBASE_MANAGES_ZK=false
export HBASE_HOME=/data/cloud/hbase
export HADOOP_HOME=/data/cloud/hadoop
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HADOOP_HOME/lib/native/Linux-amd64-64/:/usr/local/lib/
export HBASE_LIBRARY_PATH=$HBASE_LIBRARY_PATH:$HBASE_HOME/lib/native/Linux-amd64-64/:/usr/local/lib/:$HBASE_HOME/lib/hadoop-snappy-0.0.1-SNAPSHOT.jar


讓ZK不隨這個hbase啓動, snappy的壓縮包同樣也從hadoop/lib拷一份到hbase/lib裏。

conf/regionserver 
三臺機器

3.3 hive
爲mysql創建hive使用的metastore表,
mysql> CREATE DATABASE metastore;
mysql> USE metastore;
mysql> SOURCE /usr/lib/hive/scripts/metastore/upgrade/mysql/hive-schema-0.9.0.mysql.sql;
我用的是0.10, 所以要再source那個升級的sql, 報錯的話自己手動source 3個SQL;爲mysql創建個hive用戶名,
conf下hive-site.template改爲hive-site.xml, 修改mysql連接部分:模版的XML文件雖然有很多配置項,但有個漏了幾個</description>標籤,啓動HIVE的時候會發現)

<property>
  <name>javax.jdo.option.ConnectionURL</name>
  <value>jdbc:mysql://MYHOST/metastore</value> //自己用mysql登陸一下看行不行
</property>
<property>
  <name>javax.jdo.option.ConnectionDriverName</name>
  <value>com.mysql.jdbc.Driver</value>
</property>
<property>
  <name>javax.jdo.option.ConnectionUserName</name>
  <value>hiveuser</value>
</property>
<property>
  <name>javax.jdo.option.ConnectionPassword</name>
  <value>password</value>
</property>
<property>
  <name>datanucleus.autoCreateSchema</name>
  <value>false</value>
</property>
<property>
  <name>datanucleus.fixedDatastore</name>
  <value>true</value>
</property>


conf/hive-env.sh 同理
export HBASE_HOME=/data/cloud/hbase
export HADOOP_HOME=/data/cloud/hadoop
export HIVE_HOME=/data/cloud/hive
其中HADOOP_HOME貌似必須的

4. 配置完之後,將三件套重新打包分發到其他機器。
首先格式化 namenode:     
$HADOOP_HOME/bin/hadoop format namenode
啓動hadoop: 
$HADOOP_HOME/bin/start-all.sh
jps看一下情況,如果沒問題,扔點文檔測試一下wordcount
啓動hbase : 
$HBASE_HOME/bin/start-hbase.sh
jps看下應該有HregionServer, 進shell測試一下snappy壓縮
啓動hive: 
$HIVE_HOME/bin/hive  測試一些命令

5. 中間出現的問題
      以爲配置一帆風順,結果遇到一堆麻煩,都是不小心,比如我只是分發配置,結果發現漏拷貝了hadoop-snappy包到lib下,結果跑wordcount出錯; 發現瞭解決以後,發現map到reduce怎麼卡住了,以爲是SSH的問題,把另外兩臺也打通還不行,結果發現是HOST問題;HIVE啓動先是有XML格式問題,改好還是失敗,找了一下發現是mysql的用戶登錄不上,還得創建到可用的賬戶。snappy的編譯問題倒是也遇到過,但是博客裏講了辦法比較順利就過了, 那個博客說直接拷貝編譯好的/usr/local/lib 到其他機器就行了,但我之前遇到hadoop-snappy 找不到native文件,以爲是必須snappy本地編譯,後來發現是漏拷貝了hadoop-snappy包到lib下,因此估計應該不用每臺機都編譯一下snappy。上面很多紅字都是遇到過問題。

      hadoop配置項很多,也是性能優化的關鍵,但一般博客介紹都少,我這也少;配置壓縮也是hadoop集羣比較必備的,但是權限管理倒沒接觸過,以後還得好好研究一下。另外不久將來都是2.0了,除了配置路徑,配置項估計大概差不多,下次直接玩CDH4一鍵安裝。hive-hbase-handler沒試過,估計應該沒問題的。


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