1.需要加上转义字符
java.util.regex.PatternSyntaxException: Unclosed character class near index 0
java.util.regex.PatternSyntaxException: Unexpected internal error near index 1
2.kafka中数据还没来得及消费,数据就已经丢失或者过期了;就是kafka的topic的offset超过range了,可能是maxratePerPartition的值设定小了 [https://blog.csdn.net/yxgxy270187133/article/details/53666760]
org.apache.kafka.clients.consumer.OffsetOutOfRangeException: Offsets out of range with no configured reset policy for partitions: {newsfeed-100-content-docidlog-1=103944288}
3.内存参数太小 --executor-memory 8G --driver-memory 8G
Application application_1547156777102_0243 failed 2 times due to AM Container for appattempt_1547156777102_0243_000002 exited with exitCode: -104
For more detailed output, check the application tracking page:https://host-10-31-4-246:26001/cluster/app/application_1547156777102_0243 Then click on links to logs of each attempt.
Diagnostics: Container [pid=5064,containerID=container_e62_1547156777102_0243_02_000001] is running beyond physical memory limits. Current usage: 4.6 GB of 4.5 GB physical memory used; 6.3 GB of 22.5 GB virtual memory used. Killing container.
4.方法调用在方法定义之后
forward reference extends over definition of value xxx
*******************************************************************
https://blog.csdn.net/appleyuchi/article/details/81633335
pom中的provided指的是编译需要,发布不需要,当我们通过spark-submit提交时,spark会提供需要的streaming包,而Intellij是通过java提交的,在运行时依然需要streaming的包,所以需要去掉.
1.解决方案:本地运行时注销掉<scope>provided</scope>,reimport maven projects
java.lang.ClassNotFoundException: org.apache.spark.SparkConf
2.
[ERROR] E:git3_commit2NewsfeedNewsfeedsrcmainscalacomhuawei
cm
ewsfeed
extcontentwordToVecDocUser.scala:206: error: No org.json4s.Formats found. Try
to bring an instance of org.json4s.Formats in scope or use the org.json4s.Defau
ltFormats.
[INFO] val str = write(map)
添加
implicit val formats: DefaultFormats = DefaultFormats
3.
https://stackoverflow.com/questions/30033043/hadoop-job-fails-resource-manager-doesnt-recognize-attemptid/30391973#30391973
*******************************************************************
如何在IDEA 中使用Git
https://www.cnblogs.com/zbw911/p/6206689.html
*******************************************************************
(1)连接zk
cd /opt/FIC70_client/ZooKeeper/zookeeper/bin
./zkCli.sh -timeout 5000 -r -server 172.16.16.159:24002 (中间以,分割)
./zkCli.sh -timeout 5000 -r -server 10.31.7.209:24002
(2)断点续传的kafka能力
读取kafka的topic offset失败,导致contenanalysis启动失败。 或者是读取的偏移量与实际的不符,故去kafka时获取offset失败,或者offset的值错误。 需要重建offset。
通过zookeeper查询对应组id下的topic是存在
zkCli.sh --server 10.73.80.4:24002 zookeeper的地址端口通过配置文件可以查询, cd $KAFKA_HOME/conf cat server.propertes | grep "^zookeeper.connect"
通过ls命令查询对应的grounpid下的topic是否是否存在,或者offset是否存在 ls /consumers/[grounpid]/offsets/
如果不存在,可以考虑重建topic 或者手动添加topic偏移量
create /consumers/[grounpid]/offsets/[topic]/[partition]/[offsetvalue]
(3)ls命令
在ZK上运行ls /consumers/对应的分组/offset/对应的topic,就可以看到此topic下的所有分区了
ls /consumers/Newsfeed.Entertainment.ContentAnalysis/offsets/newsfeed-100-contentdistribute-entertainment
(4)删除zk目录
rmr /consumers/Newsfeed.Entertainment.ContentAnalysis/offsets/newsfeed-100-contentdistribute-entertainment
deleteall /consumers/Newsfeed.Entertainment.ContentAnalysis/offsets/newsfeed-100-contentdistribute-entertainment
(5)get命令
get /consumers/对应的分组/offset/对应的topic/对应的分区号,可以查询到该分区上记录的offset
(6)set命令
set /consumers/对应的分组/offset/对应的topic/对应的分区号 修改后的值(一般为0),即可完成对offset的修
*******************************************************************
Applicatiion: 应用程序
Driver: 表示main()函数,创建SparkContext
Executor:
Worker: 集群中可以运行Application代码的节点.在Standalone模式中指的是通过slave文件配置的worker节点,在Spark on Yarn模式中指的就是NodeManager节点
Task:在Executor进程中执行任务的工作单元,多个Task组成一个Stage
Job:包含多个Task组成的并行计算,是由Action行为触发的
spark运行流程:
(1)构建Spark Application的运行环境(启动SparkContext),SparkContext向资源管理器(可以是Standalone、Mesos或YARN)注册并申请运行Executor资源;
(2)资源管理器分配Executor资源并启动StandaloneExecutorBackend,Executor运行情况将随着心跳发送到资源管理器上;
(3)SparkContext构建成DAG图,将DAG图分解成Stage,并把Taskset发送给Task Scheduler。Executor向SparkContext申请Task
(4)Task Scheduler将Task发放给Executor运行同时SparkContext将应用程序代码发放给Executor
(5)Task在Executor上运行,运行完毕释放所有资源
*******************************************************************
1.Spark和Hadoop
Hadoop的两个核心模块:分布式存储模块HDFS,分布式计算模块Mapreduce
Spark主要是在计算模块取代了Mapreduce,存储模块还是基于hadoop的HDFS
2. RDD(Resilient Distributed Dataset)弹性分布式数据集
Spark中的RDD是一个不可变的分布式对象集合,有五大特性:
①有一个分片列表。就是能被切分,和hadoop一样的,能够切分的数据才能并行计算。
②有一个函数计算每一个分片,这里指的是下面会提到的compute函数。
③对其他的RDD的依赖列表,依赖还具体分为宽依赖和窄依赖,但并不是所有的RDD都有依赖。
④可选:key-value型的RDD是根据哈希来分区的,类似于mapreduce当中的Paritioner接口,控制key分到哪个reduce。
⑤可选:每一个分片的优先计算位置(preferred locations),比如HDFS的block的所在位置应该是优先计算的位置。(存储的是一个表,可以将处理的分区“本地化”)
3.RDD两种创建方式:
①(常用)读取外部数据集:
val rdd1=sc.textFile("/path/to/readme.md")
②在驱动程序中对另一个集合并行化:
val rdd2=sc.parallelize(List("apple","banana","orange"))
注:一般在开发原型或测试时才使用
4.Spark程序或shell会话工作流程
①从外部数据创建出输入RDD;
②使用诸如filter()等这样的转化操作对RDD进行转化,以定义新的RDD;
③告诉Spark对需要被重用的中间结果RDD执行persist()操作;
④ 使用诸如first()等这样的行动操作来触发一次并行计算,Spark会对计算进行优化后再执行。
5.RDD操作:
3.1获取RDD
①从共享的文件系统获取(如:HDFS)
②通过已存在的RDD转换 ③将已存在scala集合(只要是Seq对象)并行化,通过调用SparkContext的parallelize方法实现 ④改变现有RDD的之久性;RDD是懒散,短暂的。(RDD的固化:cache缓存至内错;save保存到分布式文件系统)
3.2.转化操作(返回一个新的RDD)
① map(func)
返回一个新的分布式数据集,由每个原元素经过func函数转换后组成
②filter(func)
返回一个新的数据集,由经过func函数后返回值为true的原元素组成
③flatMap(func) 类似于map,但是每一个输入元素,会被映射为0到多个输出元素(因此,func函数的返回值是一个Seq,而不是单一元素)
④sample(withReplacement, frac, seed)
根据给定的随机种子seed,随机抽样出数量为frac的数据
⑤union(other)
返回一个新的数据集,由原数据集和参数联合而成
⑥groupByKey([numTasks]) 在一个由(K,V)对组成的数据集上调用,返回一个(K,Seq[V])对的数据集。注意:默认情况下,使用8个并行任务进行分组,你可以传入numTask可选参数,根据数据量设置不同数目的Task
⑦reduceByKey(func, [numTasks]) 在一个(K,V)对的数据集上使用,返回一个(K,V)对的数据集,key相同的值,都被使用指定的reduce函数聚合到一起。和groupbykey类似,任务的个数是可以通过第二个可选参数来配置的。
⑧join(otherDataset, [numTasks]) 在类型为(K,V)和(K,W)类型的数据集上调用,返回一个(K,(V,W))对,每个key中的所有元素都在一起的数据集
⑨groupWith(otherDataset, [numTasks])
在类型为(K,V)和(K,W)类型的数据集上调用,返回一个数据集,组成元素为(K, Seq[V], Seq[W]) Tuples。这个操作在其它框架,称为CoGroup
⑩cartesian(otherDataset)
笛卡尔积。但在数据集T和U上调用时,返回一个(T,U)对的数据集,所有元素交互进行笛卡尔积。
3.3.行动操作(向驱动器程序返回结果或把结果写入外部系统的操作)
①reduce(func) 通过函数func聚集数据集中的所有元素。Func函数接受2个参数,返回一个值。这个函数必须是关联性的,确保可以被正确的并发执行
②collect() 在Driver的程序中,以数组的形式,返回数据集的所有元素。这通常会在使用filter或者其它操作后,返回一个足够小的数据子集再使用,直接将整个RDD集Collect返回,很可能会让Driver程序OOM
③count() 返回数据集的元素个数
④take(n) 返回一个数组,由数据集的前n个元素组成。注意,这个操作目前并非在多个节点上,并行执行,而是Driver程序所在机器,单机计算所有的元素(Gateway的内存压力会增大,需要谨慎使用)
⑤first() 返回数据集的第一个元素(类似于take(1)
⑥saveAsTextFile(path) 将数据集的元素,以textfile的形式,保存到本地文件系统,hdfs或者任何其它hadoop支持的文件系统。Spark将会调用每个元素的toString方法,并将它转换为文件中的一行文本
⑦saveAsSequenceFile(path) 将数据集的元素,以sequencefile的格式,保存到指定的目录下,本地系统,hdfs或者任何其它hadoop支持的文件系统。RDD的元素必须由key-value对组成,并都实现了Hadoop的Writable接口,或隐式可以转换为Writable(Spark包括了基本类型的转换,例如Int,Double,String等等)
⑧foreach(func) 在数据集的每一个元素上,运行函数func。这通常用于更新一个累加器变量,或者和外部存储系统做交互
[注:惰性求值:RDD的转化操作是惰性求值的,即在被调用行动操作之前Spark不会开始计算]
常用术语:
①Application:用户编写的Spark应用程序,其中包括一个Driver功能的代码和分布在集群中多个节点上运行的Executor代码
②Driver: 运行Application的main函数并创建SparkContext,创建SparkContext的目的是为了准备Spark应用程序的运行环境,在Spark中有SparkContext负责与ClusterManager通信,进行资源申请、任务的分配和监控等,当Executor部分运行完毕后,Driver同时负责将SparkContext关闭,通常用SparkContext代表Driver
③Executor:
④Cluter Manager:
⑤Worker:
⑥Task:
⑦Job:
⑧Stage:
⑨DAGScheduler