现在的位置: 首页 > 综合 > 正文

hadoop,hbase,hive 安装snappy压缩

2013年03月29日 ⁄ 综合 ⁄ 共 7038字 ⁄ 字号 评论关闭

     
最近又安装了一次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没试过,估计应该没问题的。


抱歉!评论已关闭.