工具:VMware
环境:linux centos7.6
环境变量:之后需要修改的环境变量
export ZK_HOME=/usr/local/zookeeper/zookeeper
export HBASE_HOME=/usr/local/hbase/hbase
export JAVA_HOME=/usr/local/java
export HADOOP_HOME=/usr/local/hadoop
export HIVE_HOME=/usr/local/hive/hive
export JAVA_HOME=/usr/local/java
export CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export SPARK_HOME=/usr/local/spark
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HIVE_HOME/bin:$SPARK_HOME/bin:$SPARK_HOME/sbin
in:$MYSQL_HOME/bin:$HBASE_HOME/bin:$ZK_HOME/bin
//手动设置ip(如果有图形化界面,可以直接通过网络设置配置)
IPADDR:设置和宿主机同网段ip
NETMASK:子网掩码和宿主机相同
GATEWAY: 默认网关和宿主机相同
DNS1: 跟宿主一样
PEERDNS=no
对应信息添加到文件中/etc/sysconfig/network-scripts/ifcfg-eno16777736(ifcfg-eno16777736每台主机不同)
添加网关地址
vi /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=xxxx #名字随便了
GATEWAY=192.168.1.1 #默认网关和宿主机相同
添加dns
vi /etc/resolv.conf
#Generated by NetworkManager
nameserver 192.168.0.1 #DNS,跟宿主一样
重启网络
service network restart
systemctl restart network.service
主节点:centos7.6 master
hostname : master
IP :192.168.43.249 #由当前本机的网络决定
从节点1:centos7.6 slave1
hostname : slave1
IP :192.168.43.31 #由当前本机的网络决定
从节点2:centos7.6 slave2
hostname : slave2
IP :192.168.43.229 #由当前本机的网络决定
搭建分布式Hadoop涉及3个节点,其中
主机名为master的节点为主节点,运行HDFS命名节点、YARN资源管理等服务,同时也运行从节点的HDFS数据节点、YARN节点管理等服务;
主机名为slave1和slave2的节点为从节点,运行HDFS数据节点、YARN节点管理等服务。
以下步骤中,主机名和IP地址以真实环境为准。以下每个步骤都尽可能注明执行位置为主节点、从节点或所有节点。
关闭防火墙(所有节点)
CentOS的防火墙服务firewalld用于限制特定端口的外部访问。Hadoop包含了多种服务,使用到了不同端口,因此需要将所有节点的防火墙关闭。
systemctl stop firewalld.service
本次集群搭建共有三个节点,包括一个主节点master,和两个从节点slave1和slave2。
以主机点master为例,修改主机名为master,可使用bash命令使操作直接生效:
hostnamectl set-hostname master #永久修改
bash
//主机名映射配置(所有节点)
配置集群中各组成节点的主机名和IP地址的映射,打开文件/etc/hosts。
vim /etc/hosts
在文件末尾添加如下内容,以实际的主机名和IP地址为准。可使用ifconfig命令查看实际IP地址。
192.168.43.249 master
192.168.43.31 slave1
192.168.43.229 slave2
如果需要在本Windows上直接通过主机名访问虚拟机的服务端口,需要在本机hosts文件中添加上述映射关系,并且关闭centos防火墙。
Hadoop启动后,namenode通过SSH来启动和停止datanode上的各种进程。这里必须在节点间执行指令的时候是免密码登录的形式。而且方便跨节点执行指令的时候,也需要免秘钥登录的形式
mv id_rsa.pub authorized_keys_slave1.pub
scp -r /root/.ssh/authorized_keys_node1.pub root@master:/root /.ssh/
cat authorized_keys_slave1.pub >> authorized_keys
测试 :
在master上 ssh slave1 slave2
在slave1上 ssh master, ssh slave2
在slave2上 ssh master, ssh slave1
不需要密码则成功
使用tar命令将jdk-8u192-linux-x64.tar.gz文件解压缩到文件夹/usr/local/java。
sudo mkdir /usr/local/java
sudo tar -zxf jdk-8u192-linux-x64.tar.gz -C /usr/local/java/
在主节点上使用scp命令从主节点复制JAVA路径到从节点的相同路径。
scp -r /usr/local/java/ slave1:/usr/local/
scp -r /usr/local/java/ slave2:/usr/local/
在主从节点中配置java环境变量,在/etc/profile文件最后,添加如下内容:
sudo vi /etc/profile
export JAVA_HOME=/usr/local/java
export CLASSPATH=$JAVA_HOME/lib/
export PATH=$PATH:$JAVA_HOME/bin
在主节点上使用scp命令从主节点复制JAVA环境变量到从节点的相同路径。
scp -r /etc/profile slave1:/etc/profile
scp -r /etc/profile slave2:/etc/profile
退出vi编辑器,使环境变量设置立即生效。(所有节点)
source /etc/profile
tar -zxvf .tar.gz -C …
将下载好的安装包解压到目录 /usr/local/
配置文件core-site.xml hdfs-site.xml hadoop-env.sh slaves yarn-site.xml(resourcemanager)
https://blog.csdn.net/u012841977/article/details/103057847
1 修改 core-site.xml
进入路径 /usr/local/hadoop-2.10.0/etc/hadoop
表示hdfs基本路径,默认端口9000
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
</property>
</configuration>
2 修改 hdfs-site.xml
dfs.replication:数据库备份数量,不能大于DataNode数量
dfs.datanode.data.dir:datanode存储数据地方
dfs.namenode.data.dir:namenode存储数据地方
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/usr/local/hdfs/name</value>
</property>
<property>
<name>dfs.namenode.data.dir</name>
<value>/usr/local/hdfs/data</value>
</property>
</configuration>
3 修改 yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<!-- 自己的ip端口默认 -->
<value>master</value>
<!---以下可不配置---!>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
</configuration>
4 hadoop-env.sh
修改对应行为 :
export JAVA_HOME=/usr/local/java
5 `vim slaves`(没有则创建新文件)
将里面的localhost删除,添加如下内容:(指定从节点datanode)
slave1
slave2
6 mapred-site.xml 指定yarn资源调度
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
修改环境变量: vim /etc/profile
使修改后环境变量生效:source /etc/profile
hadoop目录下的 etc
打开从节点列表配置文件/etc/hadoop/,创建文件slaves加入从节点的主机名
该文件看起来如下所示。
slave1
slave2
同步master的文件到slave节点:
scp -r /usr/local/hadoop slave1:/usr/local/
scp -r /usr/local/hadoop slave2:/usr/local/
初次启动前主节点需要
hadoop -format namenode
或者 bin/hdfs namenode -format
进入到目录sbin(环境变量添加了sbin的,可以直接执行sh文件)
运行./start-dfs.sh
,启动hdfs服务
运行./start-yarn.sh
,启动yarn服务
在master 和 slave上运行 jps 可以看到 master启动了namenode 和secondarynamenode slave上启动了datanode
测试实例:
Make the HDFS directories required to execute MapReduce jobs:
$ bin/hdfs dfs -mkdir /user
$ bin/hdfs dfs -mkdir /user/<username>
Copy the input files into the distributed filesystem:
$ bin/hdfs dfs -mkdir input
$ bin/hdfs dfs -put etc/hadoop/*.xml input
Run some of the examples provided:
$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.2.jar grep input output 'dfs[a-z.]+'
Examine the output files: Copy the output files from the distributed filesystem to the local filesystem and examine them:
$ bin/hdfs dfs -get output output
$ cat output/*
or
View the output files on the distributed filesystem:
$ bin/hdfs dfs -cat output/*
When you’re done, stop the daemons with:
$ sbin/stop-dfs.sh
启动警告:
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.apache.hadoop.security.authentication.util.KerberosUtil (file:/usr/local/hadoop/share/hadoop/common/lib/hadoop-auth-2.10.0.jar) to method sun.security.krb5.Config.getInstance()
WARNING: Please consider reporting this to the maintainers of org.apache.hadoop.security.authentication.util.KerberosUtil
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
Starting namenodes on [master]
master: starting namenode, logging to /usr/local/hadoop/logs/hadoop-root-namenode-master.out
master: WARNING: An illegal reflective access operation has occurred
master: WARNING: Illegal reflective access by org.apache.hadoop.security.authentication.util.KerberosUtil (file:/usr/local/hadoop/share/hadoop/common/lib/hadoop-auth-2.10.0.jar) to method sun.security.krb5.Config.getInstance()
master: WARNING: Please consider reporting this to the maintainers of org.apache.hadoop.security.authentication.util.KerberosUtil
master: WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
master: WARNING: All illegal access operations will be denied in a future release
网上查询解释说jdk版本太高 : 配置版本jdk13
受不了这一行行的了 换jdk8
hint:搭建的环境含有一台namenode节点,两台为datanode节点;通过访问namenode节点来得知数据在datanode上的存储;
Hadoop中的一些组件如Hive、Sqoop、Hue或Oozie需要关系型数据库存储一些辅助信息才能正常运行,如Hive需要将元数据(metadata)存储在关系型数据库中。本节以MySQL为例。
使用yum命令安装MySQL软件包。
yum install mysql-server
使用systemctl enable命令配置MySQL服务在系统启动时自动启动。
systemctl enable mysqld
使用systemctl start命令启动MySQL服务。
systemctl start mysqld
查找mysql目录 whereis mysql
查看mysql版本 mysql -V
登录到mysql mysql -u[root] -p[password]
hint : 3.5.5之后的版本下载带bin 可以直接使用,避免很多麻烦,具体差异可看官网 (来自重装的痛苦)
安装解压.tar.gz
进入目录:cd /root/zookeeper/conf
cp zoo_sample.cfg zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper/data
dataLogDir=/usr/local/zookeeper/log
clientPort=2181
server.0=master:8880:7770
server.1=slave1:8881:7771
server.2=slave2:8882:7772
出错可尝试动态配置:
https://blog.csdn.net/u014630623/article/details/103695314
scp -r /usr/local/zookeeper slave1:/usr/local/
scp -r /usr/local/zookeeper slave2:/usr/local/
在三台机器上新增myid文件
进入/root/zookeeper/data 路径,分别创建文件输入0 1 2
存放的标识本台服务器的文件是整个zk集群用来发现彼此的一个重要标识
在master机器上 vim myid 输入 0
在slave1机器上 vim myid 输入 1
在slave2机器上 vim myid 输入 2
启动(每个节点都需要启动 关闭防火墙(所有节点))!
bin/zkServer.sh start
bin/zkServer.sh status
bin/zkServer.sh stop
jps进程 显示含有 QuorumPeerMain
bin/zkServer.sh status 会有leader follower
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port not found in static config file. Looking in dynamic config file.
Client port found: 2181. Client address: localhost.
Error contacting service. It is probably not running.
记得关闭防火墙再启动zookeeper…
#事务ID ZooKeeper 状态的每次变化都接收一个 ZXID(ZooKeeper 事务 id)形式的标记。ZXID 是一个 64 位的数字,由 Leader 统一分配,全局唯一,不断递增。ZXID 展示了所有的ZooKeeper 的变更顺序。每次变更会有一个唯一的
zxid,如果 zxid1 小于 zxid2 说明 zxid1 在 zxid2 之前发生。
#Zookeeper 集群初始化启动时 Leader 选举(为何总是第二台机器被选择为leader) 若进行 Leader 选举,则至少需要两台机器,这里选取 3 台机器组成的服务器集群为例。初始化启动期间 Leader 选举流程如下图所示。 这里写图片描述在集群初始化阶段,当有一台服务器 ZK1 启动时,其单独无法进行和完成 Leader 选举,当第二台服务器 ZK2
启动时,此时两台机器可以相互通信,每台机器都试图找到 Leader,于是进入 Leader 选举过程。选举过程开始,过程如下:(1) 每个Server发出一个投票。由于是初始情况,ZK1 和 ZK2 都会将自己作为 Leader
服务器来进行投票,每次投票会包含所推举的服务器的 myid 和 ZXID,使用(myid, ZXID)来表示,此时 ZK1 的投票为(1,
0),ZK2 的投票为(2, 0),然后各自将这个投票发给集群中其他机器。(2) 接受来自各个服务器的投票。集群的每个服务器收到投票后,首先判断该投票的有效性,如检查是否是本轮投票、是否来自 LOOKING
状态的服务器。(3) 处理投票。针对每一个投票,服务器都需要将别人的投票和自己的投票进行比较,规则如下
优先检查 ZXID。ZXID 比较大的服务器优先作为 Leader。 如果 ZXID 相同,那么就比较 myid。myid
较大的服务器作为Leader服务器。 对于 ZK1 而言,它的投票是(1, 0),接收 ZK2 的投票为(2, 0),首先会比较两者的
ZXID,均为 0,再比较 myid,此时 ZK2 的 myid 最大,于是 ZK2 胜。ZK1 更新自己的投票为(2,
0),并将投票重新发送给 ZK2。 (4)
统计投票。每次投票后,服务器都会统计投票信息,判断是否已经有过半机器接受到相同的投票信息,对于 ZK1、ZK2
而言,都统计出集群中已经有两台机器接受了(2, 0)的投票信息,此时便认为已经选出 ZK2 作为Leader。(5) 改变服务器状态。一旦确定了 Leader,每个服务器就会更新自己的状态,如果是Follower,那么就变更为
FOLLOWING,如果是 Leader,就变更为 LEADING。当新的 Zookeeper 节点 ZK3 启动时,发现已经有
Leader 了,不再选举,直接将直接的状态从 LOOKING 改为 FOLLOWING。#Zookeeper 集群运行期间 Leader 重新选 在 Zookeeper 运行期间,如果 Leader 节点挂了,那么整个 Zookeeper 集群将暂停对外服务,进入新一轮Leader选举。假设正在运行的有 ZK1、ZK2、ZK3 三台服务器,当前 Leader
是 ZK2,若某一时刻 Leader 挂了,此时便开始 Leader 选举。选举过程如下图所示。 这里写图片描述(1) 变更状态。Leader 挂后,余下的非 Observer 服务器都会讲自己的服务器状态变更为 LOOKING,然后开始进入
Leader 选举过程。(2) 每个Server会发出一个投票。在运行期间,每个服务器上的 ZXID 可能不同,此时假定 ZK1 的 ZXID 为 124,ZK3
的 ZXID 为 123;在第一轮投票中,ZK1 和 ZK3 都会投自己,产生投票(1, 124),(3,
123),然后各自将投票发送给集群中所有机器。(3) 接收来自各个服务器的投票。与启动时过程相同。
(4) 处理投票。与启动时过程相同,由于 ZK1 事务 ID 大,ZK1 将会成为 Leader。
(5) 统计投票。与启动时过程相同。
(6) 改变服务器的状态。与启动时过程相同。
1. 解压文件
tar -zxvf *.tgz
2. 配置slaves
进入路径 /usr/local/spark/conf
复制文件 cp slaves.template slaves
修改文件 vim slaves, 输入 slave1 slave2
3. 配置spark-env.sh
复制文件 cp spark-env.sh.template spark-env.sh
修改文件 vim spark-env.sh , 输入$JAVA_HOME
export JAVA_HOME=/usr/local/jdk-13
4.master节点配置好的文件分发到slave节点
scp -r /usr/local/spark/ slave1:/usr/local/
scp -r /usr/local/spark/ slave2:/usr/local/
5. 配置环境变量
Spark安装路径 /usr/local/spark/
vim /etc/profile
source /etc/profile
6. web端打开spark监控窗口
启动命令在sbin目录下 start-all.sh 启动所有主从结点
jps存在worker或master进程
http://master:8080/
7. 运行实例
bin/spark-submit --class org.apache.spark.examples.SparkPi --master spark://master:7077 examples/jars/spark-examples_2.12-3.0.1.jar
输出结果中有:
21/03/19 23:12:11 INFO DAGScheduler: Job 0 is finished. Cancelling potential speculative or zombie tasks for this job
21/03/19 23:12:11 INFO TaskSchedulerImpl: Killing all running tasks in stage 0: Stage finished
21/03/19 23:12:11 INFO DAGScheduler: Job 0 finished: reduce at SparkPi.scala:38, took 2.074040 s
Pi is roughly 3.1448957244786224
ERROR TransportRequestHandler: Error while invoking RpcHandler#receive() for one-way message.
查询后大部分说是资源问题,因为不影响结果的输出,所以暂时没有处理
1、这个可能是一个资源问题,应该给任务分配更多的 cores 和Executors,并且分配更多的内存。并且需要给RDD分配更多的分区
2、在配置资源中加入这句话也许能解决你的问题:–conf spark.dynamicAllocation.enabled=false
hint:特别注意启动程序之间的冲突,hadoop和spark具有相同的启动命令,注意环境变量的设置和命令的运行,可指定当前路径下的文件执行.
解压hive安装包 tar -zxvf apache-hive-2.3.3-bin.tar.gz
创建配置文件hive-site.xml
在 /root/hive/apache-hive-2.3.3-bin/conf 路径下新建配置文件hive-site.xml
javax.jdo.option.ConnectionURL</name>
jdbc:mysql://master:3306/hive?createDatabaseIfNotExist=true</value>
JDBC connect string for a JDBC metastore</description>
</property>
javax.jdo.option.ConnectionDriverName</name>
com.mysql.jdbc.Driver</value>
Driver class name for a JDBC metastore</description>
</property>
javax.jdo.option.ConnectionUserName</name>
root</value>
username to use against metastore database</description>
</property>
javax.jdo.option.ConnectionPassword</name>
200425</value>
password to use against metastore database</description>
</property>
hive.metastore.warehouse.dir</name>
/usr/local/hive/warehouse</value>
</property>
hbase.zookeeper.quorum</name>
master,slave1,slave2</value>
</property>
</configuration>
上传jdk1.8对应驱动包
上传至/usr/local/hive/lib
MySQL作为元数据管理,初始化配置
schematool -dbType mysql -initSchema
初始化设置成功
Metastore connection URL: jdbc:mysql://master:3306/hive?createDatabaseIfNotExist=true
Metastore Connection Driver : com.mysql.jdbc.Driver
Metastore connection User: root
Starting metastore schema initialization to 2.3.0
Initialization script hive-schema-2.3.0.mysql.sql
Initialization script completed
schemaTool completed
错误:
org.apache.hadoop.hive.metastore.HiveMetaException: Failed to get schema version.
Underlying cause: java.sql.SQLException : null, message from server: "Host 'master' is not allowed to connect to this MySQL server"
SQL Error code: 1130
Use --verbose for detailed stacktrace.
*** schemaTool failed ***
解决方法:
配置mysql连接权限
解压hbase安装包 tar -zxvf hbase-2.3.3-bin.tar.gz
修改 hbase-site.xml 配置
进入 /usr/local/hbase/conf 路径
hbase.rootdir 是hbase数据在hdfs上存储路径
hbase.cluster.distributed 分布式存储
hbase.zookeeper.quorum 使用zookeeper管理
<!--配置zk本地数据存放目录--!>
hbase.zookeeper.property.dataDir</name>
/home/centos/hbase/zk</value>
</property>
hbase.rootdir</name>
hdfs://master:9000</value>
</property>
hbase.cluster.distributed</name>
true</value>
</property>
hbase.zookeeper.quorum</name>
master,slave1,slave2</value>
</property>
</configuration>
export JAVA_HOME=/usr/local/java
export HBASE_CLASSPATH=/usr/local/hadoop/etc/hadoop
export HBASE_MANAGES_ZK=false
slave1
slave2
scp -r /usr/local/hbase slave1:/usr/local/
scp -r /usr/local/hbase slave2:/usr/local/
配置hbase环境变量
vim /etc/profile
source /etc/profile
启动hbase
先需要启动hdfs和zookeeper
start-dfs.sh
(主节点)
zkServer.sh start
(所有节点 需要关闭防火墙)
start-hbase.sh
(所有节点 需要关闭防火墙)
访问hbase的web监控 http://192.168.43.249:16010
hbase shell
正确显示:
master:6178 Jps
8352 SecondaryNameNode
9889 HMaster
10056 Jps
8510 QuorumPeerMain
8143 NameNode
slave:
9030 HRegionServer
8811 DataNode
8942 QuorumPeerMain
9119 Jps
启动hbase出错:
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/hbase/lib/client-facing-thirdparty/slf4j-log4j12-1.7.30.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
running master, logging to /usr/local/hbase/logs/hbase-root-master-master.out
slave1: running regionserver, logging to /usr/local/hbase/bin/../logs/hbase-root-regionserver-slave1.out
slave2: running regionserver, logging to /usr/local/hbase/bin/../logs/hbase-root-regionserver-slave2.out
解决方法:
删除冲突的jar包
不是有效标识,把等号左右的空格去掉就好了
小插曲:
启动namenode失败 secondarynamenode存在
删除所有的tmp和logs
hadoop namenode -format
再重新启动dfs
初始化千万不要多次使用 只有在最开始部署时初始化一次就好 血的教训
启动HBASE之后会自动结束进程:
检查conf/zoo.cfg中的配置文件,发现多了一个pid,该文件为上次暴力关闭电脑,未关闭zk导致的。
结论:服务未正常退出,删除该zookeeper_server.pid即可