1.1 框架介绍
Hadoop是一个开源的框架,可编写和运行分不是应用处理大规模数据,是专为离线和大规模数据分析而设计的,并不适合那种对几个记录随机读写的在线事务处理模式。Hadoop的数据来源可以是任何形式,在处理半结构化和非结构化数据上与关系型数据库相比有更好的性能,具有更灵活的处理能力,不管任何数据形式最终会转化为key/value,key/value是基本数据单元。 HBase 不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库.所谓非结构化数据存储就是说HBase是基于列的而不是基于行的模式,这样方面读写你的大数据内容。 HBase是介于Map Entry(key & value)和DB Row之间的一种数据存储方式。不仅仅是简单的一个key对应一个 value,你很可能需要存储多个属性的数据结构,但没有传统数据库表中那么多的关联关系,这就是所谓的松散数据。 简单来说,在HBase中的表创建的可以看做是一张很大的表,而这个表的属性可以根据需求去动态增加,在HBase中没有表与表之间关联查询。只需要告诉数据存储到Hbase的那个column families 就可以了,不需要指定它的具体类型:char,varchar,int,tinyint,text等等。但是需要注意HBase中不包含事务此类的功能。 Apache HBase 和Google Bigtable 有非常相似的地方,一个数据行拥有一个可选择的键和任意数量的列。表是疏松的存储的,因此用户可以给行定义各种不同的列,对于这样的功能在大项目中非常实用,可以简化设计和升级的成本。 Spark是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用的并行计算框架,Spark基于map reduce算法实现的分布式计算,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是Job中间输出和结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的map reduce的算法
2.1 前期准备
在搭建集群开始前,要先做好以下操作
1.更改每个节点的hosts文件并配置免密登录,便于集群节点互相通信
2.下载好相应的jar包
3.配置每个节点的环境变量
4.更改相关文件的权限
2.1.1 配置hosts
#在每个节点/etc/hosts中加入本机ip和其他节点ip vim /etc/hosts#添加以下内容: 127.0.0.1 localhost 192.168.2.11 master 192.168.2.12 slave1 192.168.2.13 slave2
2.1.2 配置免密登录
#在master节点 cd .ssh/ ssh-****** -t rsa -P ‘’ #一路回车#在.ssh/文件夹中运行shell命令 cat id_rsa.pub >> authorized_keys ssh-copy-id –i id_rsa.pub [email protected] ssh-copy-id –i id_rsa.pub [email protected]
2.1.3 下载资源
1.下载JDK http://www.oracle.com/technetwork/cn/java/javase/downloads/jdk8-downloads-2133151-zhs.html 2.下载Hadoop https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.6.5/ 3.下载 HBase https://mirrors.tuna.tsinghua.edu.cn/ apache/hbase/1.3.1/ 4.下载Zookeeper https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.11/ 5.下载Spark https://mirrors.tuna.tsinghua.edu.cn/apache/spark/spark-2.2.1/2.1.4 解压文件
解压命令:tar –zxvf ****.gz –C /opt/文件夹 将jdk1.8.0_144文件夹更名为jdk 将hadoop-2.6.5 文件夹更名为hadoop 将hbase-1.3.1 文件夹更名为hbase 将zookeeper-3.4.11 文件夹更名为 zookeeper 将spark-2.2.1-bin-hadoop2.7文件夹更名为spark2.1.5 配置环境变量
在每个节点配置环境变量vim /etc/profile export JAVA_HOME=/opt/jdk export HADOOP_HOME=/opt/hadoop export ZOOKEEPER_HOME=/opt/zookeeper export HBASE_HOME=/opt/hbase export SPARK_HOME=/opt/spark export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin:$ZOOKEEPER_HOME/conf:$HBASE_HOME/bin:$SPARK_HOME/bin:$SPARK_HOME/sbin
#使环境变量生效 source /etc/profile
2.1.6 更改目录权限
#更改所属用户和组 sudo chown -R vagrant:vagrant /opt/
2.2 配置ZooKeeper
2.2.1 创建数据存放目录和日志存放目录
#在每个节点创建数据存放目录和日志存放目录 sudo mkdir -p /usr/local/zkData mkdir -p /opt/zookeeper/logs#更改文件夹权限 sudo chown -R vagrant:vagrant /usr/local/zkData #在master节点运行shell命令 echo 1 >> /usr/local/zkData/myid #在slave1 节点运行shell命令 echo 2 >> /usr/local/zkData/myid #在slave2 节点运行shell命令 echo 3 >> /usr/local/zkData/myid
2.2.2 配置zoo.cfg
vim /opt/zookeeper/conf/zoo.cfg ……# the directory where the snapshot is stored. # do not use /tmp for storage, /tmp here is just # example sakes. # 将此处改为原先创建好的目录 dataDir=/usr/local/zkData # the port at which the clients will connect clientPort=2181 server.1=0.0.0.0:2888:3888 server.2=slave1:2888:3888 server.3=slave2:2888:3888 #注意此处(3个虚拟机要分别配置) # 在slave1节点,将此处配置为 server.1=master:2888:3888 server.2=0.0.0.0:2888:3888 server.3=slave2:2888:3888 # 在slave2节点,将此处配置为 server.1=master:2888:3888 server.2=slave1:2888:3888 server.3=0.0.0.0:2888:3888 # the maximum number of client connections. ……
2.2.3 配置zkEnv.sh
vim /opt/zookeeper/bin/zkEnv.sh#找到 if [ "x${ZOO_LOG_DIR}" = "x" ] then ZOO_LOG_DIR="/var/log " fi #将ZOO_LOG_DIR的值改为/opt/zookeeper/logs
2.2.4 将配置文件发送到其他节点
scp –r /opt/zookeeper/ [email protected]:/opt scp –r /opt/zookeeper/ [email protected]:/opt
2.2.5 启动Zookeeper集群
#在每个节点运行shell命令 zkServer.sh start#节点会随机选举leader #用zkServer.sh status查看
2.3 配置Hadoop
2.3.1 创建Hadoop相关文件夹并添加相应的jar包
#在每个节点执行以下操作:#该文件夹存放Hadoop的元数据信息和临时文件 sudo mkdir -p /usr/local/hadoop #更改所属用户和组 sudo chown -R vagrant:vagrant /usr/local/hadoop #将HADOOP_HOME/share/hadoop/yarn/lib目录下
2.3.2 配置hadoop-env.sh
#在里面配置Java环境变量# The java implementation to use. export JAVA_HOME=/opt/jdk
2.3.3 配置hdfs-site.xml
<configuration> <property> <name>dfs.namenode.secondary.http-address</name> <value>slave1:50090</value> <description>SecondaryNamenode 的web地址和端口</description> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:/usr/local/hadoop/dfs/name</value> <description>Namenode元数据目录</description> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/usr/local/hadoop/dfs/data</value> <description>Datanode元数据目录</description> </property> <property> <name>dfs.replication</name> <value>2</value> <description>备份数目</description> </property> <property> <name>dfs.webhdfs.enabled</name> <value>true</value> <description>开启webUI</description> </property> <property> <name>dfs.permissions</name> <value>false</value> <description>权限检查</description> </property> </configuration>
2.3.4 配置core-site.xml
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://master:9000</value> <description>默认文件系统</description> </property> <property> <name>io.file.buffer.size</name> <value>131072</value> <description>读写文件时使用的缓存大小</description> </property> <property> <name>hadoop.tmp.dir</name> <value>file:/usr/local/hadoop/tmp</value> <description>Hadoop的临时目录</description> </property> <property> <name>ha.zookeeper.quorum</name> <value>master,slave1,slave2</value> <description>配置Zookeeper节点</description> </property> </configuration>
2.3.5 配置mapred-site.xml
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> <description>使用yarn进行调度</description> </property> <property> <name>mapreduce.jobhistory.address</name> <value>master:10020</value> <description>MapReduce Jobhistory Server地址</description> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>master:19888</value> <description>MapReduce Jobhistory webUI地址</description> </property> </configuration>
2.3.6 配置masters
#若没有就创建,该文件作用为指定secondary namenode slave1
2.3.7 配置slaves
slave1 slave2
2.3.8 配置 yarn-site.xml
<configuration> <property> <name>yarn.nodemanager.resource.memory-mb</name> <value>1024</value> <description>内存大小</description> </property> <property> <name>yarn.nodemanager.resource.cpu-vcores</name> <value>1</value> <description>CPU个数</description> </property> <property> <name>yarn.nodemanager.aux-services</name> <value> mapreduce_shuffle,spark_shuffle</value> <description>NodeManager上运行时的附属服务,配置mapreduce_shuffle才可以运行MapReduce程序,由于搭建Spark on Yarn模式需要配置spark_shuffle</description> </property> <property> <name>yarn.nodemanager.aux-services.spark_shuffle.class</name> <value>org.apache.spark.network.yarn.YarnShuffleService</value> <description>Yarn集群启动spark_shuffle</description> </property> <property> <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> <description>YARN集群有多个节点时用于指定Shuffle Server</description> </property> <property> <name>yarn.resourcemanager.address</name> <value>master:8032</value> <description>ResourceManager地址和端口</description> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>master:8030</value> <description>调度器的地址和端口</description> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>master:8031</value> <description>NodeManager通过该地址向ResourceManager汇报心跳等</description> </property> <property> <name>yarn.resourcemanager.admin.address</name> <value>master:8033</value> <description>管理员通过该地址向ResourceManager发送命令</description> </property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>master:8088</value> <description>ResourceManager的webUI地址</description> </property> <property> <name>yarn.resourcemanager.hostname</name> <value>master</value> <description>ResourceManager的Hostname</description> </property> </configuration>
2.3.9 将配置好的文件发送到其他节点
scp –r /opt/jdk/ [email protected]:/opt scp –r /opt/jdk/ [email protected]:/opt scp –r /opt/hadoop/ [email protected]:/opt scp –r /opt/hadoop/ [email protected]:/opt
2.3.10 格式化namenode
#在master节点运行shell命令 hadoop namenode –format #return 0,则格式化正常
2.3.11 启动hadoop集群
start-all.sh
2.4 配置HBase
2.4.1 配置hbase-env.sh
#更改Java环境变量 export JAVA_HOME=/opt/jdk
2.4.2 配置hbase-site.xml
<configuration> <property> <name>hbase.rootdir</name> <value>hdfs://master:9000/hbase</value> <description>集群中所有RegionServer共享目录</description> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> <description>集群的模式</description> </property> <property> <name>hbase.zookeeper.quorum</name> <value>master,slave1,slave2</value> <description>zookeeper集群的URL配置</description> </property> <property> <name>hbase.master</name> <value>master</value> <description>指定master</description> </property> <property> <name>zookeeper.session.timeout.ms</name> <value>180000</value> <description>客户端与zookeeper的通讯超时时间</description> </property> <property> <name>hbase.regionserver.handler.count</name> <value>100</value> <description>RegionServer处理IO请求的线程数</description> </property> <property> <name>hbase.hregion.max.filesize</name> <value>2147483648</value> <description>RegionServer发生Split的阔值</description> </property> <property> <name> hbase.client.scanner.timeout.period</name> <value>120000</value> <description>租约时间管理</description> </property> </configuration>
2.4.3 配置regionservers
slave1 slave2
2.4.4 将配置文件发送到其他节点
scp –r /opt/hbase/ [email protected]:/opt scp –r /opt/hbase/ [email protected]:/opt
2.4.5 启动HBase集群
#在master节点运行以下命令 start-hbase.sh
2.5 配置Spark
2.4.6 在每个节点创建Spark相关目录并修改权限
#该目录用于存放worker信息和日志 sudo mkdir –p /usr/local/spark #更改权限 sudo chown vagrant:vagrant /usr/local/spark
2.4.7 配置spark-env.sh文件
#在文件中加入以下配置信息 export JAVA_HOME=/opt/jdk export SCALA_HOME=/opt/scala export HADOOP_HOME=/opt/hadoop export HADOOP_CONF_DIR=/opt/hadoop/etc/hadoop export SPARK_MASTER_IP=master export SPARK_MASTER_HOST=master export SPARK_LOCAL_IP=master export SPARK_WORKER_MEMORY=1g export SPARK_WORKER_CORES=1 export SPARK_WORKER_DIR=/usr/local/spark/worker export SPARK_LOG_DIR=/usr/local/spark/logs export SPARK_HOME=/opt/spark #在slave节点上,将SPARK_LOCAL_IP改为对应的IP地址或者Hostname
2.4.8 配置spark-defaults.conf
#在文件中加入以下配置信息 spark.master spark://master:7077 spark.eventLog.enabled true spark.eventLog.dir hdfs://namenode:8021/directory spark.serializer org.apache.spark.serializer.KryoSerializer spark.driver.memory 5g spark.executor.extraJavaOptions -XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three"
2.4.9 配置slaves
#在文件中加入配置信息 slave1 slave2
2.4.10 启动Spark集群
#在Hadoop集群启动的情况下运行以下命令 /opt/spark/sbin/start-all.sh