linux hadoop、hbase、hive、spark大数据分布式集群环境搭建

hadoop | 2019-09-13 10:02:39

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的架构图如下:

1 (2).png


其中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 能看到跑了这个任务:

1.png


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生态。


登录后即可回复 登录 | 注册
    
关注编程学问公众号