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即可.