Redisのデータがスロースパークやソリューションに書き込まれます

問題の説明:

で、処理の結果をスパークを使用してredisデータを書き込む際、次の例外がスローされます。

Exception in thread "main" org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 4.0 failed 1 times, most recent failure: Lost task 0.0 in stage 4.0 (TID 6, localhost, executor driver): redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out:
ここに画像を挿入説明

問題の原因:

その後、テストの後、私たちは創造のためことがわかったredisため、プロパティに直接接続されている場合は、接続を定義するredis是单例と同時に、シングルトンクラスのプロパティ上の単一の接続は、複数のスレッドを使用している、確かではない;、同時サポートしていませんの可能。
ここに画像を挿入説明
ここに画像を挿入説明

ソリューション:

使每个线程都获取一条连接

//定义redis写入的单例类。
package com.baizhi

import redis.clients.jedis.{Jedis, JedisPool, JedisPoolConfig}

object RedisSink {
  //JedisPoolConfig -> JedisPool -> jedis

  private var jedisPool = createJedisPool()
 /* private  val jedis = jedisPool.getResource() *///获取的是同一条连接 (放到此处,失败)


  def createJedisPool():JedisPool={
    //连接池相关参数的配置
    val poolConf = new JedisPoolConfig
    poolConf.setMaxTotal(6) //设置最大连接数
    //创建连接池对象
    val pool =new JedisPool(poolConf,"hbase")
    return pool
  }

  //写入redis
  def writeToRedis(key:String,value:String): Unit ={
    val jedis = jedisPool.getResource() //获取一条连接 (放到此处,成功)
    jedis.select(0) //选择第0号库
    jedis.set(key,value) //放入key - value
    jedis.close()  //归还连接
  }

  //监控JVM退出,如果JVM退出系统回调该⽅法
  Runtime.getRuntime.addShutdownHook(new Thread(new Runnable {
    override def run(): Unit = {
      println("连接池资源回收启动")
      jedisPool.close()

    }
  }))

}

//测试
package com.baizhi
import org.apache.spark.{SparkConf, SparkContext}

object DataToRedis {
  def main(args: Array[String]): Unit = {

    //创建SparkContext
    val conf = new SparkConf()
      .setMaster("local[*]")
      .setAppName("DataToRedis")
    val sc = new SparkContext(conf)

    //创建RDD,并执行转换操作
    sc.textFile("hdfs://hbase:9000/zyl.log") .flatMap(_.split("\\s+"))
      .map((_,1))
      .reduceByKey(_+_) .sortBy(_._2,true) .foreach(vs=>{
        var key = vs._1   //获取元素的key
        var value = vs._2.toString //获取元素的value
        RedisSink.writeToRedis(key,value) //向redis 写入数据
    })

    //关闭sc
    sc.stop()
  }
}

公開された32元の記事 ウォンの賞賛1 ビュー1177

おすすめ

転載: blog.csdn.net/ASYMUXUE/article/details/104432658