我正在Dataproc上运行Spark 2.2作业,我需要访问GCP存储桶中的一堆avro文件。具体来说,我需要直接从存储桶中访问文件(即,首先不要将它们复制/粘贴到主计算机上,这既因为它们可能很大,又出于合规性原因)。
基于此文档中的建议,我正在使用gs://XXX
表示法引用Spark代码中的存储桶:
https://cloud.google.com/dataproc/docs/concepts/connectors/cloud-storage
一切似乎都可行。但是,我反复看到以下警告:
18/08/08 15:42:59 WARN com.google.cloud.hadoop.gcsio.GoogleCloudStorageReadChannel: Channel for 'gs://ff_src_data/trns2.avro' is not open.
18/08/08 15:42:59 WARN com.google.cloud.hadoop.gcsio.GoogleCloudStorageReadChannel: Channel for 'gs://ff_src_data/trns1.avro' is not open.
18/08/08 15:42:59 WARN com.google.cloud.hadoop.gcsio.GoogleCloudStorageReadChannel: Channel for 'gs://ff_src_data/trns3.avro' is not open.
这是一个严重的警告吗?它将对实际性能(速度)产生任何实质性影响,特别是在涉及大量文件的情况下?如果是这样,应该如何解决?还是应该忽略它?
****更新:
这是在Java中生成此代码的最基本代码:
public static void main(String args[]) throws Exception
{
SparkConf spConf = new SparkConf().setAppName("AVRO-TEST-" + UUID.randomUUID().toString());
Master1 master = new Master1(spConf);
master.readSpark("gs://ff_src_data");
}
class Master1
{
private SparkConf m_spConf;
private JavaSparkContext m_jSPContext;
public Master1(SparkConf spConf)
{
m_spConf = spConf;
m_jSPContext = new JavaSparkContext(m_spConf);
}
public void readSpark(String srcDir)
{
SQLContext sqlContext = SQLContext.getOrCreate(JavaSparkContext.toSparkContext(m_jSPContext));
Dataset<Row> trn = sqlContext.read().format("com.databricks.spark.avro").load(srcDir);
trn.printSchema();
trn.show();
List<Row> rows = trn.collectAsList();
for(Row row : rows)
{
System.out.println("Row content [0]:\t" + row.getDouble(0));
}
}
}
目前,这只是一个愚蠢的设置,用于测试直接从GCS Bucket加载大量Avro文件的功能。
还要澄清一下:这是Dataproc Image版本1.2和Spark版本2.2.1
答案 0 :(得分:1)
This warning表示代码已经关闭var path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "CodigoInteligente", "Articulos.xml");
var archivo = new FileInfo(path);
。这是无害的警告消息,但它可能表示在读取文件时代码中对输入流的处理不一致。
您是否可以提供简化的工作版本来重现此警告(越简洁越好)?有了您的这份复制品,我将能够检查这是GCS连接器还是Hadoop / Spark Avro输入格式的问题。
更新: 此警告消息在GCS连接器1.9.10中为removed。