Storm+Kafka+Redis+zookeeper docker集群实战问题与解决

目录

引言

问题与解决


引言

        下面的错误主要是在完成大数据展屏时遇到的一些报错,从最开始的storm构建rowkey,hbase实现统计到storm直接统计redis存结果,第一种方式是参考的一本storm实战书籍,但是老师说这种方法无法发挥storm的并行计算的优势,遇到换到了第二种方法,使用多个并行的bolt来实现不同的任务统计,下面介绍的一些报错,希望能帮助到你,欢迎留言讨论。

问题与解决

1、ConcurrentModificationException

        问题描述:在bolt1中向bolt2 emit 数据的时候,由于是高并发运行,并且发送的map数据在bolt1与bolt2是共享的,所有会出现bolt1中修改数据的同时,bolt2正在访问数据,此时就引起异常。

        解决方案:因为统计任务主要考map数据结构实现,所以通过map实现核心任务的思路不能便,那么则考虑在bolt1中对map进行一个拷贝,对其创建一个副本,而后将副本提交给bolt2,但是这样可能会使bolt的处理速度降低。

2、Storm:ERROR o.a.s.util - Halting process: ("Worker died")

        问题描述:在storm中出现halting process是很经常的,一般来说它不会单独存在,都是因为一些其他的错误而引起的。

        解决方案:仔细查看控制台输出的错误信息,根据错误信息进行分析。

3、redis.clients.jedis.exceptions.JedisConnectionException java.net.SocketException: Connection reset

        问题描述:出现这个报错多是对jedis的localhost配置的时候没有正确配置ip和port,有时候也可能是redis设置了密码,在配置连接密码的时候没有设置正确

        解决方案:首先进入redis的cli中执行一些基础的命令查看redis是否正常运行,然后检查部署redis的ip和端口。

4、时间窗口使用List<Long>,对其排序时sort与reverse搞反了

        问题描述:项目中使用一个队列来记录数据的time,没有搞清楚reverse与sort,sort默认是对其进行排序,reverse是对现有顺序进行逆转。

5、设置时间窗口应该判断 >= 而不是 `>`从而导致累积了三倍交易量

        问题描述:该问题主要是因为读取提供的数据集的time是保留到分钟,而刚好又是要求累计分钟,所以通过时间窗口尾部时间减去头部时间仅会在距离窗口头部时间相差两分钟的时候才能够将大于1分钟通过。

6、kafka读取数据,发送后storm消费后不确认

        问题描述:正常情况下storm消费kafka发送的数据,会自动设置一个偏移量以记录消费的消息,但是有时候bolt变多,并发性提高使用默认的配置不能满足新的要求,就会出现这样的情况。

        解决方案:本项目遇到这个问题是生产者和消费者搭配错了导致的,也就是需要消费的topic没有对上,导致重启topology就一直重复消耗之前的topic。

7、时间处理异常,返回为空会导致storm程序异常

8、读取数据文件,使用FileReader默认使用系统编码格式导致中文乱码,使用InputStreamReader( new FileInputStream(filePath), StandardCharsets.UTF_8)

        问题描述:读取模拟器生成的文件时,由于文件是从windows传输到linux的,如果不将文件的格式转换为utf-8,linux便无法识别中文

        解决方案:提供的文件为gbk,需要使用iconv转换成utf-8

9、redis取值未配置序列化,导致通过key取得的所有值都为null

        问题描述:由于redis中存储的值为普通字符串,如果使用RedisTemplate,则会默认使用jdk的反序列化方式取值,但是这并不适用于我们存储的数据的方式.

        解决方案:针对字符串需要使用到stringserializer在读取的时候将value以字符串的方式反序列化

10、序列化与反序列化不匹配,存入redis的时候用object.toString(),导致jackson的api无法解析

        问题描述:对于全国各地用户下单量,使用到了一个列表字典来存储,然后将这个存储多个和字典的列表转化为字符串,但使用的是toString,这种方式导致取该value的时候对value进行反序列化时,而无法解析。

        解决方案:使用后再将value存入redis,此时候就要将value也进行序列化,主要是通过jackson库的outputcollector类的writeValueAsString方式来存储多个字典的列表转化为字符串,当需要使用的时候,同样也通过该库,并传入字段对象实现反序列化

11、未给StockTotalPriceRank类配置setter、getter方法,导致使用objectMapper.readValue的时候无法获取到类中的属性

12、vue3 使用reactive使得变量无法被修改,更换为ref

        分析:ref主要是创建number、string等简单数据类型的变量,而reactive则能够创建各种复杂的数据结构,变量不能被修改,但是其内部的属性可以被修改

13、chart组建无法自适应响应式属性,需要将其定义为计算属性

14、ref变量需要使用value来修改其值

15、在使用地图组建的时候,series放在geo里面导致数据不显示

        问题描述:使用echarts构建地图的时候,由于初次持用到该组建,对其语法不熟悉,正常情况下geo和series应该是同级,但是却把series,写进了geo里

16、使用echarts制作地图时,虽然正确这是echarts的series为请求数据的值,但是echarts并不能动态更新显示的数据,因为echarts本身并不不能动态响应数据变化的功能。

        解决方案

        (1)、如何option未被函数包裹可以将option设置计算属性,这样与它相关联的操作会在数据被更新的时候再次执行

        (2)、如果option被函数包裹,例如本例中使用到的地图绘制函数,那么就需要在数据返回时再次设置series

17、由于创建了12个bolt来处理不同的任务,导致topology在local cluster环境下无法快速运行,也就是各个bolt之间无法合理的利用资源来进行计算

        解决方案:通过查看资料,发现storm的topology运行通过创建worker,work即一个进程,而后该work创建executor来处理spout或bolt,而spout和bolt代码的处理则需要executor再创建task来执行。出现上面的问题是默认配置情况下导致的,根据topology执行的理论考虑增大worker数量为6与cpu核心数相同,同时增大spout的平行度为8,由于每个bolt进行的统计任务复杂度较低,便使用默认的并行度和task数,还有一个原因则是笔记本的内存只有16GB,前面提到的配置正常需要22GB的内存,后来将程序放在32GB内存10核心的台式机上跑,便能够正常运行

18、Local Server connection should not send BackPressure status

        问题描述:出现该报错的原因是我设置spout的parallelisHint为8,导致大量的message从spout发送给bolt,但是bolt的处理跟不上,便出现了反压

        解决方案:通过调整setMaxSpoutPending即扩大spout的缓存来解决,正常来说spoutpending等于spout*1000,所以我设置了8000

19、MVN打包报错:在类路径或引导类路径中找不到程序包 java.lang

        解决方案:

        pom.xml中加入:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>2.3.2</version>
    <configuration>
        <source>1.8</source>
        <target>1.8</target>
        <encoding>UTF-8</encoding>
        <compilerArguments>
            <!--Maven打包时,不会导入JDK内部的依赖(JDK属于部署的环境,不属于外部的三方依赖)-->
            <bootclasspath>${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/jre/lib/jce.jar</bootclasspath>
        </compilerArguments>
    </configuration>
</plugin>

20、程序包 com.sun.xml.internal.ws.client.BindingProviderProperties 不存在

        问题描述:这个问题是承接第19个问题的,在linux环境下分割符要使用":"

        解决方案:将`;`改为`:`

21、Found multiple defaults.yaml resources. You're probably bundling the Storm jars with your topology jar. [jar:file:/opt/run/storm-demo-1.0-SNAPSHOT-jar-with-dependencies.jar!/defaults.yaml

        问题描述:未将storm-core设置未provide,因为storm集群中已经包含storm-core

22、无法解析 jdk.tools:jdk.tools:1.6

        解决方案:更换项目的jdk

23、Error: Could not find or load main class org.example.TopologyForStock
Caused by: java.lang.ClassNotFoundException: org.example.TopologyForStock

        解决方案:由于之前的storm模块是在一个父模块,打包后出现上面的错误,虽然TopologyForStock确实在org.example但是我猜想可能是打包的时候把其他的模块也打入进入了,其他模块中也有org.example导致了找不到,还有一可能就是需要在一个package包裹topology及其使用到的类

24、Error on initialization of server mk-worker

        问题描述:将topology打包后提交到集群中运行,刚开始的使用认为将拓扑提交到docker集群需要更改本地测试时使用配置的bootstrapservers,因为有一个想法就是dokcer容器无法主动访问主机的ip,也是因为这个原因导致提交拓扑的时候耗费了大量的时间,实际上docker内的程序是能够访问到集群的

        解决方案:storm端的bootstrapservers设置不正确,应该和kafka生产者的配置相同

25、IllegalArgumentException: bufferSize must be a power of 2

        与24关联的错误

26、java.lang.RuntimeException: java.lang.IllegalArgumentException: Class is not registered: java.util.LinkedList Note: To register this class use: kryo.register(java.util.LinkedList.class); 

        问题描述:storm默认使用kryo进行序列化,但是LinkedList并未被注册,所以需要使用conf对其进行注册,这个报错在网上非常少,storm中注册了一些常用的数据结构,但是我所使用到的如LinkedList、ConcurrentLinkedDeque这样数据结构是没有被storm注册的,所以需要手动设置

        解决方案:Config conf = new Config(); conf.registerSerialization(LinkedList.class);

27、could not create the Java Virtual Machine Error:A fatal exception has occured.Program will exit

        问题描述:使用storm2.X及以上,镜像使用的是jdk11,topology提交到storm集群中就显示无法创建java虚拟机,然后使用1.2.2,但是使用1.2.2出现了supervisor启动后10s便退出(同样的配置下)

        解决方案:尝试1.2.4,解决了两个问题。

28、10:43:18.988 [timer] ERROR o.a.s.s.EvenScheduler - No available slots for topology: test1 config.setNumAckers(8);

        问题描述:config.setNumWorkers(8);调整为6,便正常了,但是我有10个核心,不知道为什么不能设置较搞的numworkders

        解决方案:默认情况下会允许storm使用4个slot,想要设置高NumWork需要修改配置文件增加爱slot的数量

29、halting due to Out Of Memory Error...Netty-server-localhost-6700-worker-13

        问题描述:slot是分配给work的资源单元,由于一个默认值,如果bolt或者spout的并行度设置多大,就会到报该错误

        解决方案:调整配置文件,增加slot的数量

30、Hbase拒绝连接

        问题描述:Caused by: java.net.SocketTimeoutException: callTimeout=60000, callDuration=68581: 拒绝连接 row 'student,,' on table 'hbase:meta' at region=hbase:meta,,1.1588230740, hostname=hbase-region,16020,1701175099822, seqNum=0

        由于废弃的hbase方案所以该问题待解决

31、hbase client 版本不匹配

        问题描述:Caused by: java.lang.IllegalAccessError: tried to access method com.google.common.base.Stopwatch.<init>()V from class org.apache.hadoop.hbase.zookeeper.MetaTableLocator 

        由于废弃的hbase方案所以该问题待解决

32、HBASE-java.lang.IllegalAccessError: tried to access method com.google.common.base.Stopwatch

        解决方案:使用maven中1.2.6版本的hbase storm,网上的解决办法是将1.2.6修改为1.3.0就解决了

猜你喜欢

转载自blog.csdn.net/2201_75875170/article/details/134901433