在三台服务器上搭建完整的Hadoop集群!

1 实验环境

个人笔记本电脑、虚拟机软件:vmware 15 、putty、psftp
安装三台虚拟机,操作系统为centos7,Hadoop平台所需的软件包版本及目录如下

软件包名 软件名称 版本 安装目录
jdk-7u80-linux-x64.tar.gz java软件开发工具包 1.7.80 /usr/local/jdk1.7.0_80
mysql-5.6.37-linux-glibc2.12-x86_64.tar.gz MySQL 5.6.37 /usr/local/mysql
zookeeper-3.4.6.tar.gz Zookeeper 3.4.6 /usr/local/zookeeper-3.4.6
kafka_2.10-0.8.2.1.tgz Kafka 2.10.-0.8.2.1 /usr/local/kafka_2.10.-0.8.2.1
hadoop-2.6.5.tar.gz Hadoop 2.6.5 /usr/local/hadoop-2.6.5
hbase-1.2.6-bin.tar.gz HBase 1.2.6 /usr/local/hbase-1.2.6
apache-hive-1.1.0-bin.tar.gz Hive 1.1.0 /usr/local/apache-hive-1.1.0-bin
mysql-connector-java-5.1.43-bin.jar MySQL JDBC驱动 5.1.43 /usr/local/apache-hive-1.1.0-bin/lib/
scala-2.10.6.tgz Scala 2.10.6 /usr/local/scala-2.10.6
spark-1.6.3-bin-hadoop2.6.tgz Spark 1.6.3 /usr/local/spark-1.6.3-bin-hadoop2.6
apache-storm-1.1.1.tar.gz Storm 1.1.1 /usr/local/apache-storm-1.1.1

​ 根据Hadoop1.0体系的架构图,Zookeeper负责为分布式应用程序协调服务,最下面是数据来源,可能有文件,数据库,各种采集系统等,kafka用来接入数据,storm可以对接入的数据进行实时解析处理,而Map/Reduce,Spark,hive等可以进行离线数据分析处理,HDFS、MySQL、HBase组成了大数据平台的存储系统。

3.1 安装虚拟机

下载系统镜像,CentOS-7-x86_64-Minimal-1511.iso,使用vmware分别安装到三个虚拟机上。这里分别配置了2G内存;20G动态分配磁盘;两张网卡,NAT和Host-only各一。

3.2 准备工作

1)关闭防火墙和Selinux
# systemctl stop firewalld.service // 关闭防火墙和 selinux
# systemctl disable firewalld.service // 禁止 firewall 开机启动
# vi /etc/selinux/config // 禁止 firewall 开机启动
# SELINUX=disabled //将SELINUX 设置为 disabled 
# reboot // 重启
# getenforce // 重启机器后 root 用户查看 Selinux 状态
2)安装软件

以下软件是安装时需要的依赖环境,安装 MySQL 时需要使用 perl 和 libaio,ntpdate 负责集群内服务器时间,screen 用于新建后台任务。

#每台都要执行
# yum install perl* 
# yum install ntpdate 
# yum install libaio 
# yum install screen 
3) 配置网络

每台虚拟机的两张网卡, NAT 网络用来创建包含三台虚拟机的局域网环境;Host-Only用来使与主机通信,以便使用 putty 或 secureCRT 等 SSH 工具从笔记本连接到虚拟机,然后将文档中提供的配置文件内容复制粘贴进去。

#ip addr #查看网络

# 编辑网卡配置
# 需要自行设置HostOnly网络的地址
# 新增 IPADDR=192.168.133.121(cluster2 设置为 192.168.133.122,cluster3 为 192.168.133.123)
# NETMASK=255.255.255.0 
# NETWORK=192.168.133.0 

# vi /etc/sysconfig/network-scripts/ifcfg-enxxxx #xxx是网卡名

# 重启网络服务 
# service network restar

编辑三台机器的host文件

# vi /etc/hosts // 修改 hosts 
192.168.64.139 cluster1 
192.168.64.141 cluster2 
192.168.64.140 cluster3 

配置的网络地址如表,三机器NAT地址能相互ping通,主机能ping通三机器HostOnly地址即可

cluster1 cluster2 cluster3
NAT 192.168.64.139 192.168.64.141 192.168.64.140
Host only 192.168.133.121 192.168.133.122 192.168.133.123
4)新建hadoop用户
# groupadd hadoop // 新建 hadoop 组
# useradd -s /bin/bash -g hadoop -d /home/hadoop -m hadoop // 新建 hadoop 用户
# passwd hadoop // 修改 hadoop 这个用户的密码
5)生成ssh密钥并分发

只在 cluster1 上执行

$ ssh-keygen -t rsa // 生成 ssh 密钥(cluster1 上),切换到 hadoop 用户
// 接下来分发密钥,请仔细观察显示的内容,会让你输入 yes 
$ ssh-copy-id cluster1 
$ ssh-copy-id cluster2 
$ ssh-copy-id cluster3
6)安装 NTP 服务

用于同步三机器时间

# yum install ntpdate // 三台都要安装
# yum install ntp // cluster1 上装 ntp 

3.3 MySQL

只在cluster2上安装MySQL,因为我们的集群中,只有cluster2上需要安装一个MySQL

# yum remove mysql mysql-server mysql-libs compat-mysql51
# rm -rf /var/lib/mysql
# rm -rf /etc/my.cnf
下载mysql-5.6.37-linux-glibc2.12-x86_64
# cp mysql-5.6.37-linux-glibc2.12-x86_64.tar.gz /usr/local/
// 解压到/usr/local/
# tar -zxvf mysql-5.6.41-linux-glibc2.12-x86_64.tar.gz
// 改名为mysql
# mv mysql-5.6.41-linux-glibc2.12-x86_64 mysql
// 删除安装包
# rm mysql-5.6.41-linux-glibc2.12-x86_64.tar.gz
// 修改环境变量
# vi /etc/profile
在最下面添加
export MYSQL_HOME=/usr/local/mysql
export PATH=$MYSQL_HOME/bin:$PATH
// 刷新环境变量
# source /etc/profile
// 新建mysql用户
# groupadd mysql     在/etc/group中可以看到
# useradd -r -g mysql -s /bin/false mysql  在/etc/passwd中可以看到
# cd /usr/local/mysql
# chown -R mysql:mysql .
# scripts/mysql_install_db --user=mysql
// 修改当前目录拥有者为root用户
# chown -R root .
// 修改当前data目录拥有者为mysql用户
# chown -R mysql data
// 新建一个虚拟窗口,叫mysql
# screen -S mysql
# bin/mysqld_safe --user=mysql &
// 退出虚拟窗口
# Ctrl+A+D
# cd /usr/local/mysql
// 登陆mysql
# bin/mysql
// 登陆成功后退出即可
# exit;
// 进行root账户密码的修改等操作
# bin/mysql_secure_installation
首先要求输入root密码,由于我们没有设置过root密码,括号里面说了,如果没有root密码就直接按回车。是否设定root密码,选y,设定密码为cluster,是否移除匿名用户:y。然后有个是否关闭root账户的远程登录,选n,删除test这个数据库?y,更新权限?y,然后ok。
# cp support-files/mysql.server /etc/init.d/mysql.server
// 进入mysql虚拟窗口
# screen -r mysql
// 查看mysql的进程号
# ps -ef | grep mysql
// 如果有的话就kill掉,保证mysql已经中断运行了,一般kill掉/usr/local/mysql/bin/mysqld开头的即可
# kill 进程号
// 关闭虚拟窗口
# exit
// 启动mysql
# /etc/init.d/mysql.server start -user=mysql
# exit
还需要配置一下访问权限:
$ mysql -u root -p
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'cluster' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;

MySQL简单操作

mysql> create database test_table;
mysql> use test_table;
mysql> create table userinfo(id int not null);
mysql> insert into userinfo values(1);
mysql> select * from userinfo;
mysql> drop database test_table;
mysql> show databases;


3.4 JDK

每台都要安装

$ su root
# cp jdk-7u80-linux-x64.tar.gz /usr/local/
# tar -zxvf jdk-7u80-linux-x64.tar.gz
// 修改环境变量
# vi /etc/profile
// 添加以下内容
export JAVA_HOME=/usr/local/jdk1.7.0_80/
export JRE_HOME=/usr/local//jdk1.7.0_80/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$JAVA_HOME:$PATH
// 复制jdk到其他的服务器上
# scp -r /usr/local/jdk1.7.0_80/ cluster2:/usr/local/
# scp -r /usr/local/jdk1.7.0_80/ cluster3:/usr/local/
// cluster2上
# vi /etc/profile
// 添加以下内容
export JAVA_HOME=/usr/local/jdk1.7.0_80/
export JRE_HOME=/usr/local/jdk1.7.0_80/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$JAVA_HOME:$PATH
// cluster3上
# vi /etc/profile
// 添加以下内容
export JAVA_HOME=/usr/local/jdk1.7.0_80/
export JRE_HOME=/usr/local//jdk1.7.0_80/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$JAVA_HOME:$PATH


3.5 Zookeeper

每台都要安装

// cluster1上
将zookeeper解压到/usr/local目录下,配置环境变量
# vi /etc/profile
// 添加以下内容
export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.6
export PATH=$ZOOKEEPER_HOME/bin:$PATH
# cd /usr/local/zookeeper-3.4.6
// 在conf中新建zoo.cfg文件
# vi conf/zoo.cfg
// 输入以下内容
# 客户端心跳时间(毫秒)
tickTime=2000
# 允许心跳间隔的最大时间
initLimit=10
# 同步时限
syncLimit=5
# 数据存储目录
dataDir=/home/hadoop_files/hadoop_data/zookeeper
# 数据日志存储目录
dataLogDir=/home/hadoop_files/hadoop_logs/zookeeper/dataLog
# 端口号
clientPort=2181
# 集群节点和服务端口配置
server.1=cluster1:2888:3888
server.2=cluster2:2888:3888
server.3=cluster3:2888:3888
// 创建zookeeper的数据存储目录和日志存储目录
# mkdir -p /home/hadoop_files/hadoop_data/zookeeper
# mkdir -p /home/hadoop_files/hadoop_logs/zookeeper/dataLog
# mkdir -p /home/hadoop_files/hadoop_logs/zookeeper/logs
// 修改文件夹的权限
# chown -R hadoop:hadoop /home/hadoop_files
# chown -R hadoop:hadoop /usr/local/zookeeper-3.4.6
// 在cluster1号服务器的data目录中创建一个文件myid,输入内容为1
// myid应与zoo.cfg中的集群节点相匹配
# echo "1" >> /home/hadoop_files/hadoop_data/zookeeper/myid
// 修改zookeeper的日志输出路径(注意CDH版与原生版配置文件不同)
# vi bin/zkEnv.sh
// 将配置文件里面的以下项替换为红字的内容
if [ "x${ZOO_LOG_DIR}" = "x" ]
then
   ZOO_LOG_DIR="/home/hadoop_files/hadoop_logs/zookeeper/logs"
fi
if [ "x${ZOO_LOG4J_PROP}" = "x" ]
then
   ZOO_LOG4J_PROP="INFO,ROLLINGFILE"
fi

// 修改zookeeper的日志配置文件
# vi conf/log4j.properties
// 修改为以下内容:
zookeeper.root.logger=INFO,ROLLINGFILE
log4j.appender.ROLLINGFILE=org.apache.log4j.DailyRollingFileAppender
将这个zookeeper-3.4.6的目录复制到其他的两个节点上
# scp -r /usr/local/zookeeper-3.4.6 cluster2:/usr/local/
# scp -r /usr/local/zookeeper-3.4.6 cluster3:/usr/local/
// 退回hadoop用户
# exit
// 刷新环境变量
$ source /etc/profile
// 启动zookeeper
$ zkServer.sh start
// cluster2上面 改环境变量,加入以下内容
export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.6
export PATH=$ZOOKEEPER_HOME/bin:$PATH
// 创建zookeeper的数据存储目录和日志存储目录
$ su root
# mkdir -p /home/hadoop_files/hadoop_data/zookeeper
# mkdir -p /home/hadoop_files/hadoop_logs/zookeeper/dataLog
# mkdir -p /home/hadoop_files/hadoop_logs/zookeeper/logs
// 添加myid
# echo "2" >> /home/hadoop_files/hadoop_data/zookeeper/myid
// 修改文件夹的权限
# chown -R hadoop:hadoop /home/hadoop_files
# chown -R hadoop:hadoop /usr/local/zookeeper-3.4.6
// 退回hadoop用户
# exit
// 刷新环境变量
$ source /etc/profile
// 启动zookeeper
$ zkServer.sh start
// cluster3上面 加环境变量
# vi /etc/profile
export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.6
export PATH=$ZOOKEEPER_HOME/bin:$PATH
// 创建zookeeper的数据存储目录和日志存储目录
# mkdir -p /home/hadoop_files/hadoop_data/zookeeper
# mkdir -p /home/hadoop_files/hadoop_logs/zookeeper/dataLog
# mkdir -p /home/hadoop_files/hadoop_logs/zookeeper/logs
// 添加myid
# echo "3" >> /home/hadoop_files/hadoop_data/zookeeper/myid
// 修改文件夹的权限
# chown -R hadoop:hadoop /home/hadoop_files
# chown -R hadoop:hadoop /usr/local/zookeeper-3.4.6
// 退回hadoop用户
# exit
// 刷新环境变量
$ source /etc/profile
// 启动zookeeper(每台都要执行,而且三台要接连执行,都启动后再做下面的)
$ zkServer.sh start
// 三台zookeeper都启动后,使用jps命令查看进程是否启动
# jps
可以看到一个叫QuorumPeerMain的进程,说明zookeeper启动成功
// 退出root用户
# exit
// 查看zookeeper状态
$ zkServer.sh status

1585472263691

3.6 kafka

每台都要安装

// cluster1上
kafka_2.10-0.8.2.1解压到/usr/local
//添加环境变量
export KAFKA_HOME=/usr/local/kafka_2.10-0.8.2.1
export PATH=$KAFKA_HOME/bin:$PATH
// 修改配置文件
# vi /usr/local/kafka_2.10-0.8.2.1/config/server.properties
// 修改下面3项
// 第一项:这个值要唯一,不同的机器不能相同,cluster1就写1,cluster2就写2,cluster3就写3
broker.id=1
zookeeper.connect=cluster1:2181,cluster2:2181,cluster3:2181
// 第二项:修改日志路径
log.dirs=/home/hadoop_files/hadoop_logs/kafka
// 第三项:此处要写zookeeper集群的ip+端口号,逗号隔开
zookeeper.connect=cluster1:2181,cluster2:2181,cluster3:2181
//修改完环境变量,更新配置文件
#source /etc/profile
// 保存退出后创建logs文件夹
# mkdir -p /home/hadoop_files/hadoop_logs/kafka
// 修改权限
# chown -R hadoop:hadoop /home/hadoop_files
# chown -R hadoop:hadoop /usr/local/kafka_2.10-0.8.2.1
// 复制文件夹
# scp -r /usr/local/kafka_2.10-0.8.2.1 cluster2:/usr/local/
# scp -r /usr/local/kafka_2.10-0.8.2.1 cluster3:/usr/local/
// cluster2上
# vi /usr/local/kafka_2.10-0.8.2.1/config/server.properties
broker.id=2
// cluster3上
broker.id=3
// 使用hadoop用户启动kafka集群
先启动zookeeper集群,然后在kafka集群中的每个节点使用
$kafka-server-start.sh /usr/local/kafka_2.10-0.8.2.1/config/server.properties &


简单操作

// 创建topic
$ kafka-topics.sh --create --zookeeper cluster1:2181,cluster2:2181,cluster3:2181 --replication-factor 3 --partitions 1 --topic mykafka
// 查看Topic:
$ kafka-topics.sh --list --zookeeper cluster1:2181,cluster2:2181,cluster3:2181
此时会显示Topic:mykafka
 
// 查看详细信息
$ kafka-topics.sh --describe --zookeeper cluster1:2181,cluster2:2181,cluster3:2181
// 发送消息(cluster1上执行)
$ kafka-console-producer.sh --broker-list localhost:9092 --topic mykafka
// 接收消息(cluster2上执行)
$ kafka-console-consumer.sh -zookeeper cluster1:2181,cluster2:2181,cluster3:2181 --topic mykafka --from-beginning

3.7 hadoop

每台都要安装,Hadoop启动的先决条件是zookeeper已经成功启动

// 在cluster1节点/usr/local/解压hadoop安装包
$ su root
# tar -zxvf hadoop-2.6.5.tar.gz
// 删除安装包
# rm hadoop-2.6.5.tar.gz
// 切换到存有hadoop配置文件的目录
# cd /usr/local/hadoop-2.6.5/etc/hadoop
// 修改hadoop-env.sh文件
# vi hadoop-env.sh
将export JAVA_HOME=${JAVA_HOME}替换为export JAVA_HOME=/usr/local/jdk1.7.0_80
export HADOOP_PID_DIR=/home/hadoop_files
// 配置mapred-env.sh
# vi mapred-env.sh
export HADOOP_MAPRED_PID_DIR=/home/hadoop_files
// 配置core-site.xml文件
# vi core-site.xml
<configuration>
  <!-- 指定hdfs的nameservices名称为mycluster,与hdfs-site.xml的HA配置相同 -->
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://cluster1:9000</value>
  </property>
	
  <!-- 指定缓存文件存储的路径 -->
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/home/hadoop_files/hadoop_tmp/hadoop/data/tmp</value>
  </property>

  <!-- 配置hdfs文件被永久删除前保留的时间(单位:分钟),默认值为0表明垃圾回收站功能关闭 -->
  <property>
    <name>fs.trash.interval</name>
    <value>1440</value>
  </property>
  <!-- 指定zookeeper地址,配置HA时需要 -->
  <property>
    <name>ha.zookeeper.quorum</name>
    <value>cluster1:2181,cluster2:2181,cluster3:2181</value>
  </property>
</configuration>
// 配置hdfs-site.xml文件
# vi hdfs-site.xml
<configuration>
  <!-- 指定hdfs元数据存储的路径 -->
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>/home/hadoop_files/hadoop_data/hadoop/namenode</value>
  </property>
  <!-- 指定hdfs数据存储的路径 -->
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>/home/hadoop_files/hadoop_data/hadoop/datanode</value>
  </property>
<property>
    <name>dfs.secondary.http.address</name>
    <value>cluster1:50090</value>
  </property>
  <!-- 数据备份的个数 -->
  <property>
    <name>dfs.replication</name>
    <value>3</value>
  </property>
  <!-- 关闭权限验证 -->
  <property>
    <name>dfs.permissions.enabled</name>
    <value>false</value>
  </property>
  <!-- 开启WebHDFS功能(基于REST的接口服务) -->
  <property>
    <name>dfs.webhdfs.enabled</name>
    <value>true</value>
  </property>
</configuration>
// 配置mapred-site.xml文件
# vi mapred-site.xml
<configuration>
  <!-- 指定MapReduce计算框架使用YARN -->
  <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>
  <!-- 指定jobhistory server的rpc地址 -->
  <property>
    <name>mapreduce.jobhistory.address</name>
    <value>cluster1:10020</value>
  </property>
  <!-- 指定jobhistory server的http地址 -->
  <property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>cluster1:19888</value>
  </property>
</configuration>
// 配置yarn-site.xml文件
# vi yarn-site.xml
<configuration>
  <!-- NodeManager上运行的附属服务,需配置成mapreduce_shuffle才可运行MapReduce程序 -->
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>
  <!-- 配置Web Application Proxy安全代理(防止yarn被攻击) -->
  <property>
    <name>yarn.web-proxy.address</name>
    <value>cluster2:8888</value>
  </property>
  <!-- 开启日志 -->
  <property>
    <name>yarn.log-aggregation-enable</name>
    <value>true</value>
  </property>
  <!-- 配置日志删除时间为7天,-1为禁用,单位为秒 -->
  <property>
    <name>yarn.log-aggregation.retain-seconds</name>
    <value>604800</value>
  </property>
  <!-- 修改日志目录 -->
  <property>
    <name>yarn.nodemanager.remote-app-log-dir</name>
    <value>/home/hadoop_files/hadoop_logs/yarn</value>
  </property>
  <property>
   <name>yarn.resourcemanager.address</name>
    <value>cluster1:8032</value>
  </property>
  <property>
    <name>yarn.resourcemanager.scheduler.address</name>
    <value>cluster1:8030</value>
  </property>
  <property>
    <name>yarn.resourcemanager.resource-tracker.address</name>
<value>cluster1:8031</value>
  </property>
</configuration>

// 配置slaves文件
# vi slaves
删除localhost
添加以下内容:
cluster1
cluster2
cluster3

// 创建配置文件中涉及的目录(在所有结点上)
# mkdir -p /home/hadoop_files/hadoop_data/hadoop/namenode
# mkdir -p /home/hadoop_files/hadoop_data/hadoop/datanode
# mkdir -p /home/hadoop_files/hadoop_tmp/hadoop/data/tmp
# mkdir -p /home/hadoop_files/hadoop_logs/yarn
// 修改文件夹权限(在所有结点上)
# chown -R hadoop:hadoop /home/hadoop_files/
# chown -R hadoop:hadoop /usr/local/hadoop-2.6.5/
// 将cluster1的hadoop工作目录同步到集群其它节点
$ scp -r /usr/local/hadoop-2.6.5 cluster2:/usr/local/
$ scp -r /usr/local/hadoop-2.6.5 cluster3:/usr/local/
// 修改文件夹权限(在所有结点上)
# chown -R hadoop:hadoop /usr/local/hadoop-2.6.5/
// 在集群各节点上修改环境变量
# vi /etc/profile
export HADOOP_HOME=/usr/local/hadoop-2.6.5
export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
// 使修改的环境变量生效
$ source /etc/profile
// 启动zookeeper集群(分别在cluster1, cluster2和cluster3上执行)
$ zkServer.sh start
接下来开始格式化:
// 启动journalnode(在所有datanode上执行,也就是cluster1, cluster2, cluster3)
$ hadoop-daemon.sh start journalnode
启动后使用jps命令可以看到JournalNode进程
// 格式化HDFS(在cluster1上执行)
$ hdfs namenode -format
// 格式化完毕后可关闭journalnode(在所有datanode上执行)
$ hadoop-daemon.sh stop journalnode
// 启动HDFS(cluster1上)
$ start-dfs.sh
// 启动YARN(cluster1上)
$ start-yarn.sh

// 以下两条命令是关闭YARN和HDFS的命令,重启服务器或关机前一定要执行,否则有可能导致数据或服务损坏
// 关闭YARN的命令(cluster1上)
$ stop-yarn.sh
// 关闭HDFS的命令(cluster1上)
$ stop-dfs.sh

启动HDFS后,可以在浏览器中,打开192.168.133.121:50070,可以看到HDFS的web界面。第一页Overview是当前HDFS的概况,里面显示了HDFS的启动时间,版本等信息。点击上面标签栏的第二项Datanodes,可以看到datanode的界面。

// HDFS文件系统简单操作 
// cluster1
// 切换至hadoop用户的主目录
$ cd ~/
// 新建一个测试文件
$ vi testfile
输入
1
2
3
// 保存退出
// 查看HDFS根目录的文件
$ hdfs dfs -ls /
// 在HDFS的根目录创建test目录
$ hdfs dfs -mkdir /test
// 创建完文件夹后再次查看根目录,查看目录是否新建成功
$ hdfs dfs -ls /
// 将测试文件testfile上传至HDFS根目录下的test目录中
$ hdfs dfs -put testfile /test
// 在cluster2上
// 切换至hadoop用户的主目录
$ cd ~/
// 查看HDFS根目录
$ hdfs dfs -ls /
// 查看HDFS根目录下的test目录,可以看到我们刚才在cluster1上上传的文件testfile
$ hdfs dfs -ls /test
// 查看HDFS上的/test/testfile文件的内容
$ hdfs dfs -cat /test/testfile
// 将HDFS上的/test/testfile下载到本地
$ hdfs dfs -get /test/testfile
// 查看本地当前目录内的内容,可以看到刚才下载的testfile
$ ls

3.8 HBase

每台都要安装,HBase启动的先决条件是zookeeper和Hadoop已经启动

// 切换至root用户
$ su root
// 在cluster1节点/usr/local/解压hbase安装包
# tar -zxvf hbase-1.2.6-bin.tar.gz
// 进入hbase的conf目录
#cd /usr/local/hbase-1.2.6/conf/
// 修改hbase-env.sh
# vi hbase-env.sh
将JAVA_HOME, HADOOP_HOME, HBASE_LOG_DIR, HBASE_MANAGES_ZK修改为以下内容:
记得去掉前面的#
# 配置JDK安装路径
export JAVA_HOME=/usr/local/jdk1.7.0_80
# 配置Hadoop安装路径
export HADOOP_HOME=/usr/local/hadoop-2.6.5
# 设置HBase的日志目录
export HBASE_LOG_DIR=/home/hadoop_files/hadoop_logs/hbase/logs
# 使用独立的ZooKeeper集群
export HBASE_MANAGES_ZK=false
# 设置pid的路径
export HBASE_PID_DIR=/home/hadoop_files
// 配置hbase-site.xml
# vi hbase-site.xml
<configuration>
        <property>
            <name>hbase.rootdir</name>
            <value>hdfs://cluster1:9000/hbase</value>
        </property>
        <property>
            <name>hbase.cluster.distributed</name>
            <value>true</value>
        </property>
        <property>
            <name>hbase.master</name>
            <value>60000</value>
        </property>
        <property>
            <name>hbase.tmp.dir</name>
            <value>/home/hadoop_files/hadoop_tmp/hbase/tmp</value>
        </property>
        <property>
            <name>hbase.zookeeper.quorum</name>
            <value>cluster1,cluster2,cluster3</value>
        </property>
        <property>
            <name>hbase.zookeeper.property.dataDir</name>
            <value>/home/hadoop_files/hadoop_data/zookeeper</value>
        </property>
        <property>
            <name>hbase.zookeeper.property.clientPort</name>
            <value>2181</value>
        </property>
        <property>
            <name>zookeeper.session.timeout</name>
            <value>120000</value>
        </property>
        <property>
            <name>hbase.regionserver.restart.on.zk.expire</name>
            <value>true</value>
        </property>
		<property>
            <name>hbase.master.info.port</name>
            <value>60010</value>
        </property>
</configuration>
// 配置regionservers
# vi regionservers
删除localhost
添加:
cluster1
cluster2
cluster3
// 删除hbase的slf4j-log4j12-1.7.5.jar,解决hbase和hadoop的LSF4J包冲突
# cd /usr/local/hbase-1.2.6/lib
# mv slf4j-log4j12-1.7.5.jar slf4j-log4j12-1.7.5.jar.bk
// 将hbase工作目录同步到集群其它节点
$ scp -r /usr/local/hbase-1.2.6/ cluster2:/usr/local/
$ scp -r /usr/local/hbase-1.2.6/ cluster3: /usr/local
// 创建hbase的缓存文件目录(所有节点)
# mkdir -p /home/hadoop_files/hadoop_tmp/hbase/tmp
// 创建hbase的日志文件目录(所有节点)
$ mkdir -p /home/hadoop_files/hadoop_logs/hbase/logs
// 改权限(所有节点)
# chown -R hadoop:hadoop /usr/local/hbase-1.2.6
# chown -R hadoop:hadoop /home/hadoop_files
// 在集群各节点上修改环境变量
# vi /etc/profile
export HBASE_HOME=/usr/local/hbase-1.2.6
export PATH=$HBASE_HOME/bin:$PATH
$ source /etc/profile
// 启动HBase(cluster1上)
先启动zookeeper,Hadoop的HDFS和YARN,然后才能启动HBase
// 启动HDFS(cluster1上)
$ start-dfs.sh
// 启动YARN(cluster1上)
$ start-yarn.sh
// 启动HBase(cluster1上)
$ start-hbase.sh
启动后cluster1上使用jps可以看到HMaster和HRegionServer
cluster2和cluster3上可以看到HRegionServer
// 关机前执行关闭HBase的命令(cluster1上)
$ stop-hbase.sh

用浏览器打开192.168.56.121:60010,可以看到HBase的web界面

HBase简单使用

// cluster1上
$ hbase shell
hbase>create userinfotable',{NAME=>'username'},{NAME=>'fullname'},{NAME=>'homedir'}
hbase> put 'userinfotable','r1','username','vcsa'
hbase> put 'userinfotable','r2','username','sasuser'
hbase> scan 'userinfotable'

在其他节点上可以看到刚才插入的信息,在web界面也可以看到刚才建立的表。

3.9 Hive

以下MySQL中创建hive用户和创建hive数据库的操作,仅由cluster2操作一次。每台机器都要安装Hive。Hive能启动的先决条件是MySQL已经安装并配置完成,而且HDFS也要启动之后才能运行hive

$ su root
# cp apache-hive-1.1.0-bin.tar.gz /usr/local
# cd /usr/local
# tar -zxvf ./apache-hive-1.1.0-bin.tar.gz
# vi /etc/profile
// 在下面加上两行:
export HIVE_HOME=/usr/local/apache-hive-1.1.0-bin
export PATH=$HIVE_HOME/bin:$HIVE_HOME/conf:$PATH
// root用户登陆MySQL
# mysql -u root -p
// 创建用户hive,密码hive
mysql> GRANT USAGE ON *.* TO 'hive'@'%' IDENTIFIED BY 'hive' WITH GRANT OPTION;
// 创建数据库hive
mysql> create database hive;
// 允许任意ip以hive登陆数据库
mysql> grant all on hive.* to hive@'%'  identified by 'hive';
mysql> grant all on hive.* to hive@'localhost'  identified by 'hive';
// 刷新权限
mysql> flush privileges;
// 退出
mysql> exit;
// 验证hive用户,密码hive
# mysql -u hive -p
// 查看当前的数据库
mysql> show databases;
// 退出mysql
mysql> exit;

// 修改hive-site.xml
# cp apache-hive-1.1.0-bin/conf/hive-default.xml.template apache-hive-1.1.0-bin/conf/hive-site.xml
# vi apache-hive-1.1.0-bin/conf/hive-site.xml
找到以下property项,value值修改成如下,其他的在hive-site.xml中出现,但是下文没出现的就不需要更改了:
<property> 
   <name>javax.jdo.option.ConnectionURL </name> 
   <value>jdbc:mysql://cluster2:3306/hive</value> 
</property> 
<property> 
   <name>javax.jdo.option.ConnectionDriverName </name> 
   <value>com.mysql.jdbc.Driver </value> 
</property>
<property> 
   <name>javax.jdo.option.ConnectionPassword </name> 
   <value>hive</value> 
</property> 
<property> 
   <name>hive.hwi.listen.port</name> 
   <value>9999 </value> 
   <description>This is the port the Hive Web Interface will listen on</descript ion> 
</property> 
<property> 
   <name>datanucleus.autoCreateSchema</name> 
   <value>true</value> 
</property> 
<property> 
   <name>datanucleus.fixedDatastore</name> 
   <value>false</value> 
</property> 
  <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>hive</value>
    <description>Username to use against metastore database</description>
  </property>
  <property>
    <name>hive.exec.local.scratchdir</name>
    <value>/home/hadoop_files/hadoop_tmp/hive/iotmp</value>
    <description>Local scratch space for Hive jobs</description>
  </property>

  <property>
    <name>hive.downloaded.resources.dir</name>
    <value>/home/hadoop_files/hadoop_tmp/hive/iotmp</value>
    <description>Temporary local directory for added resources in the remote file system.</description>
  </property>
  <property>
    <name>hive.querylog.location</name>
    <value>/home/hadoop_files/hadoop_logs/hive/querylog</value>
    <description>Location of Hive run time structured log file</description>
  </property>
// 拷贝mysql-connector-java-5.1.43-bin.jar到hive的lib下面
# cp mysql-connector-java-5.1.43-bin.jar /usr/local/apache-hive-1.1.0-bin/lib/
// 把jline-2.12.jar拷贝到hadoop相应的目录下,替代jline-0.9.94.jar,否则启动会报错
#cp	/usr/local/apache-hive-1.1.0-bin/lib/jline-2.12.jar /usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/
// 切换到hadoop目录中share/hadoop/yarn/lib
# cd /usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/
// 将hadoop-2.6.5/share/hadoop/yarn/lib/里面的jline-0.9.94重命名
# mv jline-0.9.94.jar jline-0.9.94.jar.bak
// 创建hive临时文件夹和日志目录
# mkdir -p /home/hadoop_files/hadoop_tmp/hive/iotmp
# mkdir -p /home/hadoop_files/hadoop_logs/hive/querylog
// 改一下权限
# chown -R hadoop:hadoop /home/hadoop_files/
# chown -R hadoop:hadoop /usr/local/apache-hive-1.1.0-bin

Hive简单操作

// 打开hive客户端
$ hive
hive> create table test_table(id int, name string);
hive> insert into test_table values(1,‘test’);

在另一台机器上可以看到刚才创建的test_table

hive> show tables;
hive> select * from test_table;
hive> drop table test_table;
hive> show tables;
hive> exit;

3.10 scala

每台都要安装

//在cluster1上
$ su root
# mv scala-2.10.6.tgz /usr/local
# tar -zxvf scala-2.10.6.tgz
# vi /etc/profile
最下面加两行:
export SCALA_HOME=/usr/local/scala-2.10.6
export PATH=$SCALA_HOME/bin:$PATH
// 刷新环境变量
# source /etc/profile
// 查看版本,验证安装是否成功
# scala -version 
// 复制到所有的服务器上
# scp -r /usr/local/scala-2.10.6 cluster2:/usr/local/
# scp -r /usr/local/scala-2.10.6 cluster3:/usr/local/

//在每一个节点上修改环境变量
#vi /etc/profile
export SCALA_HOME=/usr/local/scala-2.10.6
export PATH=$SCALA_HOME/bin:$PATH

// 刷新环境变量
# source /etc/profile

// 修改文件夹权限(每一个节点都要操作)
# chown -R hadoop:hadoop /usr/local/scala-2.10.6

3.11 spark

每台都要安装

//下载spark-1.6.3-bin-hadoop2.6.tgz
// 解压
# cp spark-1.6.3-bin-hadoop2.6.tgz /usr/local
# cd /usr/local/
# tar -zxvf spark-1.6.3-bin-hadoop2.6.tgz
# cd spark-1.6.3-bin-hadoop2.6
// 环境变量
# vi /etc/profile
添加以下内容:
export SPARK_HOME=/usr/local/spark-1.6.3-bin-hadoop2.6
export PATH=$SPARK_HOME/bin:$PATH
主节点要再加一行(cluster1):
export PATH=$SPARK_HOME/sbin:$PATH

// 复制conf文件夹里面template一份,改名为spark-env.sh
# cp conf/spark-env.sh.template conf/spark-env.sh

// 在conf/spark-env.sh最下面加入以下7行:
#vi conf/spark-env.sh
export JAVA_HOME=/usr/local/jdk1.7.0_80
export SCALA_HOME=/usr/local/scala-2.10.6
export SPARK_MASTER_IP=cluster1
export HADOOP_CONF_DIR=/usr/local/hadoop-2.6.5/etc/hadoop
export SPARK_DIST_CLASSPATH=$(/usr/local/hadoop-2.6.5/bin/hadoop classpath)
export SPARK_CLASSPATH=$HIVE_HOME/lib/mysql-connector-java-5.1.43-bin.jar
export SPARK_PID_DIR=/home/hadoop_files

// 在conf下面新建一个叫slaves的文件
# vi conf/slaves
添加以下几行
cluster1
cluster2
cluster3

// 将hive目录下conf文件夹中的hive-site.xml复制到spark的conf目录下
# cd /usr/local/
# cp apache-hive-1.1.0-bin/conf/hive-site.xml spark-1.6.3-bin-hadoop2.6/conf/

// 将hadoop/etc/hadoop文件中的hdfs-site.xml和core-site.xml文件复制到spark的conf目录下
# cp hadoop-2.6.5/etc/hadoop/hdfs-site.xml hadoop-2.6.5/etc/hadoop/core-site.xml spark-1.6.3-bin-hadoop2.6/conf/

// 将conf目录下的spark-defaults.conf.template复制一份,改名为spark-default.conf
# cd spark-1.6.3-bin-hadoop2.6/conf/
# cp spark-defaults.conf.template spark-defaults.conf
# vi spark-defaults.conf

// 在最下面加上下面这一行
spark.files file:///usr/local/spark-1.6.3-bin-hadoop2.6/conf/hdfs-site.xml,file:///usr/local/spark-1.6.3-bin-hadoop2.6/conf/core-site.xml
保存后退出即可。

// 复制到所有的服务器上
# scp -r /usr/local/spark-1.6.3-bin-hadoop2.6 cluster2:/usr/local/
# scp -r /usr/local/spark-1.6.3-bin-hadoop2.6 cluster3:/usr/local/

// 修改spark文件夹的权限(每个spark结点)
# chown -R hadoop:hadoop /usr/local/spark-1.6.3-bin-hadoop2.6

// 运行Spark(cluster1上)
运行spark前需启动hadoop的HDFS和YARN
$ start-master.sh
$ start-slaves.sh

// 关闭Spark的命令(cluster1上)
$ stop-slaves.sh
$ stop-master.sh

用浏览器访问192.168.56.121:8080可以看到Spark的web界面,可以看到3个worker

3.12 storm

每台都要安装

//storm需要python2.6以上的版本
// 查看python版本
# python

可以在最上面一行看到python的版本
// 退出python交互式界面
>>> exit()
如果版本低于2.6,使用yum install python,安装Python2.7

(以下都要在所有节点上操作)
将下载的storm解压到/usr/local下

// 添加环境变量
# vi /etc/profile
export STORM_HOME=/usr/local/apache-storm-1.1.1
export PATH=$STORM_HOME/bin:$PATH

// 改一下权限
# chown -R hadoop:hadoop apache-storm-1.1.1
// 更改配置文件
# vi apache-storm-1.1.1/conf/storm.yaml

里面有两个要改的地方
第一个是
storm.zookeeper.servers : 
-	“cluster1”
-	“cluster2”
-	“cluster3”
第二个是加入一行
storm.local.dir : “/home/hadoop_files/hadoop_tmp/storm/tmp”
切记:冒号左右要有空格,否则会报错could not found expected ‘ : ’
storm.local.dir的最左边也要有一个空格
// 然后新建tmp文件夹,改权限
# mkdir -p /home/hadoop_files/hadoop_tmp/storm/tmp
# chown -R hadoop:hadoop /home/hadoop_files
# chown -R hadoop:hadoop /usr/local/apache-storm-1.1.1

// 新建storm-master的虚拟窗口(cluster1)
$ screen -S storm-master
$ storm nimbus
$ Ctrl+A+D

// 新建storm-supervisor的虚拟窗口(cluster2,cluster3)
$ screen -S storm-supervisor
$ storm supervisor
$ Ctrl+A+D

// 新建storm-ui的虚拟窗口(cluster1)
$ screen -S storm-ui
$ storm ui
$ Ctrl+A+D

// 新建storm-logviewer的虚拟窗口(cluster1,cluster2,cluster3)
$ screen -S storm-logviewer
$ storm logviewer
$ Ctrl+A+D

使用jps可以看到以下进程
cluster1:nimbus, core, logviewer
cluster2:Supervisor, logviewer
cluster3:Supervisor, logviewer

4 遇到的问题及解决

1)配置网络时,我用putty无法连接到虚拟机。按照实验手册,我设置了两张网卡的onboot=yes,防火墙也关了,网卡2的ip也是192.168.56.121,但是就是无法与主机ping通

解决:原因是vmware安装虚拟机系统时不会要求你设置静态IP,这个IP需要与虚机IP对应。经查,我的Host-only子网IP是192.168.133.0,所以我在机器里设置的192.168.56.0是无效的。改正后解决。
​ 参考(https://blog.csdn.net/u014466635/article/details/80284792)


2)安装虚机时我没有给用户cluster设置密码,导致ssh登录时无法登录到cluster(输入root密码或空密码都提示Access denied)
解决:连接时使用root用户登录,登入后再su [用户名]切换到其他用户


3)安装组件过程中有一些安装包、库文件、配置文件等,可以在主机准备好,通过PSFTP传输到虚机
参考(https://blog.csdn.net/liyuxing6639801/article/details/65633206)


4)zookeeper安装时,三台机器都zkServer.sh start后,使用zkServer.sh status查看启动状态,提示Error contacting service

查看/home/hadoop_files/hadoop_logs/zookeeper/logs中的日志,发现有connection refused的warning

2020-03-29 02:42:17,390 [myid:3] - WARN  [QuorumPeer[myid=3]/0:0:0:0:0:0:0:0:2181:QuorumCnxManager@382] - Cannot open channel to 2 at election address cluster2/192.168.64.141:3888
java.net.ConnectException: Connection refused
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
        at java.net.Socket.connect(Socket.java:579)
        at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:368)
        at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectAll(QuorumCnxManager.java:402)
        at org.apache.zookeeper.server.quorum.FastLeaderElection.lookForLeader(FastLeaderElection.java:840)
        at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:762)

网上对这个问题的解答有:

  1. zoo.cfg 配置文件中指定目录却没有创建,需要创建相应目录。

  2. zoo.cfg中dataDir指定路径为Myid文件的路径下,Myid内容与:server.?=localhost:2888:3888中所设置需要一致

  3. 需要确认机群防火墙关闭
    使用service iptables stop 关闭防火墙
    使用service iptables status确认

  4. 2181端口被占用
    zkServer.sh stop #先停止zookeep
    netstat -an | grep 2181 #查看端口是否占用,如果占用
    clientPort = 2888 #随便找个没占用的端口号

​试了各种办法都没解决我的问题。最后自己慢慢读日志:三台zk都开启的情况下,退出cluster2节点时,cluster1、3的节点日志中出现contact refused;cluster2重新启动zk后,cluster1、3的节点日志有recived connection,还有leader选举,感觉是正常状态。

解决:后续kafka安装测试,收发消息没有问题,所以zookeeper机群应该也没有问题。但是查看zookeeper status依然有上述提示,不显示当前节点的mode。所以应该没有彻底解决,但是暂时不影响使用。

发布了3 篇原创文章 · 获赞 3 · 访问量 98

猜你喜欢

转载自blog.csdn.net/weixin_43202895/article/details/105183638