这是我的 bash 脚本,用于与 clickhouse 并行插入镶木地板。它一直给我我在标题中输入的错误,但我不知道为什么。任何帮助表示赞赏
#!/bin/bash
time (for FILENAME in /mnt/sdc/traces/part-*.snappy.parquet; do
echo $FILENAME
xargs -P 6 -n 1 -0 clickhouse-client --receive_timeout=100000 --query=\"INSERT INTO ethereum.traces FORMAT Parquet\" < $FILENAME
done)
一种实现方式如下:
#!/bin/bash
cpu_count=6
batch_size=4
printf '%s\0' /mnt/sdc/traces/part-*.snappy.parquet |
xargs -P"$cpu_count" -n"$batch_size" -0 sh -c '
for filename in "$@"; do
echo "$filename"
clickhouse-client --receive_timeout=100000 --query="INSERT INTO ethereum.traces FORMAT Parquet" <"$filename"
done
' _
xargs
要求其标准输入是要传递给它调用的程序的参数列表。在您的原始代码中根本不是这种情况,它直接在其标准输入上传递 xargs 实木复合地板文件——而在这里,我们传递它一个 NUL 分隔的实木复合地板文件名称列表。-n
的xargs
参数告诉它有多少文件要传递给sh
的每个副本。使用像 1 这样的小数字可以减少当剩余文件数低于批处理大小时无法很好地并行化的机会,但会增加启动新 shell 的性能开销。在这两个双引号前面不加反斜杠试试。