linux centos7搭建集群之前 要先设置免密登陆,设置hosts,配置java环境变量,关闭防火墙,以及注意各组件之间的兼容性,切记,切记!
1.hadoop 环境搭建
hdfs部分由NameNode、SecondaryNameNode和DataNode组成。DataNode是真正的在每个存储节点上管理数据的模块,NameNode是对全局数据的名字信息做管理的模块,SecondaryNameNode是它的从节点,以防挂掉。Map-reduce依赖于yarn和hdfs,另外还有一个JobHistoryServer用来看任务运行历史.
hadoop虽然有多个模块分别部署,但是所需要的程序都在同一个tar包中,所以不同模块用到的配置文件都在一起
1.1在http://hadoop.apache.org/releases.html找到最新稳定版tar包,我选择的是hadoop-2.7.3.tar.gz,下载解压到/lp/hadoop/hadoop-2.7.3
1.2修改etc/hadoop/core-site.xml,把配置改成:
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://127.0.0.1:9001</value> </property> <property> <name>io.file.buffer.size</name> <value>131072</value> </property> </configuration>
这里面配置的是hdfs的文件系统地址:本机的9001端口,你可以填如自己的hdfs的地址,可以是ip,也可以是域名,如果是域名保证这个域名可以被正确的解析到ip,可以在hosts文件添加一个域名映射。
1.3etc/hadoop/hdfs-site.xml
<configuration> <property> <name>dfs.namenode.name.dir</name> <value>file:///lp/hadoop/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:///lp/hadoop/dfs/data</value> </property> <property> <name>dfs.datanode.fsdataset.volume.choosing.policy</name> <value>org.apache.hadoop.hdfs.server.datanode.fsdataset.AvailableSpaceVolumeChoosingPolicy</value> </property> <property> <name>dfs.namenode.http-address</name> <value>127.0.0.1:8305</value> </property> <property> <name>dfs.namenode.secondary.http-address</name> <value>127.0.0.1:8310</value> </property> </configuration>
这里面配置的是hdfs文件存储在本地的哪里以及secondary namenode的地址
1.4 etc/hadoop/yarn-site.xml
<configuration> <!-- Site specific YARN configuration properties --> <property> <name>yarn.resourcemanager.hostname</name> <value>127.0.0.1</value> </property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>127.0.0.1:8320</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</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> <property> <name>yarn.log-aggregation.retain-seconds</name> <value>864000</value> </property> <property> <name>yarn.log-aggregation.retain-check-interval-seconds</name> <value>86400</value> </property> <property> <name>yarn.nodemanager.remote-app-log-dir</name> <value>/lp/hadoop/YarnApp/Logs</value> </property> <property> <name>yarn.log.server.url</name> <value>http://127.0.0.1:8325/jobhistory/logs/</value> </property> <property> <name>yarn.nodemanager.local-dirs</name> <value>/lp/hadoop/YarnApp/nodemanager</value> </property> <property> <name>yarn.scheduler.maximum-allocation-mb</name> <value>5000</value> </property> <property> <name>yarn.scheduler.minimum-allocation-mb</name> <value>1024</value> </property> <property> <name>yarn.nodemanager.vmem-pmem-ratio</name> <value>4.1</value> </property> <property> <name>yarn.nodemanager.vmem-check-enabled</name> <value>false</value> </property> </configuration>
yarn的资源和日志配置
1.5 cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml创建etc/hadoop/mapred-site.xml
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> <description>Execution framework set to Hadoop YARN.</description> </property> <property> <name>yarn.app.mapreduce.am.staging-dir</name> <value>/lp/hadoop/YarnApp/tmp/hadoop-yarn/staging</value> </property> <!--MapReduce JobHistory Server地址--> <property> <name>mapreduce.jobhistory.address</name> <value>127.0.0.1:8330</value> </property> <!--MapReduce JobHistory Server Web UI地址--> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>127.0.0.1:8331</value> </property> <!--MR JobHistory Server管理的日志的存放位置--> <property> <name>mapreduce.jobhistory.done-dir</name> <value>${yarn.app.mapreduce.am.staging-dir}/history/done</value> </property> <!--MapReduce作业产生的日志存放位置--> <property> <name>mapreduce.jobhistory.intermediate-done-dir</name> <value>${yarn.app.mapreduce.am.staging-dir}/history/done_intermediate</value> </property> <property> <name>mapreduce.jobhistory.joblist.cache.size</name> <value>1000</value> </property> <property> <name>mapreduce.tasktracker.map.tasks.maximum</name> <value>8</value> </property> <property> <name>mapreduce.tasktracker.reduce.tasks.maximum</name> <value>8</value> </property> <property> <name>mapreduce.jobtracker.maxtasks.perjob</name> <value>5</value> <description>The maximum number of tasks for a single job. A value of -1 indicates that there is no maximum. </description> </property> </configuration>
这里面配置的是mapred的任务历史相关配置
1.6 slaves
如果你的hadoop部署在多台机器,那么需要修改etc/hadoop/slaves,把其他slave机器ip加到里面,一行一个,如果只部署在这一台,那么就留一个localhost即可。
如果hadoop分布式部署在多台机器上,每台机器上的部署都是一样的,都要知道master(主)的位置,每一个slaves(从)的位置。
1.7 hadoop-env.sh
export JAVA_HOME="你的java安装地址"
1.8 初始化文件系统
./bin/hdfs namenode -format myclustername
如果格式化正常可以看到/lp/hadoop/dfs下生成了name目录
1.9启动namenode
./sbin/hadoop-daemon.sh --script hdfs start namenode
1.10启动datanode
./sbin/hadoop-daemon.sh --script hdfs start datanode
1.11启动yarn
先启动resourcemanager
./sbin/yarn-daemon.sh start resourcemanager
然后启动nodemanager,执行:
./sbin/yarn-daemon.sh start nodemanager
1.12 启动MapReduce JobHistory Server用于记录历史日志
/sbin/mr-jobhistory-daemon.sh start historyserver
1.13 web控制台查看
打开http://127.0.0.1:8320/cluster看下yarn管理的集群资源情况(因为在yarn-site.xml中我们配置了yarn.resourcemanager.webapp.address是127.0.0.1:8320)
打开http://127.0.0.1:8331/jobhistory看下map-reduce任务的执行历史情况(因为在mapred-site.xml中我们配置了mapreduce.jobhistory.webapp.address是127.0.0.1:8331)
打开http://127.0.0.1:8305/dfshealth.html看下namenode的存储系统情况(因为在hdfs-site.xml中我们配置了dfs.namenode.http-address是127.0.0.1:8305)
其实 上面的启动命令 可以用一个start-all.sh命令来代替,或者是start-dfs.sh和start-yarn.sh
1.14 在hdfs系统测试创建文件
./bin/hadoop fs -mkdir /input ./bin/hadoop fs -ls /
2.Hbase 的部署搭建
2.1http://www.apache.org/dyn/closer.cgi/hbase/下载稳定版安装包,我下的是hbase-1.2.6-bin.tar.gz下载解压到/lp/hadoop/hbase-1.2.6
2.2 修改conf/hbase-site.xml
<configuration> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>hbase.rootdir</name> <value>hdfs://localhost:9001/hbase</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>127.0.0.1</value> </property> <property> <name>hbase.coprocessor.master.classes</name> <value>org.apache.hadoop.hbase.security.access.AccessController</value> </property> <property> <name>hbase.coprocessor.region.classes</name> <value>org.apache.hadoop.hbase.security.token.TokenProvider,org.apache.hadoop.hbase.security.access.AccessController,org.apache.hadoop.hbase.security.access.SecureBulkLoadEndpoint</value> </property> </configuration>
其中hbase.rootdir配置的是hdfs地址,ip:port要和hadoop/core-site.xml中的fs.defaultFS保持一致其中hbase.zookeeper.quorum是zookeeper的地址,可以配多个,我们试验用就先配一个
2.3修改 /lp/hadoop/hbase-1.2.6/conf/hbase-env.sh
export JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk
2.4 启动hbase
./bin/start-hbase.sh
启动成功后可以看到几个进程起来,包括zookeeper的HQuorumPeer和hbase的HMaster、HRegionServer
2.5 启动测试 hbase shell
./bin/hbase shell
试验一下hbase的使用,执行:
hbase(main):001:0> status 1 active master, 0 backup masters, 1 servers, 0 dead, 3.0000 average load
创建一张表
hbase(main):004:0> create 'table1','field1' 0 row(s) in 1.3430 seconds => Hbase::Table - table1
获取一张表
hbase(main):005:0> t1 = get_table('table1') 0 row(s) in 0.0010 seconds => Hbase::Table - table1
添加一行
hbase(main):008:0> t1.put 'row1', 'field1:qualifier1', 'value1' 0 row(s) in 0.4160 seconds
读取全部
hbase(main):009:0> t1.scan ROW COLUMN+CELL row1 column=field1:qualifier1, timestamp=1470621285068, value=value1 1 row(s) in 0.1000 seconds
hbase是以hdfs为存储介质的,因此它具有分布式存储拥有的所有优点
2.6 hbase的架构图如下:
其中HMaster负责管理HRegionServer以实现负载均衡,负责管理和分配HRegion(数据分片),还负责管理命名空间和table元数据,以及权限控制
HRegionServer负责管理本地的HRegion、管理数据以及和hdfs交互。
Zookeeper负责集群的协调(如HMaster主从的failover)以及集群状态信息的存储
客户端传输数据直接和HRegionServer通信
3.hive安装搭建
安装之前先配置好 hadoop的环境变量
3.1 http://mirrors.hust.edu.cn/apache/hive下载安装包,解压后在 /lp/hadoop/apache-hive-2.1.1-bin
3.2 cp hive-env.sh.template hive-env.sh
HADOOP_HOME:HADOOP_HOME=/lp/hadoop/hadoop-2.7.3
3.3复制hive-default.xml.template粘贴为hive-site.xml
把其中的${system:java.io.tmpdir}都修改成/lp/hadoop/apache-hive-2.1.1-bin/tmp,你也可以自己设置成自己的tmp目录,把${system:user.name}都换成用户名,为这里替换成了luanpeng
3.4初始化元数据数据库
默认保存在本地的derby数据库,也可以配置成mysql
注意,不要先执行hive命令,否则这一步会出错,(注意下面的命令是在/lp/hadoop/apache-hive-2.1.1-bin目录下执行)
# ./bin/schematool -dbType derby -initSchema
3.5客户端形式直接启动hive
# ./bin/hive hive> show databases; OK default Time taken: 1.886 seconds, Fetched: 1 row(s) hive>
创建个数据库
hive> create database mydatabase; OK Time taken: 0.721 seconds hive> show databases; OK default mydatabase Time taken: 0.051 seconds, Fetched: 2 row(s) hive>
3.6 启动元数据服务
nohup ./bin/hive --service metastore &
3.7后台启动hive 服务(如果需要用 客户端连接)
# nohup ./bin/hiveserver2 &>log/hive.log &
这时可以通过jdbc客户端连接这个服务访问hive,端口默认是10000.
4.Spark集群环境搭建
spark有多种部署方式,Standalone模式、Spark On Mesos模式、Spark On YARN模式。
下面我们尝试spark单机直接跑、spark集群运行,spark在yarn上运行
4.1 下载Spark版本和地址:
http://apache.fayea.com/spark/spark-2.0.1/spark-2.3.0-bin-hadoop2.7.tgz
解压后的目录为/lp/hadoop/spark-2.3.0-bin-hadoop2.7
4.2 单机运行提交任务
执行样例程序:(下面的命令是在/lp/hadoop/spark-2.3.0-bin-hadoop2.7中执行的)
# ./bin/spark-submit examples/src/main/python/pi.py 10
输出下面内容,表示计算成功
2018-05-14 20:12:43 INFO DAGScheduler:54 - Job 0 finished: reduce at /lp/hadoop/spark-2.3.0-bin-hadoop2.7/examples/src/main/python/pi.py:44, took 0.981974 s Pi is roughly 3.142740 2018-05-14 20:12:43 INFO AbstractConnector:318 - Stopped Spark@3c839941{HTTP/1.1,[http/1.1]}{0.0.0.0:4040} 2018-05-14 20:12:43 INFO SparkUI:54 - Stopped Spark web UI at http://192.168.122.1:4040
4.3启动spark集群运行任务
启动spark master
# sbin/start-master.sh
启动salve
# ./sbin/start-slave.sh spark://localhost:7077
然后就可以在web界面8080端口进行查看
任务提交到spark集群上来运行
./bin/spark-submit --master spark://localhost:7077 examples/src/main/python/pi.py 10
结果日志包括了:
2018-05-14 21:25:44 INFO DAGScheduler:54 - Job 0 finished: reduce at /lp/hadoop/spark-2.3.0-bin-hadoop2.7/examples/src/main/python/pi.py:44, took 1.894816 s Pi is roughly 3.152956 2018-05-14 21:25:44 INFO AbstractConnector:318 - Stopped Spark@556e488{HTTP/1.1,[http/1.1]}{0.0.0.0:4040} 2018-05-14 21:25:44 INFO SparkUI:54 - Stopped Spark web UI at http://192.168.122.1:4040
4.4 spark部署在yarn集群上
spark程序也可以部署到yarn集群上执行,也就是我们部署hadoop时启动的yarn。当然部署在yarn上首先要要求启动了hadoop的hdfs和yarn。
我们需要提前配置好HADOOP_CONF_DIR,修改/etc/profile文件,添加:
HADOOP_HOME=/lp/hadoop/hadoop-2.7.3 export HADOOP_HOME HBASE_HOME=/lp/hadoop/hbase-1.2.6 export HBASE_HOME HIVE_HOME=/lp/hadoop/apache-hive-2.1.1-bin export HIVE_HOME PATH=$PATH:$HOME/bin PATH=$PATH:$HBASE_HOME/bin PATH=$PATH:$HIVE_HOME/bin PATH=$PATH:$HADOOP_HOME/bin export PATH export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop export HDFS_CONF_DIR=$HADOOP_HOME/etc/hadoop export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
source /etc/profile
下面我们把任务部署到yarn集群上去:
# ./bin/spark-submit --master yarn --deploy-mode cluster examples/src/main/python/pi.py 10
yarn模式不需要启动spark
在Hadoop任务的管理界面 http://127.0.0.1:8088/cluster 能看到跑了这个任务:
5.总结
hdfs是所有hadoop生态的底层存储架构,它主要完成了分布式存储系统的逻辑,凡是需要存储的都基于其上构建
yarn是负责集群资源管理的部分,这个资源主要指计算资源,因此它支撑了各种计算模块
map-reduce组件主要完成了map-reduce任务的调度逻辑,它依赖于hdfs作为输入输出及中间过程的存储,因此在hdfs之上,它也依赖yarn为它分配资源,因此也在yarn之上
hbase基于hdfs存储,通过独立的服务管理起来,因此仅在hdfs之上
hive基于hdfs存储,通过独立的服务管理起来,因此仅在hdfs之上
spark基于hdfs存储,即可以依赖yarn做资源分配计算资源也可以通过独立的服务管理,因此在hdfs之上也在yarn之上,从结构上看它和mapreduce一层比较像
总之,每一个系统负责了自己擅长的一部分,同时相互依托,形成了整个hadoop生态。