hadoop集群配置(以ubuntu为例,我自己用的是centOS)和出现的一个问题

Part1 下载好系统和解压好jdk和hadoop配置好/ect/profile
第一步.先下载虚拟系统 VM10
https://download3.vmware.com/software/wkst/file/VMware-workstation-full-10.0.4-2249910.exe
0F63E-20HEM-4ZC49-RKC5M-A22HY
4F2A2-ARHEK-MZJJ0-JH8EH-C2GQG
1U64X-AA351-KZ519-4R85M-A2KJR
HU03A-F83EM-9Z7L8-LT974-3CE7V
1A46W-AHL9H-FZ7Z8-ETC50-0CK4P
1U2WF-64K91-EZQU9-T195H-0A34K
JZ2Q8-DZJ5L-VZWG8-ZH0NH-A3ZNR
NU4KA-48JDM-LZUV9-3J27P-AAJLZ
NU0FD-0C10L-UZJ48-U18XK-2AX4J
1Z01F-2FL11-RZUU8-ZV254-12CP0

第二步:下载centos或者ubuntu

第三步:下载安装JDK
ubuntu:
# cd  /opt/softwares/       --进入到软件包目录
# tar  -zxvf jdk-7u75-linux-x64.tar.gz   --解压 jdk tar
# mv  jdk1.7.0_75/  /opt/modules/  --复制到软件
# sudo  gedit  /etc/profile   --配置环境变量,在文件最后添加如下配置
export   JAVA_HOME=/ home/hadoop / jdk1.7.0_75
export   CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export   PATH=$PATH:$JAVA_HOME/bin
# source /etc/profile  --使环境变量立即生效
# java -version  --检查配置
为了方便,建议将hadoop加入root用户组:
①先以 root 身份登录,然后输入
usermod -g root hadoop ,执行完后 hadoop 即归属于 root 组了,可以再输入
id hadoop 查看输出验证一下,如果看到类似下面的输出:
uid=502(hadoop) gid=0(root) 组 =0(root)
就表示OK了
 
②把 hadoop 填入 sudoers 文件
sudo chmod  +w /etc/sudoers
sudo gedit /etc/sudoers 加入: hadoop ALL=(ALL:ALL)ALL
sudo chmod  -w /etc/sudoers
第四步:下载安装hadoop
我们先把软件包复制到/home/hadoop/下(以后的安装包都是这样做)
假设 hadoop.tar.gz 在桌面,将它复制到安装目录 / home / hadoop / 下 
解压:~$sudo  tar xvf  hadoop-2.6.0.tar.gz
$ mv   /download/hadoop-2.6.0.tar.gz    /home /hadoop/hadoop-2.6.0.tar.gz   //因为我们的安装
包都放在 home 目录下面,所以不需要 mv
# tar xvf hadoop-2.6.0.tar.gz
第五步:安装好hadoop后配置环境变量
这里列出了所有的配置,后面配置其他组件,可以参考这里的配置。 配置完成后,输入: . /etc/profile
 
# Sudo gedit /etc/profile  
export HADOOP_HOME=/home/hadoop/hadoop-2.6.0
 

export
CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH:$HADOOP_HOME/share/ha
doop/common/hadoop-common-
2.6.0.jar:$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-core-
2.6.0.jar:$HADOOP_HOME/share/hadoop/common/lib/commons-cli-1.2.jar
 
export PATH=
$JAVA_HOME/bin:
$JRE_HOME/bin:
$HADOOP_HOME/sbin:
$HADOOP_HOME/bin:
$PATH
 
(或 source /etc/profile )使之立即生效。验证环境变量配置成功与否,输入: echo $HADOOP_HOM e E ,若输出对应的配置路径,即可认定配置成功。

Part2 修改好集群的机器的hostname和hosts文件和最全公钥和修改hadoop配置文件

注:前三个步骤都是准备工作,如果已经完成,可直接进入步骤四
 第一步 : 先在 3 台虚拟机上,设置 hostname 及修改 hosts 文件
 
先正确设置各虚拟机的 hostname

sudo   gedit      /etc/ hostname
 
将HOSTNAME=后的内容,改成想要的机器名 master  slave1  slave2
 
第二步:修改 3 台虚拟机 hosts 文件都是一样
 
sudo vi /etc/hosts
 
192.168. 111 .1 28     master 注:这些ip地址是可以自己修改的,不规定和这里的一样
192.168. 111 . 129     slave1
192.168. 111 .1 30     slave2
这样,就不用记IP了
 
这一步完成后, 最好重启一次系统 ,以便生效。然后可以用ping master(或 slave1 slave2) 试下,正常的话,应该能 ping
 
注:hostname不要命名为“ xxx.01,xxx.02 ”之类以“ . 数字”结尾,否则到最后 hadoop NameNode 服务将启动失败。
 
master主机设置静态 ip ,在 slave 上也设置修改成具体的 ip
sudo  gedit   /etc/network/interfaces  
文件打开:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168. 111 .128
netmask 255.255.255.0
network 192.168. 111 .0
boardcast 192.168. 111 .255
gateway 192.168. 111 .2
 
sudo  gedit   /etc/resolv.conf
nameserver  8.8.8.8  8.8.4.4  (一个已经足够了)
nameserver   124.172.174.13   
 
 
第三步:在3台虚拟机上安装 jdk, 如已经安装没有做这一步
 
 
注:如果机器上之前用 install hadoop 之类的命令安装过低版本的 hadoop, 也必须先卸载干净

第四步:配置ssh免密码登录
首先安装ssh,就有 ssh-keygen 命令了
sudo   apt-get    install     ssh
 
1.先在master上,生成公钥、私钥对
ssh-keygen   -t  r sa (dsa)   -P ''   //三台机都要执行,不能用 sudo ,因为生成的文件会
root 下,当前用户就没有权限
或者:ssh-keygen   t  r sa (dsa)     -P ''   -f   ~/.ssh/id_dsa     -f 是可以指定生成的
密钥对放在哪个路径上 ~就是 home
即:以rsa算法,生成公钥、私钥对, -P '' 表示空密码。该命令运行完后,会在个人主目录下生
.ssh 目录,里面会有二个文件 id_rsa (私钥) ,id_rsa.pub( 公钥 )
 
2 导入公钥
cat  /home/hadoop/ .ssh/id_rsa.pub >>  ~/  .ssh/authorized_keys ~就是/home/hadoop
 
执行完以后,可以在本机上测试下,用ssh连接自己,即: ssh master ,如果不幸还是提示要输入密码,说明还没起作用,还有一个关键的操作
 
查看权限 是属于hadoop用户的
chmod  644  .ssh/authorized_keys (修改文件权限,否则不起作用 )
然后再测试下 ssh master,如果不需要输入密码,就连接成功,表示 ok ,一台机器已经搞定了。
 
 
如出现问题试解决:
请先检查SSH服务是否启动,如果没启动,请启动!
在master主机生成密钥并配置 ssh 无密码登录主机,步骤:
cd /root/
cd .ssh/
如果没有.ssh目录则创建一个: mkdir .ssh
如无权限 使用:sudo chown -R hadoop  /home/hadoop
 
生成密钥对: ssh-keygen -t rsa
然后一直,生成的密钥对保存在 .ssh/id_rsa 文件中。
 
远程拷贝密钥对
cd /root/.ssh
cp id_rsa.pub authorized_keys
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ss h/authorized_keys
scp   authorized_keys   root@ slave1 :/ home/hadoop /.ssh    //scp超级拷贝 root 是机器名, slave1 是主机名
============================================================
 
3.在其它机器上生成公钥、密钥,并将公钥文件复制到 master
a) 以 hadoop 身份登录其它二台机器 slave01 slave02 ,执行 ssh-keygen -t rsa -P '' 生成公钥、密钥
b) 然后用 scp 命令,把公钥文件发放给 master (即:刚才已经搞定的那台机器)
slave1上:
scp .ssh/id_rsa.pub    hadoop@master:/home/hadoop/id_rsa_01.pub
 
 
slave2上:
scp .ssh/id_rsa.pub    hadoop@master:/home/hadoop/id_rsa_2.pub
这二行执行完后,回到master中,查看下 /home/hadoop 目录,应该有二个新文件 id_rsa_1.pub id_rsa_2.pub
然后在master上,导入这二个公钥
cat id_rsa_1.pub >> .ssh/authorized_keys
cat id_rsa_2.pub >> .ssh/authorized_keys
这样,master这台机器上,就有所有 3 台机器的公钥了。 就是最全公钥
 
4 将 master 上的“最全”公钥,复制到其它机器
 
a) 继续保持在 master 上,
 
scp .ssh/authorized_keys   hadoop@slave1:/home/hadoop/.ssh/authorized_keys
 
scp .ssh/authorized_keys   hadoop@slave2:/home/hadoop/.ssh/authorized_keys
 
b) 修改其它机器上 authorized_keys 文件的权限
 
slave1以及 slave2 机器上,均执行命令
chmod 600 .ssh/authorized_keys
 
5 验证
在每个虚拟机上,均用 ssh 其它机器的 hostname 验证下,如果能正常无密码连接成功,表示 ok

小结:该步骤非常重要,主要思路是在各节点上生成公钥、私钥,然后将公钥发放其它所有节点。RSA算法是非对称加密算法,仅公布“公钥”,只要私钥不外泄,还是不能解密的,所以安全性依然有保障。cd (进入个人主目录,默认为 /home/hadoop)

第五步:解压hadoop2.6.0
a)在本机上,用 scp 命令上传 hadoop2.6 master
scp hadoop-2.6.0.tar.gz hadoop@master:/home/hadoop/
b) 以 hadoop 身份登录到 master ,运行以下命令解压
tar -zxvf hadoop-2.6.0.tar.gz 记得是在/home/hadoop/目录下

第六步:修改配置文件
一共有7个文件要修改:
$HADOOP_HOME/etc/hadoop/hadoop-env.sh
$HADOOP_HOME/etc/hadoop/yarn-env.sh
$HADOOP_HOME/etc/hadoop/core-site.xml
$HADOOP_HOME/etc/hadoop/hdfs-site.xml
$HADOOP_HOME/etc/hadoop/mapred-site.xml
$HADOOP_HOME/etc/hadoop/yarn-site.xml
$HADOOP_HOME/etc/hadoop/slaves
其中$HADOOP_HOME表示 hadoop 根目录,本文中默认为 /home/hadoop/hadoop-2.6.0

①hadoop-env.sh和yarn-env.sh
找到下面这行的位置,改成(jdk目录位置,大家根据实际情况修改)
 
export JAVA_HOME=/usr/java/jdk1.7.0_51
在hadoop-env.sh中,建议加上这句:
export HADOOP_PREFIX=/home/hadoop/hadoop-2.6.0
②core-site.xml 参考下面的内容修改:
 
    fs.defaultFS
    hdfs://master:9000
 
 
     hadoop.tmp.dir
      /home/hadoop/tmp //这个目录不存在的话要自己先创建 mkdir
 
 

③hdfs-site.xml
     
     
       
          dfs.datanode.ipc.address
          0.0.0.0:50020
       
        
          dfs.datanode.http.address
        0.0.0.0:50075
     
     
        dfs.replication
         1      //少于集群数   一般是奇数台机集群 注:dfs.replication表示数据副本数,一般不大于 datanode 的节点数。
      
 

④mapred-site.xml
     
        mapreduce.framework.name
        yarn
     
⑤yarn-site.xml
 
    
        yarn.nodemanager.aux-services
        mapreduce_shuffle
      

最后一个文件slaves暂时不管(可以先用 mv slaves slaves.bak 将它改名),上述配置弄好后,就可以在 master 上启用 NameNode 测试了,方法:
 
在master上执行
$HADOOP_HOME/bin/hdfs namenode – format 先格式化  如果没成功在/home/tmp/dfs 下把 data name 删掉了  或者直接删掉 tmp 目录
15/02/12 21:29:53 INFO namenode.FSImage: Allocated new BlockPoolId: BP-85825581-192.168.187.102-1423747793784
 
15/02/12 21:29:53 INFO common.Storage: Storage directory /home/hadoop/tmp/dfs/name has been successfully formatted.
 
等看到这个时,表示格式化ok
$HADOOP_HOME/sbin/ start-dfs.sh
启动完成后,输入jps查看进程,如果看到以下二个进程:
5161 SecondaryNameNode
4989 NameNode
表示master节点基本 ok
 
再输入$HADOOP_HOME/sbin/ start-yarn.sh ,完成后,再输入 jps 查看进程
5161 SecondaryNameNode
5320 ResourceManager
4989 NameNode
如果看
 
slaves
如果刚才用mv slaves slaves.bak对该文件重命名过,先运行 mv slaves.bak slaves 把名字改回来,再
gedit slaves 编辑该文件,输入
masetr
slave02
slave0 3

保存退出,最后运行
$HADOOP_HOME/sbin/stop-dfs.sh
$HADOOP_HOME/sbin/stop-yarn.sh
停掉刚才启动的服务

第七步:将master上的hadoop目录赋值到slave1和slave里面
仍然在mster机器上
cd 先进入主目录
scp -r hadoop-2.6.0 hadoop@slave1:/home/hadoop/
scp -r hadoop-2.6.0 hadoop@slave2:/home/hadoop/
 
注:slave1、 slave2 上的 hadoop 临时目录 (tmp) 及数据目录 (data) ,仍然要先手动创建。

第八步:验证
master节点上,重新启动
 
$HADOOP_HOME/sbin/start-dfs.sh
 
$HADOOP_HOME/sbin/start-yarn.sh
 
顺利的话,master节点上有几下 3 个进程:
 
7482 ResourceManager
 
7335 SecondaryNameNode
 
7159 NameNode
 
slave01、 slave02 上有几下 2 个进程:
2296 DataNode
2398 NodeManager
 
同样的例子:比单机模式时间长,在分布式环境中运算工作要先经过map/reduce将数据拆分和汇总 , 这个过程会增加额外的工作项目进而增加时间。
hadoop@master:~/hadoop-2.6.0$
  hadoop-2.6.0 $ hadoop fs - mkdir / input
   hadoop-2.6.0 $ hadoop fs -put etc/hadoop /*.xml   / input   
  hadoop-2.6.0$ hadoop    jar   share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar
grep input output 'dfs[a-z.]+'
   $ hadoop fs -get  output   /home/hadoop/output
查看结果s
  hadoop-2.6.0$ cat output/*
1 dfsadmin  得到和单机一样的结果, 'dfs' 只出现一次

Part3 zookeepre和hbase
1.解压zookeeper和hbase
2.配置zookeeper的配置文件
zookeeper/conf/ mv zoo-sample.cfg   zoo.cfg
conf/zoo.cfg
tickTime=2000
dataDir=/ home/hadoop /zookeeperdata zookeeperdarta这个目录自己创建
clientPort=2181
initLimit=5
syncLimit=2
server.1= master :2888:3888
server.2= slave1 :2888:3888
server.3= slave2 :2888:3888

3.把配置文件zoo.cfg拷给集群中所有机子

4.在每台机子上的zookeeperdata/下创建myid文件
在master的文件中输入1
在slave1的文件中输入2
在slave2的文件中输入3
5.配置/etc/profile (需要在root用户下)

export  JAVA_HOME=/home/hadoop/jdk1.7.0_80
export  HADOOP_HOME=/home/hadoop/hadoop-2.6.0
export  ZOOKEEPER_HOME=/home/hadoop/zookeeper-3.4.6
export HBASE_HOME=/home/hadoop/hbase-1.0.0 这两个是添加上去的

export
PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$HADOOP_HOME/sbin:$HADOOP_HOME/bin:$PATH :$ZOOKEEPER_
HOME/bin:$HBASE_HOME/bin 这两个也是添加上去的

   保证zkServer.sh start是系统命令

6.启动zookeeper命令 zkServer.sh start zkServer.sh stop zkServer.sh status

7.修改hbase的hbase-env.sh
其它不变, export HBASE_MANAGES_ZK=false ,这表示不使用hbase自带的zookeeper,而使用外部的zookeeper(这里指我们在上面建的zookeeper)

8.修改hbase的hbase-site.xml
 
 
hbase.rootdir
  hdfs://master:9000/hbase  //这个是你解压的hbase的路径
The directory shared by region servers.
 
 
hbase.zookeeper.property.clientPort 
2181 
Property from ZooKeeper's config zoo.cfg. The port at which the clients will
connect.  
 
 
zookeeper.session.timeout 
120000 
 
  hbase.zookeeper.quorum 
master,slave1,slave2 
   
hbase.tmp.dir 
/home/hadoop/hbasedata  //hbasedata这个目录需要自己去创建
 
 
hbase.cluster.distributed 
true 
 

9.修改hbase的regionservers
master   slave1   slave2
10.启动
要记得先关掉防火墙 在root用户下 service iptables stop (chkconfig iptables off 永久关闭防火墙)
启动顺序如下:
①先启动zookeeper zkServer.sh start,这个所有机器上都要做
②然后启动 hadoop, start-dfs.sh, start-yarn.sh, 只做首机就行
③然后启动 hbase, start-hbase.sh, 只做首机
④然后在每台机器 上执行下 jps 看看是不是都启动了。

Master1要有这两个进程:QuorumPeerMain  HMaster
Slave1和 slave2 有: QuorumPeerMain  HRegionServer
11.关闭
首机执行 stop-hbase.sh    
每台执行zkServer.sh stop  
首机执行stop-yarn.sh  
首机执行stop-dfs.sh
然后在每台机器 上执行下 jps 查看进程

12.测试
然后可以用 hbase hbck 命令来看一下状态。
 
在hadoopnamenode上执行
{HBASE_HOME}/bin/ hbase shell
进入shell命令行,通过创建表等操作来检查不是不工作正常。

执行hbase shell时出现的问题是
ERROR:org.apache.hadoop.hbase.PleaseHoldException: Master is initializing
这个错误的意思是hadoop集群各节点的时间不一致
我自己在每台机子用date看了一下时间,确实是系统时间完全对不上。
解决方法:





HBase Shell基本命令
创建表    create '表名称', '列族名称1','列族名称2','列族名称N'
添加记录                put '表名称', '行名称', '列名称:', '值'
查看记录                get '表名称', '行名称'
查看表中的记录总数      count  '表名称'
删除记录                delete  '表名' ,'行名称' , '列名称'
删除一张表              disable '表名称' 第二步 drop '表名称'
查看所有记录                       scan "表名称"    
查看某个表某个列中所有数据         scan "表名称" , ['列名称:']
scan 'users',{COLUMNS=>'info:city'}
更新记录                           就是重写一遍进行覆盖
 
DDL:创建与删除表
  (1)创建表:
>create 'users','user_id','address','info'
#这里创建了一张表users,有三个列族user_id,address,info
  获取表users的具体描述:
>describe 'users'
  (2)列出所有表:
>list
(3)删除表:在HBase中删除表需要两步,首先disable,其次drop
>disable 'users'
>drop 'users'
 
 
DML:增删查改
NoSQL  monogoDB  node.JS
[name:[firstname:chengwu;secondname:liu],age:[birthday:'1980-6-1']]
key  info    value age:23   name:liu  
 
  (1)增加记录:put
>put 'users','xiaoming','info:age,'24';
>put 'users','xiaoming','info:birthday','1987-06-17';
>put 'users','xiaoming','info:company','alibaba';
>put 'users','xiaoming','address:contry','china';
>put 'users','xiaoming','address:province','zhejiang';
>put 'users','xiaoming','address:city','hangzhou';
  (2)扫描users表的所有记录:scan
>scan 'users'
  (3)获取一条记录
  ①取得一个id(row_key)的所有数据
>get 'users','xiaoming'
  ②获取一个id的一个列族的所有数据
>get 'users','xiaoming','info'
  ③获取一个id,一个列族中一个列的所有数据
>get 'users','xiaoming','info:age'
  (4)更新一条记录:依然put
 
  例如:更新users表中小明的年龄为29
>put 'users','xiaoming','info:age' ,'29'
>get 'users','xiaoming','info:age’
  (5)删除记录:delete与deleteall
  ①删除xiaoming的值的'info:age'字段
>delete 'users','xiaoming','info:age'
  ②删除xiaoming的整行信息
>deleteall 'users','xiaoming'
2.3 Other:其他几个比较有用的命令
  (1)count:统计行数
>count 'users'
  (2)truncate:清空指定表
>truncate 'users'
 
注意事项
HBase集群需要依赖于一个Zookeeper ensemble。HBase集群中的所有节点以及要访问HBase的客户端都需要能够访问到该Zookeeper  ensemble。HBase自带了Zookeeper,但为了方便其他应用程序使用Zookeeper,最好使用单独安装的Zookeeper ensemble。
此外,Zookeeper ensemble一般配置为奇数个节点,并且Hadoop集群、Zookeeper ensemble、HBase集群是三个互相独立的集群,并不需要部署在相同的物理节点上,他们之间是通过网络通信的。
需要注意的是,如果要禁止启动hbase自带的zookeeper,那么,不仅仅需要刚才的export HBASE_MANAGES_ZK=false配置,还需要hdfs-site.xml中的hbase.cluster.distributed为true,否则你在启动时会遇到Could not start ZK at requested port of 2181 错误,这是因为hbase尝试启动自带的zookeeper,而我们已经启动了自己安装的那个zookeeper,默认都使用2181端口,所以出错。
还有,有时候会遇到stop-hbase.sh执行很长时间未结束,很可能的原因是你之前把zookeeper关闭了.
最后,Hbase不需要mapreduce,所以只要start-dfs.sh启动hdfs,然后到zookeeper各节点上启动zookeeper,最后再hbase-start.sh启动hbase即可.

你可能感兴趣的:(BI)