一、环境准备
1.查看系统版本
cat /etc/issue
CentOS release 6.8 (Final)
2.软件准备
软件自行官网下载,但自己要统一规划方便后面操作,本文软件源目录/usr/local/src
安装目录/usr/local
赋权限,以备后续步骤安装软件[安装包都在/usr/local/src]
chown hadoop.hadoop /usr/local/src –R
3.配置主机名和hosts
三台机器(内存大于2G) 分别写hosts、设定hostname
192.168.100.11 mylab1 ----master
192.168.100.12 mylab2 ----slave1
192.168.100.13 mylab3 -----slave2
4.关闭selinux
临时关闭:
[root@mylab1 ~]# getenforce
Enforcing
[root@mylab1 ~]# setenforce 0
[root@mylab1 ~]# getenforce
Permissive
永久关闭selinux:
vim /etc/selinux/config
修改SELINUX=enforcing为SELINUX=disabled
5.关闭防火墙iptables
service iptables stop或/etc/init.d/iptables stop
chkconfig iptables off
6.所有机器同步时间
ntpdate time.windows.com
注:一定要做,集群对时间要求高,不然后面启动会报错,也可以自己搭建ntp服务器(正常线上肯定是要其中一台搭建时间服务器来同步时间的)
7.创建hadoop用户
Hadoop为了安装使用普通用户登录
useradd hadoop
echo "hadoop"|passwd --stdin hadoop
增加权限:
visudo
hadoop ALL=(ALL) ALL
8.切换hadoop用户
su - hadoop
9.配置SSH无密码登陆
master可以通过密钥登陆本机和两台slave
master上生成密钥对:
执行ssh-keygen 命令后一直回车
[hadoop@mylab1 ~]$ ssh-keygen
生成.ssh目录
ls .ssh/
id_rsa id_rsa.pub
复制~/.ssh/id_rsa.pub 内容到本机和两台slave的 ~/.ssh/authorized_keys
设置本机和两台slave机器上的~/.ssh/authorized_keys文件权限为600
chmod 600 ~/.ssh/authorized_keys
cp id_rsa.pub authorized_keys
scp ~/.ssh/authorized_keys hadoop@192.168.100.12:/home/hadoop/.ssh/
scp ~/.ssh/authorized_keys hadoop@192.168.100.13:/home/hadoop/.ssh/
测试:
在master上执行
ssh master
ssh slave1
ssh slave2
可以直接登陆,即实现master免密码登录slave1,slave2
10.创建备用目录
mkdir -pv /usr/local/storage/zookeeper/{data,logs} #创建zookeeper数据目录和日志目录
11.同步:
由于所有软件,配置文件,环境配置基本相同,所有本文所有操作都可以在一台服务器上操作执行,之后通过rsync,或scp等同步工具,同步到其他服务器,可避免重复性操作,切记,切记,切记
例如:rsync –av /usr/local/storage/ mylab2:/usr/local
二、部署应用
1.安装JAVA环境
先除已有jdk(如果有) rpm -e jdk(之前版本)
安装jdk
rpm -ivh jdk-7u79-linux-x64.rpm
修改环境变量:vim /home/hadoop/.bashrc
JAVA_HOME=/usr/java/jdk1.7.0_79
JRE_HOME=/usr/java/jdk1.7.0_79/jre
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
export JAVA_HOME JRE_HOME PATH CLASSPAT
使环境变量生效:
source /home/hadoop/.bashrc
验证jdk安装成功
java -version 版本显示为安装版本即正常
#注:所有服务器都要安装jdk
2.安装hadoop2.7
把hadoop安装包解压到每一个节点(可以解压到一个节点,然后完成后续第2步的配置后,再scp拷贝到其余节点)的固定目录下
1.1解压hadoop,并修改用户及用户组为hadoop
cd /usr/local/src/
tar xf hadoop-2.7.1.tar.gz
chown -R hadoop.hadoop hadoop-2.7.1
mv hadoop-2.7.1 /usr/local/hadoop
1.2执行一下命令检查hadoop是否可用
cd /usr/local/hadoop
./bin/hadoop version
查看是否显示hadoop版本信息
Hadoop 2.7.1 显示即正常,否则软件包有问题重新下载。
1.3在hadoop目录下创建如下目录
cd /usr/local/hadoop
mkdir tmp dfs dfs/data dfs/name
1.4、设置Hadoop环境变量
vim /home/hadoop/.bashrc
JAVA_HOME=/usr/java/jdk1.7.0_79
JRE_HOME=/usr/java/jdk1.7.0_79/jre
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
export JAVA_HOME JRE_HOME PATH CLASSPAT
export HADOOP_HOME=/usr/local/hadoop
export HIVE_HOME=/usr/local/hive
export HBASE_HOME=/usr/local/hbase
export ZOOKEEPER=/usr/local/zookeeper
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
export HDFS_CONF_DIR=${HADOOP_HOME}/etc/hadoop
export YARN_CONF_DIR=${HADOOP_HOME}/etc/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HBASE_HOME/bin:$HIVE_HOME/bin:$ZOOKEEPER/bin使环境变量生效
source ~/.bashrc
同步至其他服务器:
例如:
rsync –av /home/hadoop/.bashrc mylab2:/home/hadoop/
1.4、配置文件修改:
集群/分布式模式需要修改 /usr/local/hadoop/etc/hadoop 中的5个配置文件,更多设置项可点击查看官方说明,这里仅设置了正常启动所必须的设置项: slaves、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml
1.1、core-site.xml
master上 vim /usr/local/hadoop/etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://192.168.100.11:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131702</value>
</property>
<!--指定可以在任何IP访问-->
<property>
<name>hadoop.proxyuser.hduser.hosts</name>
<value>*</value>
</property>
<!--指定所有用户可以访问-->
<property>
<name>hadoop.proxyuser.hduser.groups</name>
<value>*</value>
</property>
<!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>mylab1:2181,mylab2:2181,mylab3:2181</value>
</property>
</configuration>
1.2、hdfs-site.xml
dfs.replication 一般设为 3,但我们只有2个 Slave 节点,所以 dfs.replication 的值还是设为 2
master上 vi /usr/local/hadoop/etc/hadoop/hdfs-site.xml
<configuration>
<!--指定支持高可用自动切换机制-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!--指定namenode名称空间的存储地址-->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop/dfs/name</value>
</property>
<!--指定datanode数据存储地址-->
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop/dfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>192.168.100.11:9001</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>mylab1:2181,mylab2:2181,mylab3:2181</value>
</property>
</configuration>
1.3、mapred-site.xml
需要先重命名,默认文件名为 mapred-site.xml.template
master上 vi /usr/local/hadoop/etc/hadoop/mapred-site.xml
<configuration>
<!-- 配置MapReduce运行于yarn中 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 配置 MapReduce JobHistory Server 地址 ,默认端口10020 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>192.168.100.11:10020</value>
</property>
<!-- 配置 MapReduce JobHistory Server web ui 地址, 默认端口19888 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>192.168.100.11:19888</value>
</property>
</configuration>
1.4、yarn-site.xml
master上 vi /usr/local/hadoop/etc/hadoop/yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>192.168.100.11:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>192.168.100.11:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>192.168.100.11:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>192.168.100.11:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>192.168.100.11:8088</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>mylab1:2181,mylab2:2181,mylab3:2181</value>
</property>
<!--配置与zookeeper的连接地址-->
<property>
<name>yarn.resourcemanager.zk-state-store.address</name>
<value>mylab1:2181,mylab2:2181,mylab3:2181</value>
</property>
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>mylab1:2181,mylab2:2181,mylab3:2181</value>
</property>
</configuration>
1.5、 slaves
文件 slaves,将作为 DataNode 的主机名写入该文件,每行一个,默认为 localhost,所以在伪分布式配置时,节点即作为 NameNode 也作为 DataNode。分布式配置可以保留 localhost,也可以删掉,让 Master 节点仅作为 NameNode 使用。
本教程让 Master 节点仅作为 NameNode 使用,因此将文件中原来的 localhost 删除,添加如下内容ip或数据节点主机名即可:
192.168.100.12 ---slave1
192.168.100.13 ----slave2
1.5、同步
rsync av /usr/local/hadoop mylab2:/usr/local/
rsync av /usr/local/hadoop mylab3:/usr/local/
3、Zookeeper集群部署
zookeeper集群搭建要至少3台服务器,所以三台服务器都要部署zookeeper;安装在hadoop用户上
tar xf zookeeper-3.4.6.tar.gz -C /usr/local/
mv /usr/local/zookeeper-3.4.6/ /usr/local/zookeeper
cp zoo_sample.cfg zoo.cfg
编辑配置文件
vim zoo.cfg
tickTime=2000
initLimit=5
syncLimit=2
#dataDir=/tmp/zookeeper
dataDir=/usr/local/storage/zookeeper/data
dataLogDir=/usr/local/storage/zookeeper/logs
clientPort=2181
server.1=mylab1:2888:3888
server.2=mylab2:2888:3888
server.3=mylab3:2888:3888
创建zookeeper的数据文件和日志存放目录
mkdir /usr/local/storage/zookeeper/data /usr/local/storage/zookeeper/logs
在三台zookeeper的/usr/local/storage/zookeeper/data目录下分别编辑myid
echo 1 > /usr/local/storage/zookeeper/data/myid
echo 2 > /usr/local/storage/zookeeper/data/myid
echo 3 > /usr/local/storage/zookeeper/data/myid
同步到其他hadoop节点
scp -r /usr/local/zookeeper mylab2:/usr/local/
4、部署hbase
tar xf hbase-1.2.1-bin.tar.gz
配置文件修改
regionservers 文件
mylab1
mylab2
mylab3
编辑修改hbase-site.xml文件
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://192.168.100.11:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.tmp.dir</name>
<value>/usr/loca/storage/hbase</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>mylab1,mylab2,mylab3</value>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>
<!--跟zookeeperper配置的dataDir一致-->
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/usr/local/storage/zookeeper/data</value>
</property>
</configuration>
禁用hbase自带的zookeeper
vi /usr/local/hbase/conf/hbase-env.sh
export HBASE_MANAGES_ZK=false
创建hbase-site.xml配置文件中的hbase目录
mkdir /usr/loca/storage/hbase
同步软件到其他节点
rsync av /usr/local/hbase mylab2:/usr/local/
5、部署hive
cp hive-env.sh.template hive-env.sh
cp hive-site.xml.template hive-site.xml
编辑配置文件
vim hive-site.xml
<configuration>
<!--在hdfs上hive数据存放目录,启动hadoop后需要在hdfs上手动创建-->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>hdfs://192.168.100.11:9000/user/hive/warehouse</value>
</property>
<property>
<name>datanucleus.readOnlyDatastore</name>
<value>false</value>
</property>
<property>
<name>datanucleus.fixedDatastore</name>
<value>false</value>
</property>
<property>
<name>datanucleus.autoCreateSchema</name>
<value>true</value>
</property>
<property>
<name>datanucleus.autoCreateTables</name>
<value>true</value>
</property>
<property>
<name>datanucleus.autoCreateColumns</name>
<value>true</value>
</property>
<!--通过jdbc协议连接mysql的hive库-->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://192.168.100.11:3306/hive?createDatabaseIfNotExist=true</value>
</property>
<!--jdbc的mysql驱动-->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<!--mysql用户名-->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>
<!--mysql用户密码-->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hive</value>
</property>
<!--hive的web页面-->
<property>
<name>hive.hwi.war.file</name>
<value>lib/hive-hwi-2.0.0.war</value>
</property>
<!--指定hive元数据访问路径,可以有多个,逗号分隔-->
<property>
<name>hive.metastore.uris</name>
<value>thrift://192.168.100.11:9083</value>
</property>
<!--hiveserver2的HA-->
<property>
<name>hive.zookeeper.quorum</name>
<value>mylab1,mylab2,mylab3</value>
</property>
</configuration>
添加mysql驱动
cp /usr/local/src/mysql-connector-java-5.1.38-bin.jar /usr/local/hive/lib/
添加hive web页面的war包
下载hive源码包,apache-hive-2.0.0-src.tar.gz解压进入hwi/web
jar cvf hive-hwi-2.0.0.war ./*
cp hive-hwi-2.0.0.war /usr/local/hive/lib/
从hbase/lib下复制必要jar包到hive/lib下
cp /usr/local/hbase/lib/hbase-client-1.2.1.jar /usr/local/hbase/lib/hbase-common-1.2.1.jar /usr/local/hive/lib
同步hive和hadoop的jline版本
cp /usr/local/hive/lib/jline-2.12.jar /usr/local/hadoop/share/hadoop/yarn/lib
查看版本
cd /home/hadoop/hadoop/share/hadoop/yarn/lib
find ./ -name "*jline*jar"
删除低版本的jline 0.9
rm jline-0.9.94.jar
复制jdk的tools.jar到hive/lib下
cp $JAVA_HOME/lib/tools.jar /usr/local/hive/lib
6、部署mysql
下载集成包解压,安装mysql
MySQL-5.6.33-1.linux_glibc2.5.x86_64.rpm-bundle.tar
配置MySQL登录密码
cat /root/.mysql_secret
#获取MySQL安装时生成的随机密码aHoUaEJFav0X7hlG
service mysql start
#启动MySQL服务
mysql -uroot -paHoUaEJFav0X7hlG
#进入MySQL,使用之前获取的随机密码
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123456');
#在MySQL命令行中设置root账户的密码为123456
创建hive用户,密码hive
CREATE USER hive IDENTIFIED BY 'hive';
GRANT ALL PRIVILEGES ON *.* TO 'hive'@'%' WITH GRANT OPTION;
或:GRANT ALL PRIVILEGES ON *.* TO 'hive'@'%'IDENTIFIED BY 'hive' WITH GRANT OPTION;
flush privileges;
用创建的hive用户登录mysql并创建hive库
mysql -uhive -phive
create database hive;
#注:此处我的mysql是在主节点部署的
7、启动
Hadoop集群首次启动过程
1.启动zookeeper
如果zookeeper集群还没有启动的话, 首先把各个zookeeper起来。
/home/hadoop/zookeeper/bin/zkServer.sh start (记住所有的zookeeper机器都要启动)
/home/hadoop/zookeeper/bin/zkServer.sh status (1个leader,2个follower)
输入jps,会显示启动进程:QuorumPeerMain
2、启动hadoop
首次启动需要先在 Master 节点执行 NameNode 的格式化:
/usr/local/hadoop/bin/hdfs namenode -format
显示无报错即为正常
在master上操作即可,两个slave会自动启动
启动服务
/usr/local/hadoop/sbin/start-all.sh
停止服务
/usr/local/hadoop/sbin/stop-all.sh
浏览器访问:
http://192.168.100.11:8088/
http://192.168.100.11:50070
3、启动hbase
主master节点安装目录下
/bin/start-hbase.sh
验证安装成功
hbase shell ----进入hbase命令行
list ---输入list命令
hbase(main):001:0> list
TABLE
0 row(s) in 0.5530 seconds
=> []
help get 可以查看命令帮助
查看进程为:HMaster,HRegionServer ---主节点为2个
从节点进程为:HRegionServer
通过web UI访问hbase状态
http://192.168.100.11:16010/master-status
4.启动hive
先在hdfs上创建好hive存储数据的目录
/bin/hadoop fs -mkdir /tmp
/bin/hadoop fs -mkdir -p /user/hive/warehouse
/bin/hadoop fs -chmod g+w /tmp
/bin/hadoop fs -chmod g+w /user/hive/warehouse
hive 远程服务 (端口号10000) 启动方式[metastore和hiveserver2在同一台上启动即可]
nohup /usr/local/hive/bin/hive --service metastore &> metastore.log &
nohup /usr/local/hive/bin/hive --service hiveserver2 &> hiveserver2.log &
hive 命令行模式
/home/hadoop/hive/bin/hive
或者输入
hive --service cli
查看进程为:2个RunJar
#注:可以在任意一台服务器上启动hive,都可以。
8、查看启动进程
通过命令 jps 可以查看各个节点所启动的进程。正确的话,在 Master 节点上可以看到 NameNode、ResourceManager、SecondrryNameNode进程
Jps
Master上:
29162 RunJar
28442 HMaster
28049 ResourceManager
28999 RunJar
27607 NameNode
29328 Jps
28571 HRegionServer
27448 QuorumPeerMain
27802 SecondaryNameNode
在 Slave 节点可以看到 DataNode 和 NodeManager 进程
Slave上:
30086 RunJar
28962 DataNode
29834 HRegionServer
30245 RunJar
28868 QuorumPeerMain
29075 NodeManager
程序启动成功后可以在任意一台启动hive
可以在启动MR-JobHistory服务,
sbin/mr-jobhistory-daemon.sh start historyserver
Hadoop2 MR-JobHistory服务介绍
1)MR-JobHistory服务目标
主要是向用户提供历史的mapred Job 查询
详细解释:
a)在运行MR Job时,MR 的 ApplicationMaster会根据mapred-site.xml配置文件中的配置,将MR Job的job history信息保存到指定的hdfs路径(首先保存到临时目录,然后mv到最终目录)
b)如果在yarn-site.xml中,没有配置nodemanage的LogAggregation功能,则historyserver无法提供mr日志明细查询的功能(在提交mr job时,yarn和mapred的配置都是必须的)
c)historyserver向外提供两个接口,web接口可以提供jobhistory和明细日志查询的功能,而restApi只提供jobhistory查询的功能
9、测试
hdfs dfs -copyFromLocal ./LICENSE.txt /123
hdfs dfs -ls /123
用wordcount分析LICENSE.txt
bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.1.jar wordcount /123/LICENSE.txt /output/123
bin/hdfs dfs -ls /output/123 查看分析后的文件
bin/hdfs dfs -cat /output/123/part-r-00000 查看分析结果
执行分布式实例
首先创建 HDFS 上的用户目录
hdfs dfs -mkdir -p /user/hadoop
将 /usr/local/hadoop/etc/hadoop 中的配置文件作为输入文件复制到分布式文件系统中:
hdfs dfs -mkdir input
hdfs dfs -put /usr/local/hadoop/etc/hadoop/*.xml input
查看input目录下文件
hdfs dfs -ls input
报错总结:
若出现提示 “WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable”,该 WARN 提示可以忽略,不会影响 Hadoop 正常运行(可通过编译 Hadoop 源码解决,解决方法请自行搜索)。
若出现提示 “INFO metrics.MetricsUtil: Unable to obtain hostName java.net.UnknowHostException”,这需要执行如下命令修改 hosts 文件,为你的主机名增加IP映射:
Datanode不能启动
Initialization failed for Block pool <registering> (Datanode Uuid unassigned)
解决方案:
将目录、dfs、name、data清空
是重复启动到时key值不一样
Hmaster消失 ERROR: Can't get master address from ZooKeeper; znode data == null
这个问题这里是由于启动hbase失败造成,主要原因是因为配置文件hbase-site.xml中hdfs端口配置错误导致,帮助文档中使用的是8020,而我的hadoop分布集群用的是9000默认端口,修改配置如下:gedit hbase-site.xml <property> <name>hbase.rootdir</name> <value>hdfs://hadoop0:9000/hbase</value> </property>
参考:
http://f.dataguru.cn/thread-519459-1-1.html