最近又安装了一次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。
拷贝到每台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;
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。上面很多红字都是遇到过问题。
那个博客说直接拷贝编译好的/usr/local/lib 到其他机器就行了,但我之前遇到hadoop-snappy 找不到native文件,以为是必须snappy本地编译,后来发现是漏拷贝了hadoop-snappy包到lib下,因此估计应该不用每台机都编译一下snappy。上面很多红字都是遇到过问题。
hadoop配置项很多,也是性能优化的关键,但一般博客介绍都少,我这也少;配置压缩也是hadoop集群比较必备的,但是权限管理倒没接触过,以后还得好好研究一下。另外不久将来都是2.0了,除了配置路径,配置项估计大概差不多,下次直接玩CDH4一键安装。hive-hbase-handler没试过,估计应该没问题的。