Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Spark结构化流式redis接收器性能不理想_Apache Spark_Redis_Spark Structured Streaming_Sink - Fatal编程技术网

Apache spark Spark结构化流式redis接收器性能不理想

Apache spark Spark结构化流式redis接收器性能不理想,apache-spark,redis,spark-structured-streaming,sink,Apache Spark,Redis,Spark Structured Streaming,Sink,我使用了spark结构化流媒体conume kafka消息并将数据保存到redis。通过扩展ForeachWriter[org.apache.spark.sql.Row],我使用redis接收器来保存数据。代码运行良好,但每秒只需将略多于100个数据保存到redis。有没有更好的方法来加快程序?虽然下面的代码会在每个mico批处理中连接并断开与redis服务器的连接,但有没有办法只连接一次并保持连接,从而将连接成本降到最低,我认为这是耗时的主要原因? 我试着广播绝地武士,但绝地武士和绝地武士都不

我使用了spark结构化流媒体conume kafka消息并将数据保存到redis。通过扩展ForeachWriter[org.apache.spark.sql.Row],我使用redis接收器来保存数据。代码运行良好,但每秒只需将略多于100个数据保存到redis。有没有更好的方法来加快程序?虽然下面的代码会在每个mico批处理中连接并断开与redis服务器的连接,但有没有办法只连接一次并保持连接,从而将连接成本降到最低,我认为这是耗时的主要原因? 我试着广播绝地武士,但绝地武士和绝地武士都不可串行化,所以没用

我的接收器代码如下:

class StreamDataSink extends ForeachWriter[org.apache.spark.sql.Row]{

  var jedis:Jedis = _

  override def open(partitionId:Long,version:Long):Boolean={
    if(null == jedis){
      jedis = FPCRedisUtils.getPool.getResource
    }
    true
  }

  override def process(record: Row): Unit = {

    if(0 == record(3)){
      jedis.select(Constants.REDIS_DATABASE_INDEX)
      if(jedis.exists("counter")){
        jedis.incr("counter")
      }else{
        jedis.set("counter",1.toString)
      }
    }
  }

  override def close(errorOrNull: Throwable): Unit = {
    if(null != jedis){
      jedis.close()
      jedis.disconnect()
    }
  }

任何建议都将不胜感激。

不要做绝地武士。断开连接()。这实际上会关闭套接字,强制下次建立新连接。仅使用
jedis.close()
,它将返回到池的连接

当您对不存在的键调用INCR时,它会自动创建,默认为零,然后递增,从而生成一个值为1的新键

这将你的if-else简化为
jedis.incr(“计数器”)

有了这个,你就有了:

jedis.select(Constants.REDIS_DATABASE_INDEX)
jedis.incr("counter")
如果你真的需要,复习一下。这是每个连接,所有连接默认为DB 0。如果共享同一个jedis池的所有工作负载都使用DB 0,则无需调用select

如果您确实需要select和incr,则它们:


这将在一条网络消息中发送两条命令,进一步提高您的性能。

不要执行
绝地武士。断开连接()
。这实际上会关闭套接字,强制下次建立新连接。仅使用
jedis.close()
,它将返回到池的连接

当您对不存在的键调用INCR时,它会自动创建,默认为零,然后递增,从而生成一个值为1的新键

这将你的if-else简化为
jedis.incr(“计数器”)

有了这个,你就有了:

jedis.select(Constants.REDIS_DATABASE_INDEX)
jedis.incr("counter")
如果你真的需要,复习一下。这是每个连接,所有连接默认为DB 0。如果共享同一个jedis池的所有工作负载都使用DB 0,则无需调用select

如果您确实需要select和incr,则它们:


这将在一条网络消息中发送两条命令,进一步提高您的性能。

非常感谢。我试图像上面那样完善我的代码。由于pip在一个连接中处理多条指令,所以它确实可以工作。现在处理数据的速度大约是每秒160条记录(以前是110条)。这是使用redis的结构化流媒体的正常速度吗?顺便说一句,我使用的是一个本地环境,有4个内核和16G内存。我不知道结构化流媒体,但在本地机器上,客户端每秒应该给你提供十分之一的请求——如果速度慢的话。你可以尝试一个不带redis的虚拟接收器,继承相同的ForeachWriter,但计算本地int,看看你的基线是什么。我使用的接收器包括同时将数据写入cassandra的代码。我试着只给卡桑德拉写信,而不给redis写信,它表现得很好。比如每秒有三张唱片。所以我支持连接到redis每一个触发器都会减慢整个过程。非常感谢。我试图像上面那样完善我的代码。由于pip在一个连接中处理多条指令,所以它确实可以工作。现在处理数据的速度大约是每秒160条记录(以前是110条)。这是使用redis的结构化流媒体的正常速度吗?顺便说一句,我使用的是一个本地环境,有4个内核和16G内存。我不知道结构化流媒体,但在本地机器上,客户端每秒应该给你提供十分之一的请求——如果速度慢的话。你可以尝试一个不带redis的虚拟接收器,继承相同的ForeachWriter,但计算本地int,看看你的基线是什么。我使用的接收器包括同时将数据写入cassandra的代码。我试着只给卡桑德拉写信,而不给redis写信,它表现得很好。比如每秒有三张唱片。所以我支持与redis的连接每一个触发器都会减慢整个过程。