最近一直在研究Hadoop,遇到了很多问题,把自己的一些心得写下来与大家分享一下。
一开始的时候,准备在windows环境下搭建Hadoop环境,因为毕竟Linux环境不太熟很多东西不会,搭了一个多星期,Hadoop还是没有成功的跑起来,遇到了各种问题,后来通过加了一个HadoopQQ群,经大师指点:“实际生产环境没有人会在Windows环境下跑Hadoop”,然后果断的就放弃了,开始借助虚拟机+Ubuntu来搭建Hadoop环境,按照网上的资料,一步一步的操作,用了一天的时间搭建成功,并且能够成功的运行wordcount(Hadoop helloworld程序),接着是安装Hive和Hbase,以上的环境都是伪分布式模式,为了实现Hadoop真正的集群,用公司现在不用的服务器,搭了一个3台服务器的小集群
废话不多说下面介绍Hadoop+Zookeeper+Hbase的环境搭建方法:
第一步:安装Hadoop(10.126.53.16 master,10.126.53.17 slave1,10.126.53.18 slave)
a) 安装jdk
通过命令
wget http://download.oracle.com/otn-pub/java/jdk/7u21-b11/jdk-7u21-linux-x64.tar.gz
下载jdk
解压文件tar –zxvf **.tar.gz(**指你下载的jdk版本)
配置环境变量: vi /etc/profile
添加下面两行
export JAVA_HOME=/usr/java/jdk1.6.0_24
export PATH=$JAVA_HOME/bin:$PATH
保存
执行. /etc/profile 使环境变量生效
java –version
表明jdk安装成功
b) 修改服务器的hosts
127.0.0.1 后面是服务器主机名 去掉
并删除::1这一行
其中ec-app-143是服务器的主机名,重复以上操作修改集群的每一台服务器的hosts
c) 安装ssh,并实现集群服务器之间的免登陆
ssh-keygen
一直回车
cd ~/.ssh
cat id_rsa.pub >> authorized_keys
ssh localhost
需要将节点服务器slave和slave1的id_rsa.put拷贝到maste服务器并写入authorized_keys操作方法:scp slave:~/.ssh/id_rsa.pub slave_rsa.pub
catslave_rsa.pub >> authorized_keys
slave1 的操作同上
测试ssh slave
第一登录的时候需要你输入slave机器的密码
logout
ssh slave
如果不需要输入密码,说明master可以免登陆slave了,执行相同的操作让master能够免登陆所有的节点服务器
d) 下载hadoop包解压到master主机上
wget http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-1.1.2/hadoop-1.1.2.tar.gz
解压hadoop包
1.修改conf目录下的hadoop-env.sh
修改export JAVA_HOME=/usr/java/jdk1.6.0_24并将export前面的#号去掉
2.修改conf目录下的core-site.xml
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/root/hadoop/hadoop-1.1.2/tmp</value>
</property>
</configuration>
hadoop.tmp.dir一定要配置,不然会默认保存在tmp目录,服务器重启就会被删除
同时配置的目录必须要存在,不然hadoop启动会报错
3.修改conf目录下的hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
</configuration>
配置备份的份数
4.修改mapred-site.xml
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>master:9001</value>
</property>
</configuration>
5.修改conf目录下的masters
master
6.修改conf目录下的slaves
slave
slave1
主机master上的hadoop就已经安装好了
需要将安装好的hadoop通过scp的方式拷贝到各个节点
以上步骤完成后hadoop集群就安装好了
将hadoop安装目录添加的环境变量中
现在可以启动hadoop了:
将主机的namenode 格式化
hadoop namenode –format
start-all.sh
master服务器执行jps
18920 JobTracker
29597 Jps
18813 SecondaryNameNode
18630 NameNode
节点上执行jps
12626 TaskTracker
12146 Jps
12499 DataNode
通过浏览器访问:
http://10.126.53.16:50030
http://10.126.53.16:50070
以上访问正常说明Hadoop已经启动成功
接着我们需要运行hadoop自带的一个wordcount程序
在hadoop安装目录下创建一个file文件夹,并在该文件夹下创建file1和file2文件,同时向文件里写入数据
file1:
file2
hadoop dfs –mkdir input
在hdfs文件系统中创建input目录
hadoop dfs –put file* input
将本地file1和file2文件放到hdfs文件系统的input目录
hadoop dfs -ls input
查看input
执行hadoop jar hadoop-examples-1.1.2.jar wordcount input output(input 输入目录,output存放结果目录)
hadoop dfs -ls output
hadoop dfs -cat output/part-r-00000
已经成功的搭建了Hadoop
第二步:安装zookeeper(如果使用hbase自带的zookeeper此步骤可以省略,不推荐)
下载安装zookeeper
wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.3.5/zookeeper-3.3.5.tar.gz
tar –zxvf zookeeper-3.3.5.tar.gz
进到conf目录下
mv zoo_sample.cfg zoo.cfg
修改zoo.cfg
修改dataDir
添加dataLogDir指定zookeeper存放日志的目录
进到dataDir也就是/root/hadoop/zookeeper-3.3.5/data
创建myid文件
10.126.53.16服务器 该文件内容为1
10.126.53.17服务器 该文件内容为2
10.126.53.18服务器 该文件内容为3
主机zookeeper就安装好了,并将zookeeper拷贝到节点服务器上
第三步:安装hbase
下载Hbase
wget http://apache.dataguru.cn/hbase/hbase-0.94.6.1/hbase-0.94.6.1-security.tar.gz
解压hbase
1. 修改conf目录下的hbase-env.sh
exportJAVA_HOME=/usr/java/jdk1.6.0_24
export HBASE_MANAGES_ZK=false
使用自己安装的zookeeper需要将HBASE_MANAGES_ZK该为false,默认情况是true使用hbase自带的zookeeper
2. 修改hbase-site.xml
hbase.rootdir:hbase数据存储目录
hbase.cluster.distributed:完全分布式模式:true 单机模式和伪分布式模式:false
hbase.zookeeper.quorum:指定zookeeper的集群
hbase.zookeeper.property.clientPort:端口号,必须和zoo.cfg文件中端口号一致
3. conf/regionservers中添加hadoop-config/conf/slaves中所有的datanode节点。
4. 删除/hbase-0.90.2/lib/hadoop-core-*.jar
5. 拷贝hadoop下的core.jar到/hbase-0.90.2/lib
6. 4,5必须操作,不然通过java程序操作hbase会报错
启动hbase的顺序:Hadoop-》zookeeper-》hbase
停止zookeeper的顺序:Hbase-》zookeeper-》hadoop
启动hadoop
启动每台服务器的zookeeper:./zkServer start zoo.cfg
启动hbase:start-hbase.sh
Jps(主机)
节点服务器:jps
浏览器访问:http://10.126.53.16:60010/master-status
四.一个HBase的Java客户端实例
(操作环境:window7,myeclipse)
(1)下载hbase-0.90.6-tar.gz
(2)创建一个javaproject——“HBaseClient”,将解压得到的hbase-0.90.6.jar,hbase-0.90.6-tests.jar添加到build path。
(3)新建hbase- site.xml(拷贝你的同名hbase配置文件过来也行),要将其添加到工程的classpath中,也即跟src平行,这是因为下面的代码中初始化 配置使用的是HBaseConfiguration.create(),关于这个在hbase的api使用说明中有这么一段注释:“Youneed a configuration object to tell the client where to connect.When you createa HBaseConfiguration, it reads in whatever you've set into yourhbase-site.xml and in hbase-default.xml, as long as these can be found onthe CLASSPATH”。
package com.util;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.client.HBaseAdmin;
publicclass HbaseUtil {
privatestatic Configurationconf =null;
static {
conf = HBaseConfiguration.create();
}
publicstaticvoid createTable(String tablename,String []cfs)throws IOException{
HBaseAdmin admin = new HBaseAdmin(conf);
if(admin.tableExists(tablename)){
System.out.println("table has existed.");
}
else{
HTableDescriptor tableDesc =newHTableDescriptor(tablename);
for(int i=0;i<cfs.length;i++){
tableDesc.addFamily(newHColumnDescriptor(cfs[i]));
}
admin.createTable(tableDesc);
System.out.println("create table successfully.");
}
}
publicstaticvoid main(String []args){
try{
createTable("dsinfo",new String[]{"publish","mark"});
}catch(IOException e){
e.printStackTrace();
}
}
}
运行代码:打印create table successfully.
主机执行 hbase shell
执行list