测试环境与版本:
Debian 7.8.0 amd64 (虚拟机运行)
JDK 1.7.0_80 64bit
Hadoop 2.7.2
HBase 1.1.3
一. 基础准备:
创建三台或更多虚拟机。(由于要在每台机器上都操作一遍下面的步骤,不少步骤是可以统一进行的,故可在安装完jdk、hadoop后,再复制虚拟机)
Hadoop 依赖JDK和ssh,首要做的就是安装相应的软件。
1.1. 安装JDK,设置环境变量 (必要)
把jdk安装包上传到linux中,并使用tar命令解压jdk:
tar zxvf jdk-7u80-linux-x64.tar.gz
这里解压到: /home/common/jdk1.7.0_80 目录中
编辑/etc/profile文件:
sudo vi /etc/profile
在结尾加上:
export JAVA_HOME=/home/common/jdk1.7.0_80
export CLASSPATH=.:${JAVA_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
其中JAVA_HOME部分按照自己实际情况修改
1.2. 安装ssh(必要)
不少linux发行版已安装好ssh,使用以下命令可以查看是否已经安装了ssh:
ps -e | grep sshd
若运行完后没有任何结果,则可以运行下面的命令进行安装。
deb系列的linux使用命令:
apt-get install ssh
apt-get install rsync
rmp系列的linux使用命令:
yum install ssh
yum install rsync
1.3. 创建程序使用的用户 (非必要)
# 增加hadoop用户组
sudo groupadd hadoop
# 增加hadoop用户
sudo useradd –d /home/hadoop –m hadoop –g hadoop -s /bin/bash
# 给hadoop用户设置密码
sudo passwd hadoop
1.4. 修改主机名 (建议)
由于是复制出来的虚拟机,各系统的主机名是一致的。为方便识别各台机器,把每台机器的主机名进行修改。
使用以下命令进行修改:
sudo vi /etc/hostname
hostname中的字符串就是主机名,把原来的值删除,输入自己需要的值。
这里的例子中,三个系统分别命名为: master, slave1, slave2
1.5. 修改hosts文件 (建议)
修改hosts文件,把ip与主机名进行对应匹配:
sudo vi /etc/hosts
增加下列三行(ip和主机名根据实际情况填写):
192.168.3.250 master
192.168.3.251 slave1
192.168.3.252 slave2
1.6. 配置Master无密码ssh登录所有Salve (必要)
Master(NameNode )需要通过ssh启动和停止 Salve(DataNode )上的各种守护进程。若没有设置无须密码访问,则在启动和停止时,每一个操作Slave的步骤都需要手动输入密码,非常不方便。Master(NameNode)设置密钥对, 并分享公钥, 可以使NameNode能够ssh无密码登录访问DataNode节点,简化操作流程。
1.6.1. 生成密钥对
使用命令:
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
#或者
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
运行后如果有密钥图形输出,则表示生成成功。
运行完成后,会在~/.ssh目录下生成两个文件:
私钥文件:id_rsa
公钥文件:id_rsa.pub
1.6.2. 分发公钥
将公钥文件id_rsa.pub分发到各dataNode节点,使用命令如下:
scp ~/.ssh/id_rsa.pub 远程用户名@远程服务器IP或主机名:~/
例如:
scp ~/.ssh/id_rsa.pub hadoop@slave1:~/
scp ~/.ssh/id_rsa.pub hadoop@slave2:~/
拷贝的时候,需要输入密码。等配置完成后,slave(dataNode) 节点已经有了master的公钥,则后续再使用ssh连接到slave时,不再需要密码。
在master和各个slave上,将公钥文件id_rsa.pub内容追加到authorized_keys文件中: (在master上,也会有使用ssh登录自己的情况,所以master上也需要将公钥放到自己的authorized_keys中)
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
说明:有的教程会要求在slave上也进行同样的操作:生成密钥对并且分发公钥到各个节点。但在实际测试中,只有master去连接并控制slave的情况,还没遇到过slave主动去ssh连接master或者其他slave的情况。故只分发master的公钥即可。
1.6.3. 测试连接
使用ssh命令进行测试连接,如:
ssh slave1
若没有要求输入密码,则配置成功。
注意:以上测试时,第一次需要输入yes确认,此后就不需要再输入任何内容了。
二. 安装Hadoop
2.1 解压Hadoop文件
使用tar命令解压hadoop:
tar zxvf hadoop-2.7.2.tar.gz
这里解压到:/home/common /hadoop-2.7.2 目录中
增加环境变量HADOOP_HOME (非必须,经测试未设置该变量也没有引起任何异常。)
编辑/etc/profile文件:
sudo vi /etc/profile
在结尾加上:
export HADOOP_HOME=/home/common/hadoop-2.7.2
2.2 配置Hadoop
hadoop大部分的设置都可以用默认的,一般要修改的文件为${HADOOP_HOME}/etc/hadoop/目录下的:
hadoop-env.sh # 环境变量设置
slaves # slave节点列表
core-site.xml # 核心设置
hdfs-site.xml # dfs文件系统,NameNode和DataNode 相关设置
yarn-site.xml # yarn。 ResourceManager和NodeManager 相关设置
mapred-site.xml # MapReduce 相关设置
2.2.1 配置 hadoop-env.sh文件 (必须)
修改hadoop安装目录下的etc/hadoop/hadoop-env.sh文件,
编辑JAVA_HOME变量:
(不能直接用默认的$JAVA_HOME,下同)
# The java implementation to use.
export JAVA_HOME=/home/common/jdk1.7.0_80
2.2.2 配置 slaves文件 (必须)
修改hadoop安装目录下的etc/hadoop/slaves文件,
填写slave节点列表,每一个节点单独一行,可以是主机名或者IP地址,如下:
slave1
slave2
2.2.3 配置 core-site.xml文件 (建议)
修改hadoop安装目录下的etc/hadoop/core-site.xml文件,建议配置。
编辑hadoop核心配置,示例如下:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
<property>
<!-- 必须设置此属性,不要用默认值,默认在/tmp目录中,重启后会被删除 -->
<name>hadoop.tmp.dir</name>
<value>/home/common/hadoop-2.7.2/tmp</value>
<description>A base for other temporary directories.</description>
</property>
</configuration>
参数说明:
名称 | 说明 |
---|---|
fs.defaultFS | NameNode URI, 文件系统的host和port |
io.file.buffer.size | Size of read/write buffer used in SequenceFiles. |
hadoop.tmp.dir | 需要手动建立该文件夹。默认值为/tmp/hadoop-${user.name}。 系统默认的临时目录放在/tmp路径下。而这个目录很有可能在每次重启后都会被干掉,造成某些后续定稿的基础数据会丢失(如hdfs格式化之后写入的数据)。 |
更多选项及选项的默认值,可以参见以下官网说明:
http://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-common/core-default.xml
2.2.4 配置 hdfs-site.xml文件 (可选)
修改hadoop安装目录下的etc/hadoop/hdfs-site.xml文件,可选配置,可以使用默认设置。
编辑NameNode和DataNode 相关设置,示例如下:
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<!-- 可选。hdfs格式化时,namenode需要往此路径写基础数据 -->
<name>dfs.namenode.name.dir</name>
<value>file:/home/common/hadoop-2.7.2/tmp/dfs/name</value>
</property>
<property>
<!-- 可选。hdfs格式化时,datanode需要往此路径写基础数据 -->
<name>dfs.datanode.data.dir</name>
<value>file:/home/common/hadoop-2.7.2/tmp/dfs/data</value>
</property>
</configuration>
参数说明:
名称 | 说明 |
---|---|
dfs.replication | replication 是数据副本数量,默认为3。 |
dfs.namenode.name.dir | 可选,默认值为:file://${hadoop.tmp.dir}/dfs/name。 hdfs格式化时,namenode需要往此路径写基础数据。 |
dfs.datanode.data.dir | 可选,默认值为:file://${hadoop.tmp.dir}/dfs/data 。 hdfs格式化时,datanode需要往此路径写基础数据。 |
更多实用配置:
名称 | 说明 |
---|---|
dfs.http.address | hadoop网页管理端访问地址。默认为master的50070端口。 示例:<value>master:50070</value> |
dfs.namenode.secondary.http-address | 第二个(备份的)NameNode节点的http地址。 示例:<value>master2:50070</value> |
更多选项及选项的默认值,可以参见以下官网说明:
http://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml
2.2.5 配置 yarn-site.xml文件(可选)
修改hadoop安装目录下的etc/hadoop/yarn-site.xml文件,可选配置,可以使用默认设置。
编辑ResourceManager和NodeManager 相关设置,示例如下:
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>master:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>master:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:8088</value>
</property>
</configuration>
参数说明:
名称 | 说明 |
---|---|
yarn.resourcemanager.address | ResourceManager host:port for clients to submit jobs. client提交job的地址。参数格式:host:port. 默认端口为8032 |
yarn.resourcemanager.scheduler.address | ResourceManager host:port for ApplicationMasters to talk to Scheduler to obtain resources. Scheduler获取资源地址。参数格式:host:port。 默认端口为8030 |
yarn.resourcemanager.resource-tracker.address | ResourceManager host:port for NodeManagers. 默认端口为8031 |
yarn.resourcemanager.admin.address | ResourceManager host:port for administrative commands. 管理命令通讯地址。默认端口为8033 |
yarn.resourcemanager.webapp.address | ResourceManager web-ui host:port. 网页地址。默认端口为8088 |
更多选项及选项的默认值,可以参见以下官网说明:
http://hadoop.apache.org/docs/r2.7.2/hadoop-yarn/hadoop-yarn-common/yarn-default.xml
2.2.6 配置 mapred-site.xml文件 (必须)
修改hadoop安装目录下的etc/hadoop/mapred-site.xml文件。
如果是单机模式,配置mapred-site.xml是可选的。
如果是分布式模式,那么最少要设置mapreduce.framework.name 参数,默认值为local,我们需要把它设置成yarn。否则mapreduce的job只在master上运行,不会分配下去。
编辑MapReduce配置,示例如下:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:19888</value>
</property>
</configuration>
参数说明:
名称 | 说明 |
---|---|
mapreduce.framework.name | 执行框架名称,默认值为local。 |
mapreduce.jobhistory.address | MapReduce JobHistory Server host:port Default port is 10020. 任务历史服务器地址,格式为:host:port。 默认端口为10020。 |
mapreduce.jobhistory.webapp.address | MapReduce JobHistory Server Web UI host:port Default port is 19888. 任务历史服务器WEB地址,格式为:host:port。 默认端口为19888。 |
更多选项及选项的默认值,可以参见以下官网说明:
http://hadoop.apache.org/docs/r2.7.2/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml
2.3 拷贝Hadoop配置到其他节点上
单个节点完成hadoop的配置后,把这些配置拷贝到其他节点上。
可以把整个hadoop目录打包拷贝,也可以使用命令:
scp -r 需要拷贝的文件夹 远程用户名@远程服务器ip:目标目录
把整个hadoop目录拷贝到其他节点上。
2.4 启动及验证Hadoop
2.4.1 格式化HDFS文件系统
就像一般的文件系统,使用前需要先格式化一次。只需格式化一次,后续启动无须再格式化。
在Master机器上切换到Hadoop安装目录,运行以下命令:(命令中的namenode是固定参数,不是host名称)
./bin/hdfs namenode –format
若这里格式化报URI has an authority component 错误, 则很有可能是hdfs-site.xml中dfs.namenode.name.dir 和 dfs.datanode.data.dir 属性未正常配置。
2.4.2 启动Hadoop
在Master机器上切换到Hadoop安装目录,运行:
./sbin/start-all.sh
或者分别执行:
./sbin/start-dfs.sh
./sbin/start-yarn.sh
两者等效。
通过日志可以看出启动过程为:
1、start-dfs:首先启动namenode 接着启动datanode1,datanode2,…,然后启动secondary namenode。
2、start-yarn:启动resource manager,然后启动各个slave的nodemanager。
2.4.3 停止Hadoop
在Master机器上切换到Hadoop安装目录,运行:
./sbin/stop-all.sh
或者分别执行:
./sbin/stop-dfs.sh
./sbin/stop-yarn.sh
两者等效。
停止过程与启动过程类似。
2.4.4 验证
启动Hadoop。
验证方式一:用”jps”命令查看java进程
jps(Java Virtual Machine Process Status Tool)是JDK提供的一个显示当前所有java进程pid的命令。
在Master上运行jps查看进程,示例如下:
hadoop@master:/home/common/hadoop-2.7.2$ jps
20165 NameNode
20772 Jps
20356 SecondaryNameNode
20507 ResourceManager
在Slave上运行jps查看进程,示例如下:
hadoop@slave1:/home/common/hadoop-2.7.2$ jps
9593 DataNode
9702 NodeManager
9826 Jps
验证方式二:用”hadoop dfsadmin -report” 查看Hadoop集群的状态
在Master中切换到Hadoop安装目录,运行命令:
./bin/hadoop dfsadmin –report
查看Hadoop集群的状态。里面会列出各个dataNode的状态。
2.4.5 通过网页查看集群信息
启动Hadoop。
通过http://master:50070 查看hdfs的NameNode信息。 (该地址在hdfs-site.xml中定义)
通过http://master:8088 查看ResourceManager信息。 (该地址在yarn-site.xml中定义)
三. 安装HBase
3.1 解压HBase文件
使用tar命令解压hbase:
tar zxvf hbase-1.1.3-bin.tar.gz
这里解压到:/home/common /hbase-1.1.3 目录中
3.2 配置HBase
一般要修改的文件为conf目录下的:
hbase-env.sh # 环境变量设置
regionservers # slave节点列表
hbase-site.xml # hbase和zookeeper设置
3.2.1 配置hbase-env.sh (必须)
修改hbase安装目录下的conf/hbase-env.sh文件,
编辑JAVA_HOME变量:
# The java implementation to use. Java 1.7+ required.
export JAVA_HOME=/home/common/jdk1.7.0_80
编辑HBASE_MANAGES_ZK。 hbase在分布式模式运行时,需要依赖zookeeper集群。此参数定义是否使用hbase内置的zookeeper,true为是,fase为否,注释掉该参数时默认为true。
# Tell HBase whether it should manage it's own instance of Zookeeper or not.
export HBASE_MANAGES_ZK=true
3.2.2 配置hbase-site.xml (必须)
修改hbase安装目录下的conf/hbase-site.xml文件。
配置hbase和zookeeper设置。示例如下:
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://master:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>master,slave1,slave2</value>
</property>
</configuration>
参数说明:
名称 | 说明 |
---|---|
hbase.rootdir | 数据库文件存储路径。 非集群下使用本地文件系统,参数值格式为:file:///path; 集群环境下可以使用hdfs文件系统,值格式为:hdfs://host:port/path; 在hdfs中,不需要事先创建好该文件夹,hbase会自动创建。 |
hbase.cluster.distributed | 定义hbase是否运行在分布式模式。false为单机模式,true为分布式模式。 |
hbase.zookeeper.quorum | zookeeper集群节点,以英文逗号分割。 |
3.2.3 配置regionservers (必须)
修改hbase安装目录下的conf/regionservers文件,需要跑region server的节点列表,每行一个, 示例如下:
slave1
slave2
3.2.4 替换hadoop依赖包 (未验证)
(说明:有的教程有替换jar包的步骤,有的教程没有此步骤。此次实验已经替换了jar包,故当前尚未确定该步骤是否必须。)
由于 HBase 依赖 Hadoop,所以HBase的lib目录中配套发布了一份Hadoop的jar包。该套装jar仅用于独立模式。在分布式模式下,Hadoop版本必须和HBase下的版本一致。用你运行的分布式Hadoop版本jar文件替换HBase lib目录下的Hadoop jar文件,以避免版本不匹配问题。Hadoop版本不匹配问题有不同表现,但看起来都像挂掉了。
步骤:
1. 删除hbase安装目录的lib目录下、以hadoop开头的jar包。
2. 在 hadoop安装目录的share/hadoop目录下,从common、hdfs、mapreduce、yarn这几个子目录中,找出hadoop开头的jar包,拷贝到hbase安装目录的lib目录下。
3.3 拷贝到其他集群节点上
使用命令:
scp -r 需要拷贝的文件夹 远程用户名@远程服务器ip:目标目录
3.4 启动hbase
3.4.1 启动hbase
先启动hadoop。在Master机器上切换到hbase安装目录,运行:
./bin/start-hbase.sh
启动过程:
1. 启动zookeeper
2. 启动master
3. 启动region server
3.4.2 停止hbase
在Master机器上切换到hbase安装目录,运行:
./bin/stop-hbase.sh
3.4.3 通过网页查看HBase信息
启动HBase。
通过http://master:16010 查看Hbase 的状态信息。
(该端口可以在hbase-site.xml文件中自定义,属性名为hbase.master.info.port, 默认值为16010)
3.4.4 启动hbase shell
启动HBase。
运行下列命令启动hbase的shell程序:
./bin/hbase shell
关于hbase shell的常用命令,参考另一篇文档《HBase基本概念和常用shell命令》(待发布)