Hadoop集群搭建Linux环境准备基础配置安装HadoopHA集群安装HIVE安装MySQL安装HBASE安装Flume问题总结

2018-10-09 14:55:01 浏览数 (1)

本文主要讲解了Hadoop集群环境的搭建过程,实际应用中应该不会这样做,而是通过一些管理工具进行安装,比如可视化安装:Ambari。

虚拟机镜像

软件安装包

Linux环境准备

前置条件
  • CentOS7
  • Oracle VM VirtualBox
安装过程

这就相当于通过虚拟机搭建一个局域网,安装配置过程已经截图并整理成PPT。主要需要注意的地方就是网络的配置,我这里通过配置两个网卡来实现:一个用于访问外部网络(NAT);一个用于和window主机交互(Host-Only)。

我的系统是centos7

代码语言:javascript复制
vi /etc/sysconfig/network-scripts/ifcfg-enp0s3

配置文件修改成以下内容

代码语言:javascript复制
TYPE=Ethernet

PROXY_METHOD=none

BROWSER_ONLY=no

BOOTPROTO=static

DEFROUTE=yes

IPV4_FAILURE_FATAL=no

IPV6INIT=yes

NAME=enp0s3

UUID=4704faea-0e23-4ad9-a06c-3e37e577636c

DEVICE=enp0s3

ONBOOT=yes

NM_CONTROLLED=yes

IPADDR=192.168.88.21

虚拟机安装过程

基础配置

添加用户

分别在三台服务器上执行创建 haddop用户,同时设置密码为hadoop

代码语言:javascript复制
useradd hadoop

passwd hadoop

创建用户之后切换为hadoop用户登录,我们所有的操作都基于hadoop用户

配置host

分别在三台服务器配置host

代码语言:javascript复制
vi /etc/hosts

添加以下内容

代码语言:javascript复制
192.168.88.21 master

192.168.88.22 slave1

192.168.88.23 slave2
配置免密登录

分别在三台机器上安装 openssh-server

代码语言:javascript复制
yum install openssh-server

分别在三台机器上执行以下命令

代码语言:javascript复制
mkdir .ssh
chmod 700 .ssh
ssh-keygen -t rsa
cp id_rsa.pub authorized_keys
chmod 600 authorized_keys

在 22 服务器执行

代码语言:javascript复制
scp /home/hadoop/.ssh/id_rsa.pub hadoop@master:/home/hadoop/.ssh/id_rsa.pub.slave1

在 23 服务器执行

代码语言:javascript复制
scp /home/hadoop/.ssh/id_rsa.pub hadoop@master:/home/hadoop/.ssh/id_rsa.pub.slave2

在 21 服务器执行

代码语言:javascript复制
cat id_rsa.pub.slave1 >> authorized_keys

cat id_rsa.pub.slave2 >> authorized_keys

scp /home/hadoop/.ssh/authorized_keys hadoop@slave1:/home/hadoop/.ssh/authorized_keys

scp /home/hadoop/.ssh/authorized_keys hadoop@slave2:/home/hadoop/.ssh/authorized_keys

至此配置完成,接下来是测试:

在 21 服务器执行

代码语言:javascript复制
ssh salve1
ssh salve2

有个问题,之前配置好了之后还是不停提示要输入密钥,然后安装了 openssh-server 之后,再测试就可以了,不知道是不是这个的影响。

配置JDK

jdk-8u171-linux-x64.tar.gz

在/home/hadoop 目录下创建java文件夹

代码语言:javascript复制
mkdir java

在java 目录内解压安装包

代码语言:javascript复制
tar -zxvf jdk-8u171-linux-x64.tar.gz

然后分别拷贝到两台slave

代码语言:javascript复制
scr -r jdk1.8 hadoop@slave1:/home/hadoop
scr -r jdk1.8 hadoop@slave2:/home/hadoop

分别在三台机器上配置JAVA_HOME

代码语言:javascript复制
export JAVA_HOME=/home/hadoop/jdk1.8

export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar

:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

export PATH=$PATH:$JAVA_HOME/bin

测试:

执行 java -version 看控制台输出

其它配置

修改windos下的hosts文件,因为到时候再浏览器上访问的时候会用到域名

C:WINDOWSSystem32driversetchosts

代码语言:javascript复制
192.168.88.21 master

192.168.88.22 slave1

192.168.88.23   slave2

修改linux系统的hostname,注意不是修改/etc/hoss文件,centos7永久修改hostname使用以下命令

代码语言:javascript复制
hostnamectl set-hostname 名称

安装Hadoop

下载安装

1、官网下载,这个地址下载有点慢

http://apache.claz.org

2、以下的地址下载更快一些

http://mirror.bit.edu.cn/apache/

http://mirror.bit.edu.cn/apache/

https://mirrors.tuna.tsinghua.edu.cn/apache/

我最终下载的版本是:hadoop-2.7.6.tar.gz

安装过程很简单,只需要直接解压就可以了。

三台机器机器最终的配置基本一样,所以我们只需要在一台机器上配置好,然后拷贝到其它机器就好, 这里是在master机器上配置。

在master上执行以下命令

代码语言:javascript复制
cd /home/Hadoop

mkdir -p cludata/hadoop

cd cludata/hadoop

mkdir -p hdfs/data hdfs/name temp

tar -zxvf hadoop-2.7.6.tar.gz
HADOOP_HOME

就是配置hadoop环境变量,这个需要在三台机器上分别执行

代码语言:javascript复制
vi ~/.bash_profile

export HADOOP_HOME=/home/hadoop/hadoop-2.7.6

export PATH=$PATH:$JAVA_HOME/bin::$HADOOP_HOME/bin:$HADOOP_HOME/sbin
配置文件

主要需要配置以下几个配置文件:core-site.xml、hdfs-site.xml、mapred-site.xml和yarn-site.xml、slaves。然后可能还需要再hadoop-env.sh中添加JAVA环境变量。

以下配置文件可作为参考,还有很多其它配置项。

  • core-site.xml

该配置文件主要用于定义系统级别的参数,如HDFS、URL、hadoop的临时目录

代码语言:javascript复制
<configuration>
  <property>
    <name>fs.default.name</name>
    <value>hdfs://master:9000</value>
    <description>文件系统主机和端口</description>   
  </property>
  <property>
    <name>io.file.buffer.size</name>
    <value>131072</value>
    <description>每个block的大小</description>
  </property>
  <property>
    <name>hadoop.tmp.dir</name>
    <value>file:/home/hadoop/cludata/hadoop/temp</value>
    <description>临时目录</description>   
  </property>
</configuration>
  • dfs-site.xml
代码语言:javascript复制
<configuration>
  <property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>master:9001</value>
    <description>通过web界面来查看HDFS状态</description>
  </property>
  <property>
    <name>dfs.namenode.name.dir</name> 
    <value>file:/home/hadoop/cludata/hadoop/hdfs/name</value>
  </property>
  <property>
    <name>dfs.datanode.data.dir</name>  
    <value>file:/home/hadoop/cludata/hadoop/hdfs/data</value>
  </property>
  <property>
    <name>dfs.replication</name>
    <value>3</value>
    <description>每个Block有2个备份</description>
  </property>
  <property>
    <name>dfs.webhdfs.enabled</name>
    <value>true</value>
    <description>是否通过http协议访问hdfs文件</description>
  </property>
</configuration>
  • mapred-site.xml
代码语言:javascript复制
<configuration>
  <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>
  <property>
    <name>mapreduce.jobhistory.address</name>
    <value>master:10020</value>
  </property>
  <property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>master:19888</value>
  </property>
</configuration>
  • yarn-site.xml
代码语言:javascript复制
<configuration>
  <!-- Site specific YARN configuration properties -->
  <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.resourcemanager.address</name>
    <value>master:8032</value>
  </property>
  <property>
    <name>yarn.resourcemanager.scheduler.address</name>
    <value>master:8030</value>
  </property>
  <property>
    <name>yarn.resourcemanager.resource-tracker.address</name>
    <value>master:8031</value>
  </property>
  <property>
    <name>yarn.resourcemanager.admin.address</name>
    <value>master:8033</value>
  </property>
  <property>
    <name>yarn.resourcemanager.webapp.address</name>
    <value>master:8088</value>
  </property>
  <property>
    <name>yarn.nodemanager.resource.memory-mb</name>
    <value>8192</value>
  </property>
</configuration>
  • slaves

这个配置文件主要是配置 datanode

把localhost去掉,添加以下内容

代码语言:javascript复制
slave1

slave2

配置完成之后,将整个hadoop文件夹拷贝到其它两台机器

代码语言:javascript复制
cd /home/hadoop

scp -r hadoop-2.7.6 hadoop@slave1:/home/hadoop/

scp -r hadoop-2.7.6 hadoop@slave2:/home/hadoop/
格式化

在启动hadoop之前,需要先格式化HDFS文件系统,只需要在master上执行即可

代码语言:javascript复制
hadoop namenode -format

格式化

启动

有关于hadoop的一些脚本命令,存放在根目录下的sbin 文件夹下:即/home/hadoop /hadoop-2.7.6/sbin

脚本命令

所以,先进入sbin目录

代码语言:javascript复制
cd /home/hadoop /hadoop-2.7.6/sbin
  • 启动NameNode
代码语言:javascript复制
hadoop-daemon.sh start namenode

执行该命令后可以通过 ps -ef|grep hadoop 命令查看hadoop进程,也可以使用jsp命令查看JVM进行。运行jsp命令之后,可以可能到 Namenode进程。

  • 启动DataNode
代码语言:javascript复制
hadoop-daemon.sh start datanode

在master上执行该命令后,在两台slave上分别执行 jps 命令查看 datanode是否启动,如果发现 Datanode 进程说明启动成功。

提示:其实以上两个启动过程可以通过一个脚本来启动,hadoop里面也提供了这个脚本,也是在sbin目录中,只要执行这个脚本就可以了

代码语言:javascript复制
./start-dfs.sh

//对应的停止命令

./stop-dfs.sh
  • 启动ResourceManager
代码语言:javascript复制
yarn-daemon.sh start resourcemanager

执行该命令之后,使用jsp命令可以查看到ResourceManager说明启动成功。

  • 启动NodeManager
代码语言:javascript复制
yarn-daemon.sh start nodemanager

同理,通过jpps命令可以看到 NodeManage进程。

注意:以上两个过程也可以通过一个脚本来启动

代码语言:javascript复制
./start-yarn.sh

//对应的停止命令

./stop-yarn.sh
  • 浏览器访问

http://192.168.88.21:50070

可以看到以下界面

hadoop

http://192.168.88.21:8088

可以看到以下界面

yarn

常见命令

hadoop下有一些常见命令

代码语言:javascript复制
列出文件:hadoop fs -ls /

创建目录:hadoop fs -mkdir 目录

上传文件:hadoop fs -put filename 目录

查看文件:hadoop fs -cat 文件
测试案例

启动之后,可以用hadoop来处理一个demo,这个demo程序是hadoop在安装包里面已经提供了。

代码语言:javascript复制
hadoop jar /home/hadoop/hadoop-2.7.6/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.6.jar pi 5 10

Pi 5 10 表示开 5个Map , 10 个 Reduce

执行这命令之后,控制台会有一系列输出,同时在浏览器上也可以看到效果

http://192.168.88.21:8088

MapReducer

其实上面就是一个Map Reducer 程序,这是官方提供的一个Demo,不过我们好像并不是很清楚这个程序的运行机制是什么样的,所以在此之前,有必要了解一下MapReducer。MapReducer可以在任何地方运行程序,访问HDFS上的文件并进行统计运算,并且可以把统计的结果写回HDFS的结果文件中。包括接下来介绍了HIVE,其实内部也是基于MapReducer实现,只不过HIVE内部进行了大量封装,所以我们才可以写SQL语句,其实每条SQL语句,都可以看成是一个MapReducer程序。MapReducer中有两个概念:Map 和 Reducer。

Map阶段: 将每一行文本数据变成<单词,1>这样的kv数据

Reduce阶段:将相同单词的一组kv数据进行聚合:累加所有的v

下面是一个简单WordCount 示例

pom.xml

代码语言:javascript复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.hand.sxy</groupId>
    <artifactId>MapReducer</artifactId>
    <version>1.0</version>

    <dependencies>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>2.7.6</version>
        </dependency>

        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-mapreduce-client-core</artifactId>
            <version>2.7.6</version>
        </dependency>
    </dependencies>

</project>

WordCount.java

代码语言:javascript复制
package com.hand.sxy;

import com.hand.sxy.utils.FileUtil;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

import java.io.IOException;
import java.util.Iterator;
import java.util.StringTokenizer;

public class WordCount {

    public static void main(String[] args) throws Exception {

        FileUtil.deleteDir("/output");
        Configuration conf = new Configuration();

        String[] otherArgs = new String[]{"hdfs://master:9000/test/dream.txt", "/output"};
        if (otherArgs.length != 2) {
            System.err.println("Usage:Merge and duplicate removal <in> <out>");
            System.exit(2);
        }

        Job job = Job.getInstance(conf, "WordCount");
        job.setJarByClass(WordCount.class);
        job.setMapperClass(WordCount.TokenizerMapper.class);
        job.setReducerClass(WordCount.IntSumReduce.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
        FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }


    public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> {

        public static final IntWritable one = new IntWritable(1);
        private Text word = new Text();

        public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
            StringTokenizer itr = new StringTokenizer(value.toString());
            while (itr.hasMoreTokens()) {
                this.word.set(itr.nextToken());
                context.write(this.word, one);
            }
        }

    }

    public static class IntSumReduce extends Reducer<Text, IntWritable, Text, IntWritable> {
        private IntWritable result = new IntWritable();

        public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
            int sum = 0;
            IntWritable val;
            for (Iterator i = values.iterator(); i.hasNext(); sum  = val.get()) {
                val = (IntWritable) i.next();
            }
            this.result.set(sum);
            context.write(key, this.result);
        }
    }
}

这里面就涉及到了一些API,这个可以自己去网上查,这里不做过多介绍。

接下来需要做的就是执行这个程序,首先,将这个程序打包成jar,然后上传服务器

代码语言:javascript复制
mvn clen install

在hdfs系统上准备好数据,编辑 dream.txt 文件内容如下

代码语言:javascript复制
Hello bob

I am good

How are you

I am fine

Good good study

上传dream.txt到hdfs系统

代码语言:javascript复制
hadoop fs -mkdit /test
hadoop fs -put dream.txt /test/dream.txt

执行MapReducer-1.0.jar程序

代码语言:javascript复制
hadoop jar MapReducer-1.0.jar com.hand.sxy.WordCount

在控制台和浏览器上观察

image.png

浏览器打开:http://master:8088/cluster/apps

image.png

浏览器打开:http://master:50070/explorer.html#/output

程序结果即在hsfs中的 /output/part-r-00000文件中

代码语言:javascript复制
hadoop fs -cat /output/part-r-00000

输出的就是每个单词出现的次数,这就是一个最简单的MapReducer程序。

HA集群

hadoop的HA集群,即hadoop的高可用集群配置,为了解决hadoop中的NameNode单点故障问题。这个配置的时候比较繁琐,有空再补上

安装HIVE

HIVE是在MapReducer上的一层封装,通过写sql方式来实现MapReducer程序。什么意思?就是说大部分情况下,有了HIVE之后,不需要再开发MapReducer程序了,直接写HQL即可,大大节约了时间成本。HIVE非常强大,在创建hie表的时候,字段类型用的是java里面的数据类型,连Map类型都可以用,很强大。

下载安装

http://mirror.bit.edu.cn/apache/hive/ http://mirrors.hust.edu.cn/apache/hive/ http://mirrors.shu.edu.cn/apache/hive/ http://mirrors.tuna.tsinghua.edu.cn/apache/hive/

安装位置随便安装到那台机器都都可以,先解压

代码语言:javascript复制
tax -zxvf apache-hive-1.2.2-bin.tar.gz

6.2. 配置文件

添加一个hive-site.xml配置文件

代码语言:javascript复制
<configuration>
  <property>
    <name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://centos81:3306/hive?
createDatabaseIfNotExist=true</value>
  </property>

  <property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
  </property>

  <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>root</value>
  </property>

  <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>root</value>
  </property>
</configuration>

这里其实就是配置hive元数据的存放位置,即hive中的数据库名、表名、字段等西信息。其实不配置也没关系, hive默认内置了一个其它 的数据库。

这里选择的是mysql数据库,所以还需要提供一个mysql驱动包,这里是:mysql-connector-java-5.1.46.jar

启动
代码语言:javascript复制
cd hive-1.2.2

bin/hive

如果你已经安装好了mysql,执行这个命令之后,就会在mysql下创建一个hive数据库。如图:

之后,就可以用一些hive的语法了。

常见命令

和我们的sql非常类似

代码语言:javascript复制
列出数据库:show databases;

创建数据库:create database 数据库名;

使用数据库:use 数据库 名;

创建数据表:create table 表名 (xxx);

创建外部表:create external table 表名 (xxx);

创建分区表:create external table 表名 (xxx) partitioned by (day string);

配置分隔符:在建表语句后面加 row format delimited fields terminated by ',' ;
测试

在hive中新建数据库和表,并在hadoop中上传文件,看看在hivez怎么通过sql查出来。

代码语言:javascript复制
create database tsdb;
use tsdb;
create table t_test1(id int,name string,age int) row format delimited fields terminated by ',';

执行以上命令之后,观察在hadoop中hdfs的目录

image.png

可以看到,生成了一个和数据库名相同的文件夹子,点进去发现,也生成了一个和表名对应的目录。

代码语言:javascript复制
vi t_test1.txt

文件内容如下:

代码语言:javascript复制
1,xiaoyong,20
2,gaoxiao,40
3,liuxin,19

上传这个文件到hdfs

代码语言:javascript复制
hadoop fs -put t_test1.txt /user/hive/warehouse/tsdb.db/t_test1

在hive控制台查询

代码语言:javascript复制
select * from t_test1;

[图片上传失败...(image-83e835-1535979338058)]

结果已经查出来了。

这本是一个MapReducer程序做的事情,现在一个SQL就搞定了。Hive中还有很多概念,这里就不做过多结算了。

安装MySQL

这里安装MySQL的目的就一个:保存HIVE中的元数据。在安装MySQL之前,先装一个虚拟机,修改IP,修改四台机器的 /etc/host,这就当作是一台专用数据库服务器。

更新yum源

下载mysql的yum源:

代码语言:javascript复制
wget -P /home/lisonglin [http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm](http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm)

安装mysql的yum源:

代码语言:javascript复制
rpm -ivh mysql57-community-release-el7-11.noarch.rpm
安装

执行以下命令,然后一直按y就可以了

代码语言:javascript复制
yum install mysql-community-server

启动测试

启动服务

代码语言:javascript复制
systemctl start mysqld

通过mysql客户但登录mysql,默认是不需要密码

代码语言:javascript复制
mysql -uroot

设置密码

代码语言:javascript复制
set password = passeord(‘root’);

修改配置文件,这里只修改编码集,配置文件默认在 /etc/my.cnf

代码语言:javascript复制
show variables lie ‘character%’;

vi /etc/my.cnf

[mysql]

default-character-set = utf8

[mysqld]

character_set_server = utf8

常用命令

常见的 启动、停止、重启等命令

代码语言:javascript复制
启动:systemctl start mysqld   

停止:# systemctl stop mysqld 

重启:systemctl restart mysqld 

设置开机启动:systemctl enable mysqld 

查看 MySQL Server 状态:systemctl status mysqld   
安装Zookeeper

Zookeeper是一个基础组件,主要功能包括:

可以为客户端管理少量数据,其中在zookeeeper中数据为键值格式。其中key类似于文件目录结构,但不是目录

代码语言:javascript复制
/aa “valuea”

/aa/cc “valueb”

可以为客户端监听指定数据节点得装填,并在数据节点发生变化时通知客户端。 应用场景:zookeeeper的应用场景可以非常广泛,比如微服务架构中的服务注册中心,用于服务上下线动态感知。zookeeper在hadoop体系中是为了高可用,是为了解决DataNode的单点故障问题;在Hbase中保存了Hbase各个ReginServer和master的信息。

下载安装

生产环境一般是部署zookeeper集群,部署到奇数台服务器,一般3台或者5台。zookeeper有一个投票选举机制,所以有个leader 和 flower概念。

下载地址:http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.12/

代码语言:javascript复制
解压:tax -zxvf zookeeper-3.4.12.tar.gz

8.2. 配置文件

代码语言:javascript复制
cd zookeeper-3.4.12/conf

cp zoo_sample.cfg zoo.cfg

vi zoo.cfg

我的配置文件内容如下:

代码语言:javascript复制
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial 
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
dataDir=/home/hadoop/cludata/zkdata
# the port at which the clients will connect
clientPort=2181
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
server.21=master:2888:3888
server.22=slave1:2888:3888
server.23=slave2:2888:3888

创建zk数据目录

代码语言:javascript复制
cd ~
mkdir -p cludata/zkdata
启动

在三台服务器下分别执行以下命令

代码语言:javascript复制
cd ~/zookeeper-3.4.12/

bin/zkServer.sh start

在启动之后可以查看状态

代码语言:javascript复制
bin/zkServer.sh status
启动脚本

为了方便启动,提供一个启动脚本

代码语言:javascript复制
常见命令

进入客户端

代码语言:javascript复制
cd zookeeper-3.4.12

bin/zkCli.sh

//或者连接到其它服务器

bin/zkCli.sh -server slave1:2181

zookeeper 下提供了一些常见客户端命令

代码语言:javascript复制
创建节点:create /aa “value”

查看节点:ls /

查看数据:get /aa

修改数据:set /add “vakue2”

删除节点:rmr /aa

监听数据:get /aa watch

安装HBASE

HBase是一个基于HDFS的NoSQL数据库,可以提供数据的实时随机读写,其中包括的概念有:HMaster、HRegionServer、库名、表名、行键、列族等,其中HBase集群中的各个节点信息是维护在zookeeper中的。

下载安装

下载地址:http://apache.claz.org/hbase/1.2.6.1/

代码语言:javascript复制
tar -zxvf

HBase中包括两个角色:HMaster、HRegionServer。HMaster负责管理HRegionServer,数据读写交给HRegionServer。其中,HRegionServer应该和HDFS中的DataNode安装在一起。

配置文件

主要修改三个配置文件:hbase-env.sh、hbase-site.xml、regionservers

代码语言:javascript复制
cd hbase-1.2.6.1/conf

修改hbase-env.sh

代码语言:javascript复制
export JAVA_HOME=/home/hadoop/jdk1.8

//hbase自己有一套zookeeper管理机制,这里不使用自带的,而是使用我们配置的

export HBASE_MANAGES_ZK=false

修改hbase-site.xml

代码语言:javascript复制
<configuration>
  <!-- 指定hbase在HDFS上存储的路径 -->
  <property>
    <name>hbase.rootdir</name>
    <value>hdfs://master:9000/hbase</value>
  </property>

  <!-- 指定hbase是分布式的 -->
  <property>
    <name>hbase.cluster.distributed</name>
    <value>true</value>
  </property>

  <!-- 指定zk的地址,多个用“,”分割 -->
  <property>
    <name>hbase.zookeeper.quorum</name>
    <value>master:2181,slave1:2181,slave2:2181</value>
  </property>
</configuration>

修改regionservers,这里就是配置HRegionServer服务器的

代码语言:javascript复制
slave1
slave2

然后将安装包拷贝到slave1 和 slave2

代码语言:javascript复制
scr -r hbase-1.2.6.1 hadoop@slave1:/home/hadoop
scr -r hbase-1.2.6.1 hadoop@slave2:/home/hadoop
启动

启动hbase的时候有个要求,需要各个服务器之间时间差不超过30s,所以在启动之前需要先设置同步一下服务器时间,可以选择时间服务器,这里就直接用命令了

代码语言:javascript复制
date -s "2018-07-08 16:39:03"

//写入bios,防止重启系统时间又变了

hwclock -w

启动hdfs,不启动yarn也没关系,在master服务器启动

代码语言:javascript复制
cd hadoop-2.7.6
sbin/start-dfs.sh

启动zookeeper,进入三台服务器启动

代码语言:javascript复制
cd zookeeper-3.4.12
bin/zkServer.sh start

启动hbase

代码语言:javascript复制
bin/start-hbase.sh

启动之后,三台服务器上的进程分别如下,可以看到hbase已经启动起来了

启动成功之后,也可以在浏览器上观察效果 http://master:16010

前面已经说过,hbase相关的节点信息和zookeeper已经关联了,所以可以在zookeeper上查看hbase相关信息

代码语言:javascript复制
cd zookeeper-3.4.12
bin/zkCli.sh

Hbase的文件存储是基于HDFS的,所以也可以在hdfs上看到hbase相关的目录 打开浏览器:http://master:50070/explorer.htm

命令行

Hbase提供了一些交互命令,但是这种情况我们用的不多一般是在程序中通过API来对hbase交互。

进入hbase命令行客户端

代码语言:javascript复制
cd hbase-1.2.6.1
bin/hbase shell

常用命令如下:

image.png

常见用法

创建表

代码语言:javascript复制
create 表名, 列族名, 列族名 ……
create 't_user_info','base_info','extra_info'

插入数据

代码语言:javascript复制
put 't_user_info','001','base_info:username','zhangsan'
put 't_user_info','001','base_info:age','18'

查询数据

代码语言:javascript复制
scan 't_user_info'
get 't_user_info','001'

删除kv数据

代码语言:javascript复制
delete 't_user_info','001','base_info:sex'
deleteall 't_user_info','001'

删除表

代码语言:javascript复制
先禁用,然后删除
disable 't_user_info'

drop 't_user_info'
API

创建一个连接

代码语言:javascript复制
Connection conn = ConnectionFactory.createConnection(conf);

拿到一个DDL容器

代码语言:javascript复制
Admin admin = conn.getAdmin();

用表管理器的API去操作表

代码语言:javascript复制
admin.createTable(HTableDescriptor descriptor);

创建一个连接

代码语言:javascript复制
Connection conn = ConnectionFactory.createConnection(conf);

安装Flume

Flume用于数据采集。在实际开发中,有各种各样的数据来源,比如:kafka、mysql、hbase等等,而我们的业务系统,往往需要根据不用的数据来源开发不同的程序。Flume就相当一层壳,并且里面提供了一些常用的实现类,有个核心概念就Agent,可以启动Agent程序进行数据采集,大大减少了我们的开发时间。

不过看网上说,Flume在严格场景是不推荐使用的,会有问题。所以简单了解一下吧。

下载安装

下载地址

http://mirror.bit.edu.cn/apache/flume/1.8.0/apache-flume-1.8.0-bin.tar.gz http://mirrors.hust.edu.cn/apache/flume/1.8.0/apache-flume-1.8.0-bin.tar.gz http://mirrors.shu.edu.cn/apache/flume/1.8.0/apache-flume-1.8.0-bin.tar.gz http://mirrors.tuna.tsinghua.edu.cn/apache/flume/1.8.0/apache-flume-1.8.0-bin.tar.gz

解压并拷贝到其它两台机器

代码语言:javascript复制
tar -zxvf apache-flume-1.8.0-bin.tar.gz

scp -r flume-1.8.0 hadoop@slave1:/home/hadoop

scp -r flume-1.8.0 hadoop@slave2:/home/hadoop
配置文件

使用Flume主要就是配置了,需要编写的配置内容比较多。 这里就不过多介绍了,有兴趣的网上了解一下。

问题总结

DataNode无法启动

多次执行hadoop namenode -format命令,slave 上的执行这个命令之前,我已经清空了三台服务器下的一些目录,并且停掉了所有进程

代码语言:javascript复制
cd /home/hadoop/hadoop
rm -rf temp/*
rm -rf hdfs/name/* hdfs/data/*
cd hadoop-2.7.6
rm -rf logs/*
sbin/stop-all.sh

然后在master上执行以下命令

代码语言:javascript复制
sbin/ hadoop-daemon.sh start namenode
sbin/ hadoop-daemon.sh start datanode

执行该命令后,发现在 master节点上找到了 NameNode 和 DataNode 进行,但是在其它两台服务器上未找到 DataNode 进程。

最后的解决方案:

分别在slave1 和 slave2 上执行 以下命令

代码语言:javascript复制
sbin/ hadoop-daemon.sh start datanode

这时候可以在 slave1 和 slave2 上找到 DataNode进程。

同时,在浏览器上可以发现3个DataNode http://192.168.88.21:50070/dfshealth.html#tab-datanode

可能应该在三台服务器上把 hdfs目录下的所有文件和文件夹都清空,或者把整个hdfs目录删除。

同理,对于slave1 和slave2 上的没有NodeManager进程情况,就手动在slave1和slave2上启动

代码语言:javascript复制
yarn-daemon.sh start nodemanager

http://192.168.88.21:8088/cluster/nodes

脚本启动权限问题

执行 sbin/start-dfs.fs 命令,通过ssh的方式启动slave1和slave2节点,提示没有/tmp目录的权限,但是很好奇都是hadoop用户,启动本地的NameNode却没有权限问题。单丝,虽然提示权限问题,两个DataNode却都已经启动了。

为了去除这个警告,尝试是将 /tmp 目录的权限赋给hadoop用户,分别在三台机器上执行以下命令

代码语言:javascript复制
chown -R hadoop /tmp

再次重启hadoop

代码语言:javascript复制
sbin/stat-dfs.sh
代码语言:javascript复制
sbin/stat-yarn.sh

发现警告已经没有了,同时两台DataNode已经启动成功。

这时候,三台机器下分别启动的进程有

代码语言:javascript复制
**master**:NameNode、SecondaryNameNode、ResourceManager

**slave1**:DataNode、NodeManager、

**slave2**:DataNode、NodeManager、

可以这样理解:NameNode用于管理DataNode,而ResourceManager用于管理NodeManager。

其实这个问题还有另外一种解决方案,就是修改 etc/hadoop/hadoop.env配置文件,里面有那么个选项可以修改。

0 人点赞