我目前正在使用 vscode 的远程容器扩展和.devcontainer.json指向我的docker-compose.yml文件的文件。
一切正常,我的 docker-compose start 命令开始运行(启动 Web 服务器),但我还没有找到一种方法来快速查看来自 Web 服务器的日志。有没有人找到一种方法来在 vscode 连接到远程容器后自动查看 docker 日志输出?
我知道作为替代方案,我可以删除容器的启动命令,并且在 vscode 连接后,手动打开终端并启动 Web 服务器,但我希望有更简单的方法。
提前致谢!
尽管我正在使用withWatermark(),但是当我运行我的spark工作时,我收到以下错误消息:
线程"main"中的异常org.apache.spark.sql.AnalysisException:当没有水印的流式DataFrames/DataSets上有流式聚合时,不支持追加输出模式;;
从我在编程指南中看到的内容,这与预期用法(和示例代码)完全匹配.有谁知道什么可能是错的?
提前致谢!
相关代码(Java 8,Spark 2.2.0):
StructType logSchema = new StructType()
.add("timestamp", TimestampType)
.add("key", IntegerType)
.add("val", IntegerType);
Dataset<Row> kafka = spark
.readStream()
.format("kafka")
.option("kafka.bootstrap.servers", brokers)
.option("subscribe", topics)
.load();
Dataset<Row> parsed = kafka
.select(from_json(col("value").cast("string"), logSchema).alias("parsed_value"))
.select("parsed_value.*");
Dataset<Row> tenSecondCounts = parsed
.withWatermark("timestamp", "10 minutes")
.groupBy(
parsed.col("key"),
window(parsed.col("timestamp"), "1 day"))
.count();
StreamingQuery query = tenSecondCounts
.writeStream()
.trigger(Trigger.ProcessingTime("10 seconds"))
.outputMode("append")
.format("console")
.option("truncate", false)
.start();
Run Code Online (Sandbox Code Playgroud) 编程指南说结构化流媒体使用适当的源/接收器确保端到端的语义.
但是,当作业崩溃并且我们应用了水印时,我不理解它是如何工作的.
下面是我目前想象它如何工作的一个例子,请纠正我在任何我误解的点.提前致谢!
例:
Spark Job:每1小时窗口计数#个事件,1个小时的水印.
消息:
我们开始工作,从源头读取A,B,C,并在我们将它们写入我们的接收器之前的上午10:30崩溃.
下午6点,作业恢复正常,并且知道使用保存的检查点/ WAL重新处理A,B,C.10-11am窗口的最终计数为3.
接下来,它并行读取来自Kafka,X,Y,Z的新消息,因为它们属于不同的分区.首先处理Z,因此最大事件时间戳设置为晚上8点.当作业读取X和Y时,它们现在位于水印之后(晚上8点 - 1小时=晚上7点),因此它们将作为旧数据丢弃.最终计数是1到8-9pm,并且该作业没有报告12-1pm窗口的任何内容.我们丢失了X和Y的数据.
---结束例子---
这种情况准确吗?如果是这样,1小时水印可能足以处理从Kafka-Sspark正常流动时的延迟/无序数据,但是当火花作业停止/ Kafka连接长时间丢失时则不会.避免数据丢失的唯一选择是使用比您预期的工作更长的水印吗?
似乎在定义行为时,您必须在@callback定义中包含类型规范.然后,当您采用该行为时,编译器要求function_name/arity已定义,但如果您不遵循类型规范,则非常高兴.
我的问题是:
@callback一对类型规格与检查function_name/arity定义的实际功能类型?这使得很难理解什么是文档以及什么是核心功能.Elixir的其余部分似乎清楚地将两者分开,保持类型规格作为可选添加.例如:
如果省略类型规范,则会出现编译错误
defmodule Greeting do
@callback hello(person)
end
# (CompileError) iex:82: type specification missing return type: hello(person)
Run Code Online (Sandbox Code Playgroud)
为了使编译器满意,我们必须包含类型规范:
defmodule Greeting do
@callback hello(%Person{}) :: {:ok, String.t} | {:error, String.t}
end
Run Code Online (Sandbox Code Playgroud)
现在,当我们采用该行为时,编译器会检查function_name/arity已定义的内容:
defmodule WesternGreeting do
@behaviour Greeting
def hello(), do: "Howdy"
end
# warning: undefined behaviour function hello/1 (for behaviour Greeting)
Run Code Online (Sandbox Code Playgroud)
但是编译器会忽略@callback中的所有类型规范:
defmodule WesternGreeting2 do
@behaviour Greeting
def hello([a, b, c]), do: a <> b <> c …Run Code Online (Sandbox Code Playgroud) apache-spark ×2
apache-kafka ×1
behavior ×1
docker ×1
elixir ×1
java ×1
logging ×1
module ×1
types ×1