redis

 

  1. redis快速上手
    1. 简介

redis是一个基于内存的 nosql框架(数据库)。

redis中也是存储key-value形式的数据

Redis存储的数据类型有五种:字符(string)、散列(hash)、列表(list)、集合(set)、有序集合(sorted set)

这里的5种数据结构,指的key-value中的value。

 

    1. 安装
  1. 解压redis压缩包

[root@hdp-04 ~]# tar -zxvf redis-3.2.8.tar.gz  -C  apps/

 

  1. 编译解压缩之后的redis文件

[root@hdp-04 ~]# cd apps/redis-3.2.8

[root@hdp-04 redis-3.2.8]# make

 

 

安装命令:

[root@hdp-03 redis-3.2.8]# yum -y install gcc gcc-c++

 

 

如果报错

# make MALLOC=libc

 

安装: 指定安装目录

[root@hdp-03 redis-3.2.8]# make install PREFIX=/usr/local/redis

 

 

    1. 启动:
      1. 前台启动:

 

 

 

      1. 后台启动

以守护进程存在

 

查看进程的状态:

 

 

拷贝redis.conf

[root@hdp-03 redis-3.2.8]# cp redis.conf /usr/local/redis/bin/

 

修改bin/redis.conf配置文件:

bind 192.168.8.13 127.0.0.1

daemonize yes

 

 

新的启动命令,必须加上 配置后的redis.conf文件。

[root@hdp-03 bin]# ./redis-server redis.conf

 

测试:

[root@hdp-03 bin]# ./redis-cli

127.0.0.1:6379> ping

PONG

 

 

 

    1. redis的客户端
      1. 自带的客户端  redis-cli
      2. java客户端

<!-- 导入redis的客户端API  jedis-->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.8.1</version>
</dependency>

 

基本的命令:

keys * 查看所有的keys数据

flushdb : 禁用

127.0.0.1:6379> keys *

1)

127.0.0.1:6379> flushdb

 

 

连接池的工具类:

object JedisUtils {

  // 为连接池设置一个配置
  private val config = new JedisPoolConfig()
  // 最大的空闲连接数
  config.setMaxIdle(4)
  // 连接池中连接的数量
  config.setMaxTotal(2000)

  // 创建jedis连接池
  private val pool = new JedisPool(config, "hdp-03")

  // 通过apply方法,获取一个连接
  def apply(): Jedis = pool.getResource
}

 

 

 

    1. redis的数据结构

具体的命令,参考《Redis.docx》

 

redis可视化工具:

 

下载路径:https://redisdesktop.com/download 

 

安装:

直接双击,一路next即可。

 

安装之后,打开后的界面:

 

配置redis:

 

  1. 基于redis做checkpoint

使用哪一种数据结构?

 

wordcount

(word,cnts)

应该选择哪一种数据结构,存储wordcount的历史数据。

键: streamingwc  values

hash 

 

代码实现:

val conf = new SparkConf()
  .setMaster("local[*]")
  .setAppName(this.getClass.getSimpleName)
val sc = new SparkContext(conf)
// 批次时间  为 2s  一个批次
val ssc: StreamingContext = new StreamingContext(sc, Seconds(2))

// 读取socket端口的数据,  防火墙   需要一个cores
val sstext: ReceiverInputDStream[String] = ssc.socketTextStream("hdp-03", 9999)

val batchData: DStream[(String, Int)] = sstext.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _)

batchData.foreachRDD(rdd => {

  rdd.foreachPartition(it => {
    // 利用工具类来获取jedis的连接
    val jedis: Jedis = JedisUtils()
    // 调用api执行数据写入
    it.foreach(t => jedis.hincrBy("streamingwc", t._1, t._2))
    // 把连接返回给连接池
    jedis.close()
  })
})

ssc.start() // 启动程序
ssc.awaitTermination() // 阻塞程序 挂起

 

 

  1. sparkStreaming数据源,接收器

输入 DStreams 是代表输入数据是从流的源数据(streaming sources)接收到的流的 DStream. 在 一个入门示例 中, lines 是一个 input DStream, 因为它代表着从 netcat 服务器接收到的数据的流. 每一个 input DStream(除了 file stream 之外, 会在本章的后面来讨论)与一个 Receiver (Scala doc,Java doc) 对象关联, 它从 source(数据源)中获取数据,并且存储它到 Sparl 的内存中用于处理.

Spark Streaming 提供了两种内置的 streaming source(流的数据源).

  • Basic sources(基础的数据源): 在 StreamingContext API 中直接可以使用的数据源. 例如: file systems 和 socket connections.
  • Advanced sources(高级的数据源): 像 Kafka, Flume, Kinesis, 等等这样的数据源. 可以通过额外的 utility classes 来使用. 像在 依赖 中讨论的一样, 这些都需要额外的外部依赖.

在本节的后边,我们将讨论每种类别中的现有的一些数据源.

请注意, 如果你想要在你的流处理程序中并行的接收多个数据流, 你可以创建多个 input DStreams(在 性能优化 部分进一步讨论). 这将创建同时接收多个数据流的多个 receivers(接收器). 但需要注意,一个 Spark 的 worker/executor 是一个长期运行的任务(task),因此它将占用分配给 Spark Streaming 的应用程序的所有核中的一个核(core). 因此,要记住,一个 Spark Streaming 应用需要分配足够的核(core)(或线程(threads),如果本地运行的话)来处理所接收的数据,以及来运行接收器(receiver(s)).

要记住的几点

  • 当在本地运行一个 Spark Streaming 程序的时候,不要使用 “local” 或者 “local[1]” 作为 master 的 URL. 这两种方法中的任何一个都意味着只有一个线程将用于运行本地任务. 如果你正在使用一个基于接收器(receiver)的输入离散流(input DStream)(例如, sockets ,Kafka ,Flume 等),则该单独的线程将用于运行接收器(receiver),而没有留下任何的线程用于处理接收到的数据. 因此,在本地运行时,总是用 “local[n]” 作为 master URL ,其中的 n > 运行接收器的数量(查看 Spark 属性 来了解怎样去设置 master 的信息).
  • 将逻辑扩展到集群上去运行,分配给 Spark Streaming 应用程序的内核(core)的内核数必须大于接收器(receiver)的数量。否则系统将接收数据,但是无法处理它.

 

      1. Receiver Reliability(接收器的可靠性)

可以有两种基于他们的 reliability可靠性 的数据源. 数据源(如 Kafka 和 Flume)允许传输的数据被确认. 如果系统从这些可靠的数据来源接收数据,并且被确认(acknowledges)正确地接收数据,它可以确保数据不会因为任何类型的失败而导致数据丢失. 这样就出现了 2 种接收器(receivers):

  1. Reliable Receiver(可靠的接收器) - 当数据被接收并存储在 Spark 中并带有备份副本时,一个可靠的接收器(reliable receiver)正确地发送确认(acknowledgment)给一个可靠的数据源(reliable source).
  2. Unreliable Receiver(不可靠的接收器) - 一个不可靠的接收器( unreliable receiver )不发送确认(acknowledgment)到数据源。这可以用于不支持确认的数据源,或者甚至是可靠的数据源当你不想或者不需要进行复杂的确认的时候.

 

 

    1. 文本数据源

Spark Streaming 将监控dataDirectory 目录并且该目录中任何新建的文件 (写在嵌套目录中的文件是不支持的). 注意

  • 文件必须具有相同的数据格式.
  • 文件必须被创建在 dataDirectory 目录中, 通过 atomically(原子的) moving(移动) 或 renaming(重命名) 它们到数据目录.
  • 一旦移动,这些文件必须不能再更改,因此如果文件被连续地追加,新的数据将不会被读取.

对于简单的文本文件,还有一个更加简单的方法 streamingContext.textFileStream(dataDirectory). 并且文件流(file streams)不需要运行一个接收器(receiver),因此,不需要分配内核(core)。

 

val conf = new SparkConf()
  .setMaster("local[*]")
  .setAppName(this.getClass.getSimpleName)
val sc = new SparkContext(conf)
// 批次时间  为 2s  一个批次
val ssc: StreamingContext = new StreamingContext(sc, Seconds(2))

val fileStream: DStream[String] = ssc.textFileStream("f:/mrdata/testlog")

fileStream.print()

ssc.start() // 启动程序
ssc.awaitTermination() // 阻塞程序 挂起

 

 

 

  1. sparkStreaming中的时间调度
  1. 设置的批次的时间。  2s

http://localhost:4040 

 

 

使用Spark自带的Web UI就能满足大部分的监控需求。对于Spark Streaming来说,以下两个度量指标尤为重要(在Batch Processing Statistics标签下):新版本中(1.4+)新增的可视化界面,可以查看两个延迟

 

Scheduling Delay : 调度延迟时间

每一个批次的业务,会等待多长时间才能被执行到。

Processing Time: 任务运行时间

没一个批次的数据,执行消耗的时间。

Total Delay

总的延迟时间

Total Delay  = Scheduling Delay + Processing Time

 

如果前端一直产生批次任务,但是启动的任务都没有被处理完。

 

 

输入的数据速率:

 

 

 

 

数据的运行时间, 5条数据,  2s

尽可能让自己的每个批次的任务运行时间,在批次的调度时间之内完成。

 

合理设置任务的batch时间。

 

 

快速产生大量数据的命令:

[root@hdp-03 ~]# nc -lk 9999 < /dev/urandom

  1. kafka
    1. 简介:

Apache Kafka是分布式发布-订阅消息系统(消息中间件)。它最初由LinkedIn公司开发,之后成为Apache项目的一部分。Kafka是一种快速、可扩展的、设计内在就是分布式的,分区的和可复制的提交日志服务。

MQ: message queue

 

传统消息中间件服务RabbitMQ、Apache ActiveMQ(免费)等。IBMMQ (收费)

Apache Kafka与传统消息系统相比,有以下不同:

  1. 它是分布式系统,易于向外扩展;
  2. 它同时为发布和订阅提供高吞吐量;
  3. 它支持多订阅者,当失败时能自动平衡消费者;
  4. 它将消息持久化到磁盘,因此可用于批量消费,例如ETL,以及实时应用程序。

 

    1. kafka中的术语

术语

解释

Broker

Kafka集群包含一个或多个服务器,这种服务器被称为broker

Topic

 

每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topic。(物理上不同Topic的消息分开存储,逻辑上一个Topic的消息虽然保存于一个或多个broker上但用户只需指定消息的Topic即可生产或消费数据而不必关心数据存于何处)

Partition

Partition是物理上的概念,每个Topic包含一个或多个Partition.

Producer

负责发布消息到Kafka broker

Consumer

消息消费者,向Kafka broker读取消息的客户端

Consumer Group

每个Consumer属于一个特定的Consumer Group(可为每个Consumer指定group name,若不指定group name则属于默认的group)

replica

partition 的副本,保障 partition 的高可用

leader

replica 中的一个角色, producer 和 consumer 只跟 leader 交互

follower

replica 中的一个角色,从 leader 中复制数据

controller

Kafka 集群中的其中一个服务器,用来进行 leader election 以及各种 failover

 

 

    1. kafka集群部署:

http://kafka.apache.org/downloads 

 

给定3台机器:hdp-01, hdp-02,hdp-03

 

[root@hdp-01 ~]# tar -zxvf kafka_2.11-0.10.2.1.tgz  -C apps/

 

修改conf/server.properties配置文件:

broker.id=0

listeners=PLAINTEXT://hdp-01:9092

log.dirs=/root/kafkadata

num.partitions=3

zookeeper.connect=hdp-01:2181,hdp-02:2181,hdp-03:2181

 

 

kafka中的消息保留时长:

 

 

分发安装包:

cd /root/apps

[root@hdp-01 apps]# for i in 2 3 ;do scp -r kafka_2.11-0.10.2.1 hdp-0$i:$PWD ;done

 

分发完成之后,必须修改其他机器上的配置:

[root@hdp-02 config]# cat server.properties  | grep -v "^#"

 

 

kafka安装完成

 

    1. kafka的集群启停:

在bin目录下的启动命令:

修改环境变量:

for i in 2 3;do scp /etc/profile hdp-0$i:/etc/ ;done

 

 

 

启动kafka集群的命令:

[root@hdp-01 bin]# ./kafka-server-start.sh  -daemon ../config/server.properties

 

想要使用kafka,必须先把zookeeper启动。否则报错如下:

 

 

启动所有的zookeeper:

/root/apps/zookeeper-3.4.6/bin/zkServer.sh start

 

 

重新启动kafka集群:

[root@hdp-03 ~]# cd apps/kafka_2.11-0.10.2.1/bin/

[root@hdp-03 bin]# ./kafka-server-start.sh -daemon ../config/server.properties

 

 

[root@hdp-01 ~]# kafka-server-start.sh -daemon /root/apps/kafka_2.11-0.10.2.1/config/server.properties

 

修改kafka-server-stop.sh脚本。

 

 

    1. kafka客户端命令操作:

 

      1. 主题相关的操作:

在server.properties中,把 下面的配置的文件设置为true,才能成功的删除主题。

delete.topic.enable=true

 

副本的数量,必须不能大于broker的数量。但是分区的数量,不受broker数量的限制。

 

正确创建主题:

参数都是必须被设置的。

[root@hdp-01 bin]# kafka-topics.sh --create --topic "helloTopic" --zookeeper hdp-01:2181,hdp-02:2181,hdp-03:2181 --partitions 2 --replication-factor 3

Created topic "helloTopic".

 

查看主题列表: (所有的主题)

[root@hdp-01 bin]# kafka-topics.sh --list --zookeeper hdp-01:2181,hdp-02:2181,hdp-03:2181      helloTopic

 

查看一个主题的详情:

[root@hdp-01 bin]# kafka-topics.sh --describe --topic helloTopic --zookeeper hdp-01:2181,hdp-02:2181,hdp-03:2181

分区的编号

Leader: 0 2  表示brokerID。

Replicas:

Isr:  in sync replicas   活着的副本。

 

 

 

      1. 生产者和消费者都有命令

 

生产者:

生产者在生产数据的时候,默认会平均写到不同的分区中去。

 

 

 

消费者:

kafka-console-consumer.sh --bootstrap-server hdp-01:9092,hdp-02:9092 --topic helloTopic

kafka-console-consumer.sh --bootstrap-server hdp-01:9092,hdp-02:9092 --topic helloTopic  --from-beginning  

该参数指定从头开始消费。

 

消费的数据,分区内的数据,是有序的,但是分区间的数据,是无序的。

 

 

可以通过 –partition  来指定消费哪一个分区。

[root@hdp-02 ~]# kafka-console-consumer.sh --bootstrap-server hdp-01:9092,hdp-02:9092 --topelloTopic  --from-beginning --partition 1

 

如果没有指定groupid,默认,那么每次都生成一个新的组。

 

消费时,指定组id

[root@hdp-02 ~]# kafka-console-consumer.sh --bootstrap-server hdp-01:9092,hdp-02:9092 --topelloTopic  --from-beginning  --consumer-property group.id=abc

 

偏移量 ,offSet  

 

 

客户端的API:

 

 

 

  1. 今日总结:

redis 环境搭建  redis的命令操作

 

spark streaming 利用redis checkpoint 

 

kafka:

  1. 理解好几个角色。
  2. kafka的集群必须搭建  --- zookeeper 时间同步
  3. kafka的客户端API
  4. kakfa JAVA客户端 代码

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值