package com.digitalevers.random.clicks
///模拟点击行为
//给出一个总的点击数量 比如100000点击一天
//然后模拟拆解出随机分布在每分钟内点击数 将其存入一个长度为 24 * 60 的数组中
object ArrayTest {
val unit = 60
val timeLength = 24 /// hours
val baseLimit = 5 //基准极限 进入递归过程的增减幅度
val clicks: Array[Int] = new Array[Int](unit * timeLength)
var totalAmount = 0
def main(args: Array[String]): Unit = {
totalAmount = scala.io.StdIn.readInt()
randomProcess(totalAmount, baseLimit)
printf("" + clicks.sum)
}
def randomProcess(srcData: Int, baseLimit: Int): Unit = {
val perMin = (srcData / (unit * timeLength)).toInt
////////////////////////////
if (perMin <= 0) {
val sliceMount = Math.abs(srcData / baseLimit).toInt
for (i <- 1 to sliceMount) {
val index = util.Random.nextInt(unit * timeLength)
if (srcData < 0) {
//压缩数据 (做出判断防止出现负数)
if ((clicks(index) - baseLimit) >= 0) {
clicks(index) -= baseLimit
}
} else {
//增加数据
clicks(index) += baseLimit
}
}
} else {
for (i <- 0 until (unit * timeLength)) {
clicks(i) = util.Random.nextInt((perMin * 2 + 1))
}
}
///////////////
if (totalAmount != clicks.sum) {
if (totalAmount - clicks.sum > baseLimit || totalAmount - clicks.sum < -baseLimit) {
//继续递归过程
randomProcess(totalAmount - clicks.sum, baseLimit)
} else {
randomProcess(totalAmount - clicks.sum, 1)
}
}
}
/////////end process
}
Failed to locate the winutils binary in the hadoop binary path 问题
Windows环境下会出现这样的提示。Linux则不会——我只知道有这样的现象,目前还不知道为何会这样
使用的sbt构建的项目,sbt配置如下
name := "sbt"
version := "0.1"
scalaVersion := "2.12.9"
libraryDependencies ++= Seq(
"com.fasterxml.jackson.core" % "jackson-annotations" % "2.11.0",
"org.apache.spark" %% "spark-core" % "3.0.0",
"org.apache.spark" %% "spark-sql" % "3.0.0",
"org.apache.spark" %% "spark-streaming" % "3.0.0",
"org.apache.spark" %% "spark-streaming-kafka-0-10-assembly" % "2.4.3",
"mysql" % "mysql-connector-java" % "8.0.20",
"org.apache.kafka" % "kafka-clients" % "2.5.0",
"com.alibaba" % "fastjson" % "1.2.71"
)
spark样例代码
package _2020_07_25
import org.apache.spark.{SparkConf, SparkContext}
object sparkDemo {
def main(args: Array[String]): Unit = {
val sparkconf = new SparkConf().setMaster("local").setAppName("wordCount")
val sc = new SparkContext(sparkconf)
printf("init ok ")
}
}
运行后报出
Failed to locate the winutils binary in the hadoop binary path
的警告提示,解决的办法就是配置一下Windows的HADOOP_HOME环境变量,步骤如下
在 https://github.com/srccodes/hadoop-common-2.2.0-bin 下载该项目的zip包,将其解压到某个指定的目录,比如
C:\Users\Administrator\IdeaProjects\hadoop-common-2.2.0-bin-master (C:\Users\Administrator\IdeaProjects是我的IDEA的工程目录)
新建一个系统环境变量为HADOOP_HOME,将其设置为 C:\Users\Administrator\IdeaProjects\hadoop-common-2.2.0-bin-master 注意不要包含bin目录(它会自动加上bin目录,加上反而会出错)
重启IDEA,该警告提示消失。
参考:https://blog.csdn.net/lepton126/article/details/85987197
https://blog.csdn.net/MASILEJFOAISEGJIAE/article/details/89281982
日常的开发工作中,经常会遇到诸如发送一封邮件这样比较耗时的业务需求,用户往往需要等邮件发送完毕才能进行下一步动作,整个业务流程被发送邮件这个耗时的动作阻塞了,这时往往需要解耦业务,即把耗时的作业单独剥离出去,用户无需等待处理结果,服务端会直接返回,以便用户下一步操作,而剥离出去的业务会单独在另一个子系统慢慢运行。
有很多队列式的产品来解耦业务需求,但是如果你的系统中已经部署了Redis,并且业务量不是很大的话可以尝试使用Redis的发布订阅模式来满足你的需要,但是要十分注意的是,如果你的业务量较大,并且数据产生的速率很快,数据消耗的速度赶不上数据产生速度的话,最好是采用专业的消息队列产品来实现(比如activeMq,rocketMq等)。
因为笔者发现Redis的消息堆积的天花板上限很低,稍不留神就会溢出,然后会自动断开消费客户端的连接,造成消费进程假死(即使进程没有被关闭,也依旧不再消费数据),并且Redis也十分缺乏对此类业务的监控工具,造成运维难度直线式上升。——故如果在有其他可选项的情况下,不要轻易在生产服务上部署这种方案,这里仅作为技术层面作一介绍
Redis的发布订阅模式可以简单分为发布数据端(生产者)和订阅数据端(消费者)两部分,发布侧写入数据到称为“频道”的数据通道中之后便会立即返回,然后订阅侧在监控到有数据产生后,便会拿到这个数据进行下一步的业务操作。这里使用php作为实现语言来对这一功能进行说明
<?php
/** 消费者代码 **/
set_time_limit(0);
ini_set('default_socket_timeout', -1); //保持连接
$redis = new Redis();
$redis->connect('127.0.0.1',6379);
$result = $redis->auth('password');
//var_dump($result);
$redis->subscribe(array('channel'),function($instance, $channelName, $message){
if($channelName == 'channel'){
callback($message);
}
});
?>
<?php
/** 生产者代码 **/
$redis = new Redis();
$result = $redis->connect('127.0.0.1',6379);
$result = $redis->publish('channel','hi Redis');
dump($result);
?>
近期评论