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源或者阿里的。

清华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内存分配的多一些,可以多运行几个进程。

进程hadoop01hadoop02hadoop03
hadoopdatanodedatanodedatanode
namenodesecondarynamenode
yarnnodemanagernodemanagernodemanager
resourcemanager
zookeeperquorumpeermainquorumpeermainquorumpeermain
hbasehregionserverhregionserverhregionserver
hmaster(hbase是谁启动谁是master)
sparkmasterworkerworker
mysqlmysql
hivehive
kafkakafkakafkakafka

修改配置文件,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安装*

参考spark及scala环境搭建

*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查看一下进程

在这里插入图片描述

posted @ 2020-08-21 14:38  鹤望兰号  阅读(323)  评论(0)    收藏  举报