apache方式搭建hadoop集群
*0.前言*
Apache模式搭建非常繁琐,需要配置很多配置文件,仅供学习使用,因为apache的hadoop是开源的,方便学习其内部的实现原理。实际生产中效率低,更推荐CDH等其他方式进行配置,CDH拥有自己的WEB管理页面,更方便对组件进行管理。
CDH搭建文档
*1.集群准备*
虚拟机使用vmware。其实啥都一样,电脑性能跟不上的租阿里云腾讯云都可以,一定要支持CPU虚拟化。
先准备至少三个节点,要根据不同性能安排不同的进程。我这里分配的是hadoop01,4G内存
Hadoop0203都是2G内存,以hadoop01作为主节点。
*1.1安装Cenos7*
首先安装Centos7,最小安装就行,不会有人Centos7安装还要教吧?不会吧?不会吧?
VMware网络配置给个NAT模式,然后再windows下设置->网络与服务->更改适配器->vmnet8
把里面改为静态ip,我这里是192.168.15.1,192.168.15.x/24就是我们的集群子网了。
网关是192.168.15.2,子网掩码255.255.255.0。DNS随便配个8.8.8.8就行。
启动三个虚拟机(其实可以先弄一个再克隆,hadoop要求就是配置文件必须相同)
*1.2修改网卡配置*
最小安装啥命令都没有的,先改IP地址。
(有些版本是ifcfg-eth0)
vi /etc/sysconfig/network-scirpts/ifcfg-ens33
下面的文字注释记得删掉,直接粘贴有可能报错。
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
\# 静态IP
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
\# IPV6是我系统自动生成的,不用管
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=75010dd6-0a7c-4559-8205-133a91603019
DEVICE=ens33
\# 开机自启
ONBOOT=yes
\# 跟windows统一网段,每个虚拟机IP不同其他相同
IPADDR=192.168.15.101
NETMASK=255.255.255.0
GATEWAY=192.168.15.2
DNS1=8.8.8.8
配置完以后重启一下网络服务
systemctl restart network
这样就可以ping通外网了,ping不同检查防火墙
systemctl stop firewalld
systemctl disable firewalld
然后保证windows和节点之间可以ping通即可。
还不行就是特殊问题特殊处理,使用面向CSDN编程思想。
*1.3安装其他常用应用*
安装一个文件传输的应用。
yum install lrzsz -y
输入rz就能传送文件了。
默认的Yum源太慢,建议改成清华的yum源或者阿里的。
ifconfig不能用?
yum install net-tools -y
vi没颜色不好看,弄个vim。
yum install vim -y
节点之间要保证时间同步。
yum install ntp -y
ntpdate ntp6.aliyun.com
//这里也可以主节点ntpdate ntp6.aliyun.com,然后从节点ntpdate hadoop01
节点之间要经常通信,输密码很烦,先生成一对密钥
ssh-keygen
三个回车,不需要内容直接回车就行。
然后把密钥发送给其他节点
ssh-copy-id hadoop02
每个节点都要生成再发送给其他两个节点。
最后再改一下hosts映射。
vim /etc/hosts

主机名不是必须改的,改了方便区分
hostnamectl set-hostname hadoop01
每个节点主机名不同。
*1.4安装mysql*
Mysql早晚用得到,主节点装一个就行,从节点随意。
rpm -Uvh http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
yum repolist enabled | grep "mysql.*-community.*"
yum -y install mysql-community-server
systemctl enable mysqld
systemctl start mysqld
Mysql弄个密码,root-root就行,有需要就自己配置不要忘。
别忘了设置mysql远程连接
mysqladmin -u root -proot
//登录后
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
*1.5通过外部远程管理*
然后下载个Xshell进行管理,新建会话主机IP,端口默认是22,用户身份验证中输入账户密码。我这里是root-root。

*2.hadoop安装*
简单来讲hadoop就是大数据的基础,其中hadoop中提供三个组件HDFS,Yarn,Mapreduce。
HDFS负责整个大数据集群的存储功能,他会把你上传到集群的文件进行分割成块(block),然后将每块存入不同的节点,一个block会在多个节点拥有备份保证文件的安全。
Mapreduce是hadoop集群的计算引擎,大部分程序都需要通过mapreduce进行计算。
Yarn是hadoop的资源调度模块,一个mapreduce程序切分后由yarn分配给不同的节点分别进行运算,再将结果进行整合。
安装时务必保证所有节点配置文件相同!
安装包官网就有,hadoop建议先2.x版本的,3.x版本会有额外的兼容问题
直接rz导入hadoop安装包,解压tar -xzvf [hadoop的压缩包名.gz]
hadoop的安装要依赖jdk。rz导入一个jdk的安装包,同样解压tar -xzvf [jdk压缩包名]
*2.1修改环境变量*
我这里就不在全局改了,全局的环境变量在/etc/profile,修改这个文件会对所有用户生效。我只改/root下的.bash_profile,这个文件只对root用户生效。
##注意,我的安装包都是直接放在/root目录下,会导致其他用户无权限访问,实际生产环境务必改到/usr或者其他全局目录下。
vim /root/.bash_profile
PATH=$PATH:$HOME/bin
export JAVA_HOME=/root/jdk1.8.0_261
export PATH=$JAVA_HOME/bin:$PATH
export HADOOP_HOME=/root/hadoop-2.7.5
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
修改完了重新载入环境变量source /root/.bash_profile,验证一下安装是否成功。
java -version
javac -version
hadoop version
*2.2集群进程分配*
首先设计一下未来将要安装的进程,这个要根据自己集群性能自行制定,理论上来讲要负载均衡,我这里hadoop01内存分配的多一些,可以多运行几个进程。
| 进程 | hadoop01 | hadoop02 | hadoop03 |
|---|---|---|---|
| hadoop | datanode | datanode | datanode |
| namenode | secondarynamenode | ||
| yarn | nodemanager | nodemanager | nodemanager |
| resourcemanager | |||
| zookeeper | quorumpeermain | quorumpeermain | quorumpeermain |
| hbase | hregionserver | hregionserver | hregionserver |
| hmaster(hbase是谁启动谁是master) | |||
| spark | master | worker | worker |
| mysql | mysql | ||
| hive | hive | ||
| kafka | kafka | kafka | kafka |
修改配置文件,hadoop需要修改的配置文件很多。
切换到配置文件目录下
cd /root/hadoop-2.7.5/etc/hadoop/
ls查看文件列表

*2.3修改hadoop-env.sh*
vim hadoop-env.sh

找到JAVA_HOME,有的版本会藏在注释中也可以:/JAVA进行查找。把JAVA_HOME取消注释,并且改为自己的jdk目录。:wq保存退出。
*2.4修改core-site.xml*
vim core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<!-- 指定namenode的通信地址 -->
<value>hdfs://hadoop01:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<!-- 缓存数据路径 -->
<value>/root/hadoop-2.7.5/tmp</value>
</property>
</configuration>
*2.5修改hdfs-site.xml*
vim hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<!-- namenode保存路径 -->
<value>/root/hadoop-2.7.5/tmp/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<!-- datanode保存路径 -->
<value>/root/hadoop-2.7.5/tmp/data</value>
</property>
<property>
<name>dfs.replication</name>
<!-- 文件保存副本数 -->
<value>2</value>
</property>
<property>
<name>dfs.secondary.http.address</name>
<!-- secondarynamenode地址 -->
<value>hadoop02:50090</value>
</property>
</configuration>
*2.6修改mapred-site.xml*
部分版本中没有mapred-site.xml文件,但是都会有一个mapred-site.xml.template,这个就是mapred-site.xml的模板,复制一下改名为mapred-site.xml。实在没有自己新建一个也可以。
vim mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<!-- mapreduce程序在yarn上执行 -->
<value>yarn</value>
</property>
</configuration>
*2.7修改yarn-site.xml*
vim yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<!-- 指定resourcemanager -->
<value>hadoop03</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<!-- 配置shuffle支持才可以运行mapreduce程序 -->
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<!-- 关闭yarn的虚拟内存检测,虚拟机内存有限,spark程序经常因为虚拟内存不足被yarn中断,关闭这个就不会报错了 -->
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
</configuration>
*2.8修改slaves*
输入所有的节点信息,方便hadoop唤醒节点。这里的hadoop01都是hosts文件中的映射,如果没有配置映射需要填写IP地址。
vim slaves
hadoop01
hadoop02
hadoop03
*2.9启动hadoop集群*
在启动前需要先格式化hdfs。
在主节点上运行(hadoop01)
hadoop namenode -format
然后再运行
start-dfs.sh
如果Tab键弹不出start-dfs.sh命令,说明环境变量没配置好。如果出现HDFS三个成员不全,先确定节点之间能否通讯,有无ssh密钥。如果能通信且有密钥,先
stop-dfs.sh
再删除dfs目录
cd /tmp/hadoop-root
最后
hadoop namenode -format
start-dfs.sh
这一步会删除hdfs上所有文件,不到万不得已不要用。
重新在主节点上start-dfs.sh(理论上任意节点执行都可以)
然后在resourcemanager节点上执行
start-yarn.sh
jps查看java进程

这样就算是集群启动成功。从windows端登录一下管理页面,不会真有人连windows虚拟机互相 ping通都做不到吧?不会吧?不会吧?不会吧?
hadoop01:50070(windows也需要配置host文件C:/Windows/system32/drivers/etc/host)

然后点击Utilities->browse the file system就可以查看保存在hdfs上的文件了。

hadoop03:8088(resourcemanager的8088端口)访问yarn管理页面。

里面可以查看当前的进程,我这里没有运行yarn进程。
上传一个文件试试
touch a.txt
hadoop fs -put a.txt /

在hadoop01:50070上查看一下

*3.Zookeeper安装*
rz 上传zookeeper安装包,tar -xzvf [zookeeper安装包名] 解压
*3.1修改环境变量*
在环境变量里加入zookeeper路径。
vim /root/.bash_profile
export ZOOKEEPER_HOME=/root/zookeeper-3.4.14
export PATH=$PATH:$ZOOKEEPER_HOME/bin
source /root/ .bash_profile
切换到zookeeper配置文件目录下
cd /root/
cd zookeeper-3.4.14/conf/
ls查看文件列表

*3.2修改zoo.cfg*
vim zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/root/zookeeper-3.4.14/zkData
clientPort=2181
server.1=hadoop01:2888:3888
server.2=hadoop02:2888:3888
server.3=hadoop03:2888:3888
大部分都是些注释,挑着没注释的地方改改内容就行。
Zookeeper是自动选举主节点,不需要配置。
*3.3启动zookeeper*
每个节点都要独自启动。
zkServer.sh start

jps中有QuorumPeerMain这个进程为成功启动。
*4.Spark安装*
*5.hbase安装*
Hbase安装需要基于hadoop和zookeeper,确保两者都正确安装并启动。
rz上传hbase安装包,tar-xzvf 解压。
*5.1修改环境变量*
在环境变量里加入HBASE路径。
vim /root/.bash_profile
export HBASE_HOME=/root/hbase-1.2.6
export PATH=$PATH:$HBASE_HOME/bin
source /root/.bash_profile
切换到hbase的配置文件目录下
cd /root/hbase-1.2.6/conf/
*5.2修改hbase-site.xml*
vim hbase-site.xml
<configuration>
<property>
<name>hbase.rootdir</name>
<!-- 指定hbase在hdfs上的存储路径 -->
<value>hdfs://hadoop01:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<!-- 是否是分布式搭建 -->
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<!-- 指定zookeeper节点和端口号 -->
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
<property>
<name>hbase.master</name>
<value>hadoop01:60000</value>
</property>
<property>
<name>hbase.master.info.port</name>
<value>60010</value>
</property>
</configuration>
*5.3修改hbase-env.sh*
vim hbase-env.sh
把JAVA_HOME改成自己的jdk目录

*5.4********修改RegionServer********s*
没有的话就自行创建一个
vim regionservers
hadoop01
hadoop02
hadoop03
添加所有节点的映射。
*5.5拷贝相关配置文件*
将/root/hadoop-2.7.5/etc/hadoop下的core-site.xml和hdfs-site.xml拷贝过来。
cp /root/hadoop-2.7.5/etc/hadoop/core-site.xml /root/hbase-1.2.6/conf/
cp /root/hadoop-2.7.5/etc/hadoop/hdfs-site.xml /root/hbase-1.2.6/conf/
*5.6启动hbase*
启动前确保zookeeper和hadoop正确运行,否则hbase启动会出问题。
单个节点启动即可start-hbase.sh,谁启动谁是master。
jps查看进程

Hmaster和HRegionServer均已启动。
hbase shell启动hbase客户端

随便整两条语句测试一下,hbase语句和sql不太一样。

顺便一提哦,hbase客户端真的反人类,他的Backspace退格键和delete键都是删除右边的字符,和正常人不一样,删除左边字符需要ctrl+Backspase。mdzz
*6.hive安装*
Hive只是个数据仓库的工具,表结构存储在mysql中,数据存储在hdfs上,数据计算通过将sql语句转化为mapreduce程序。
只需要在主节点上安装就行,注意hive依赖于mysql和hdfs,确保两者正确安装并启动。
rz上传安装包tar -xzvf 解压.
*6.1配置环境变量*
在环境变量里加入hive路径。
vim /root/.bash_profile
export HIVE_HOME=/root/hive-2.3.3
export PATH=$PATH:$HIVE_HOME/bin
source /root/.bash_profile
cd hive-2.3.3/conf/进入配置目录下。
*6.2配置hive-site.xml*
vim hive-site.xml
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<!-- 配置mysql的链接 -->
<value>jdbc:mysql://hadoop01:3306/hive?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<!-- 配置mysql的驱动包 -->
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<!-- 配置mysql的登录账户 -->
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<!-- 配置mysql的密码 -->
<value>root</value>
</property>
<property>
<!-- 禁止hive版本验证,开启后有可能导致各种版本不匹配的报错 -->
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
</configuration>
*6.3初始化元数据*
初始化之前先将mysql的驱动jar拷贝到/root/hive-2.3.3/lib下
schematool -dbType mysql -initSchema
*6.4启动hive*
hive

创建个数据库试试。
create database myhive;
show databases;

退出hive客户端
quit;
*6.5配置时出大问题*
我这里配置时出了一点小问题,hive的mysql路径只能输入127.0.0.1是成功的,但是使用hadoop01或者192.168.15.101的话,在hive中进行表操作就会报错
FAILED: SemanticException
org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.RuntimeException:
Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
这里一开始我以为是远程登录的原因,先使用windows的navicat连接一下,果然链接不上。果断给mysql一个允许远程访问的权限。
mysql -uroot -proot
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
flush privileges;
然后再使用navicat访问,成功了。

可以看到这里的hive初始化元数据的表结构已经有了。
兴高采烈的把配置文件中的127.0.0.1改成hadoop01,结果还是报错。给了远程访问权限为什么还报错?再一次怀疑人生,有可能是mysql的驱动jar包版本不对,一看我的mysql他更新成了5.6.49,而我的jar包是5.1.40的。仔细一想,127.0.0.1可以成功运行hive说明jar包没问题。Google一下,这两个版本jar包确实能兼容。
既然windows的navicat能连上,那就看看user的表内容吧。

原来是配置密码时出大问题,hadoop01的host链接root用户是没有密码的,咱也不知道咋回事,反正设置个密码就可以了。
set password for root@hadoop01 = password('root');
先使用mysql远程登录一下。

成功,再使用hive试试。

可算是解决了。
*7.安装sqoop*
Sqoop就是个数据导出的工具,安装在mysql所在节点就行。
rz上传安装包,tar -xzvf 解压。
*7.1配置环境变量*
在环境变量里加入sqoop路径。
vim /root/.bash_profile
export SQOOP_HOME=/root/sqoop-1.4.6
export PATH=$PATH:$SQOOP_HOME/bin
source /root/.bash_profile
然后就没有然后了,sqoop就是个工具拿来用就行。
命令示例,要确定有这个表哦,不然肯定报错,就不给演示了自己摸索。
sqoop export \
--connect jdbc:mysql://localhost:3306/logs \
--username root \
--password root \
--table status_hourly \
--export-dir hdfs://master:9000/user/hive/warehouse/status_hourly_tmp2 \
--input-fields-terminated-by '\001'
| sqoop export \ | 导入/导出 |
|---|---|
| –connect jdbc:mysql://localhost:3306/logs \ | 目标数据库连接 |
| –username root \ | 用户名 |
| –password root \ | 密码 |
| –table status_hourly \ | 目标表名 |
| –export-dir hdfs://master:9000/user/hive/warehouse/status_hourly_tmp2 \ | 数据文件目录 |
| –input-fields-terminated-by ‘\001’ | 文件分割符 |
*8.安装flume*
Flume就是个数据读取工具,哪里需要哪里安装,不需要配置环境变量。
rz上传安装包,tar -xzvf解压目录。
Flume的使用是直接编辑一个读取配置,在目录里运行就完事。
cd flume-1.8.0/conf/
vim offline.conf
a1.sources = r1
a1.sinks = k1
a1.channels = c1//读取内容
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /var/log/nginx/access.log
a1.sources.r1.channels = c1//通过内存写入
a1.channels.c1.type = memory//输出位置+格式
a1.sinks.k1.type = hdfsa1.sinks.k1.hdfs.path = hdfs://hadoop01:9000/flume/%Y%m%d
a1.sinks.k1.hdfs.useLocalTimeStamp = true
a1.sinks.k1.hdfs.fileType = DataStream
a1.sinks.k1.hdfs.rollInterval = 0
a1.sinks.k1.hdfs.rollSize = 10240
a1.sinks.k1.hdfs.rollCount = 0
a1.sinks.k1.channel = c1
bin/flume-ng agent -n a1 -c conf -f conf/offline.conf -Dflume.root.logger=INFO,console
*9.安装kafka*
rz发送kafka安装包tar -xzvf解压。
Kafka的名字比较长,改个名字
mv kafka_2.11-1.0.0/ kafka_2.11
*9.1配置环境变量*
在环境变量中添加kafka的路径
vim /root/.bash_profile
export KAFKA_HOME=/root/kafka-2.11
export PATH=$PATH:$KAFKA_HOME/bin
source /root/.bash_profile
*9.2配置server.properties*
#broker 的全局唯一编号,不能重复
broker.id=0
#默认没有这一条需要添加,设置是否可以删除topic
delete.topic.enable=true
#更改日志的目录
log.dirs=/root/kafka-2.11/logs
#zookeeper集群的地址
zookeeper.connect=hadoop01:2181,hadoop02:2181,hadoop03:2181
因为日志目录默认是不存在的,所以在kafka的目录里创建logs目录。
mkdir /root/kafka-2.11/logs
一定要注意每个节点的broker.id不能重复。
*9.3启动kafka集群*
在每个节点上执行
kafka-server-start.sh kafka-2.11/config/server.properties &
Kafka的集群启动需要以配置文件路径作为参数,&代表后台运行。
jps查看一下进程
