自动生成HTML工具 (part 6:config 文件读写)

本文介绍如何使用 .NET Framework 进行配置文件(config)的读取和写入操作。包括使用 ConfigurationManager 对象读取配置信息及更新配置文件的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

config 文件 主要是用来记录 配置信息,一般是只读的,如果真的需要配置的时候才手动更改,这样的好处是 防止别人通过程序提供的方法更改配置;

网上有好多config 的例子,一般来说,读本身的配置文件 用 ConfiguationManager.AppSettings["key"] 就可以了

 #region 初始化参数
            
//任务列表 文件
            CreateHelp.Factory.TaskFactory.SaveFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, ConfigurationManager.AppSettings["TaskList"]);

            CreateHelp.Factory.TaskFactory.timeWatch 
= int.Parse(ConfigurationManager.AppSettings["timeWatch"]);

            CreateHelp.Factory.TaskFactory.autoStart 
= bool.Parse(ConfigurationManager.AppSettings["AutoStart"]);
            
#endregion

 

的方法 在网上比较少,一般是通过写xml的方法 去做的,不过.net 2.0以后就提供了方法出来 写config文件了

             // Get the configuration file.
                System.Configuration.Configuration config =
                  ConfigurationManager.OpenExeConfiguration(
"AutoCreateHTML.exe");

                
// Add an Application Setting.
                config.AppSettings.Settings["timeWatch"].Value = CreateHelp.Factory.TaskFactory.timeWatch.ToString();

                
// Save the configuration file.
                config.Save(ConfigurationSaveMode.Modified);

                
// Force a reload of a changed section.
                ConfigurationManager.RefreshSection("appSettings");

ConfigurationManager.RefreshSection("appSettings") 是 刷新自己的config 文件,如果改其他的config文件,这个方法是没有用的。

 

 

<think>我们正在处理用户关于Flink将数据sink到HDFS并生成多种格式ORC文件的问题。用户的问题集中在如何同时生成多种格式的ORC文件上。在Flink中,我们可以使用StreamingFileSink来写入文件到HDFS。但是,StreamingFileSink本身不支持直接写入ORC格式,通常需要借助其他方式。常见的做法是使用Flink的TableAPI/SQL,通过HiveCatalog将数据写入Hive表,而Hive表可以指定为ORC格式。但是,用户要求同时生成多种格式的ORC文件,这可能意味着同一个数据流要写入多个不同格式(例如不同压缩方式、不同版本)的ORC文件。然而,需要澄清的是:ORC文件格式本身是一种列式存储格式,其格式是统一的,通常“多种格式”可能指的是不同的压缩方式(如SNAPPY、ZLIB等)或者不同的表结构(分区方式、列类型等)。但用户的问题中强调“多种格式”,我们理解为用户希望将相同的数据写入多个ORC文件,这些文件可能具有不同的配置(比如不同的压缩格式)或者不同的结构(比如不同的分区方式)。由于Flink的StreamingFileSink不支持直接写入ORC,我们可以考虑以下方案:1.使用Flink的TableAPI,通过Hive方言写入Hive表,并利用Hive的ORC格式支持。但是,一个Sink只能对应一个表,即一种格式配置。2.如果需要多种格式,可以创建多个Sink,即多个TableSink,每个配置不同的ORC属性(比如TBLPROPERTIES中指定不同的压缩方式)或者不同的表结构(不同的分区策略)。另一种思路是使用自定义的SinkFunction,但这需要自行实现ORC文件的写入,较为复杂。因此,我们建议使用多个Table/SQLSink,每个Sink写入一个独立的Hive表(或同一个表的不同分区,但格式配置不同?),每个表可以配置不同的ORC属性。具体步骤:1.创建多个Hive表,每个表使用ORC存储,并在表属性中设置不同的ORC压缩格式(例如,一个表使用'orc.compress'='ZLIB',另一个使用'orc.compress'='SNAPPY')。2.在Flink中,将同一个数据流分别写入到这些不同的表中。注意:Flink的Hive集成要求使用HiveCatalog,并且需要开启Checkpoint以保证Exactly-Once语义。示例步骤:a.创建两个Hive表(假设在Hive中已经存在):表1:table1_orc_zlib(...)STOREDASORCTBLPROPERTIES('orc.compress'='ZLIB');表2:table2_orc_snappy(...)STOREDASORCTBLPROPERTIES('orc.compress'='SNAPPY');b.在FlinkSQL中,将同一个数据流插入到这两个表中。但是,FlinkSQL不支持在一个作业中同时写入多个表(除非使用多个INSERT语句,但FlinkSQL支持多个INSERT,即在一个SQL中写多个INSERTINTO语句)。不过,需要注意的是,这样会创建两个独立的Sink,数据会分别写入两个表。示例代码(FlinkSQL):```sqlINSERTINTOtable1_orc_zlibSELECT...FROMmy_source;INSERTINTOtable2_orc_snappySELECT...FROMmy_source;```或者使用TableAPI:```javaTabletable=...;//源表table.executeInsert("table1_orc_zlib");table.executeInsert("table2_orc_snappy");```但是,这样会启动两个作业?实际上,在Flink中,多个INSERT语句可以在同一个作业中执行,它们共享源,但是有两个独立的Sink。另外,如果用户希望写入同一个表的不同分区(例如按天分区)并且不同分区使用不同的压缩格式,这是不常见的,因为通常一个表的所有分区使用相同的存储格式和压缩格式。如果确实需要,可以在写入时动态设置分区属性,但Hive表的分区属性通常继承自表属性,所以可能需要单独设置每个分区的属性,这比较麻烦。因此,更合理的做法是写入多个表,每个表配置不同的压缩格式。如果用户希望避免重复计算(即同一个数据流计算多次),可以使用Flink的侧输出(sideoutput)或者多次使用同一个源。在TableAPI中,多个INSERT共享同一个源表,所以只会计算一次。但是,如果用户不是指压缩格式,而是指不同的文件结构(比如不同的分区策略),那么同样需要创建多个表,每个表有不同的分区策略。总结:通过创建多个Hive表(每个表配置不同的ORC格式属性)并使用多个Sink写入,可以实现将数据以多种ORC格式写入HDFS。另外,如果用户不想使用Hive表,而是直接写入HDFS路径,并且以不同的ORC格式写入多个路径,那么可能需要自定义Sink。但是,自定义Sink需要实现ORC文件的写入逻辑,这较为复杂,通常不推荐。因此,我们推荐使用Hive表的方式。参考引用:在Flink的官方文档中,提到可以通过HiveCatalog和Hive方言来读写Hive表[^1]。同时,在创建表时可以指定表属性,包括ORC压缩格式等。注意:用户问题中提到的引用[1]是一个WordCount的示例,与当前问题无关,所以我们忽略它。下面我们给出一个完整的示例,包括设置HiveCatalog,创建表环境,以及执行多个插入。假设用户的数据流是来自Kafka的某个主题,我们将其转换为表,然后写入两个不同的Hive表。步骤:1.设置HiveCatalog2.创建表执行环境3.从数据源创建表4.执行两个INSERT语句(分别写入两个不同的Hive表)代码示例(使用FlinkSQL):```java//创建表环境EnvironmentSettingssettings=EnvironmentSettings.newInstance().useBlinkPlanner().build();TableEnvironmenttableEnv=TableEnvironment.create(settings);//配置HiveCatalogStringname="myhive";StringdefaultDatabase="default";StringhiveConfDir="/path/to/hive/conf";//Hive配置文件目录HiveCataloghive=newHiveCatalog(name,defaultDatabase,hiveConfDir);tableEnv.registerCatalog("myhive",hive);tableEnv.useCatalog("myhive");//创建源表(假设是Kafka源)tableEnv.executeSql("CREATETABLEsource_table(\n"+"idINT,\n"+"nameSTRING,\n"+"dtSTRING\n"+")WITH(\n"+"'connector'='kafka',\n"+"...\n"+")");//假设已经存在两个Hive表(在Hive中创建,或者在Flink中创建)//表1:table_orc_zlib,使用ZLIB压缩//表2:table_orc_snappy,使用SNAPPY压缩//执行两个插入tableEnv.executeSql("INSERTINTOtable_orc_zlibSELECTid,name,dtFROMsource_table");tableEnv.executeSql("INSERTINTOtable_orc_snappySELECTid,name,dtFROMsource_table");```注意:在同一个作业中执行多个INSERT语句,Flink会优化为同一个执行计划,共享源。如果用户希望动态指定压缩格式,那么目前ORC文件格式在Hive表中是通过表属性固定的,所以每个表只能有一种压缩格式。因此,多个表是必要的。另外,如果用户希望一个表同时以多种压缩格式存储,这是不支持的,因为一个表只能有一种存储格式(包括压缩格式)。所以,我们只能通过多个表来实现。相关问题:1.如何配置Hive表使用ORC格式和特定的压缩格式?2.在Flink中如何设置HiveCatalog?3.如何确保Flink写入Hive表的事务性(特别是流式写入)?我们将在回答中提供相关信息。注意:用户的问题是关于sink到HDFS的ORC文件,所以我们主要关注如何通过Hive表写入ORC文件。另外,Flink也支持直接使用FileSystem连接器写入文件,但是不支持ORC格式,只支持文本、CSV、Parquet等。因此,使用Hive表是推荐的方式。最后,我们生成相关问题。</think>### Flink Sink HDFS 生成多种格式 ORC 文件的解决方案 在 Apache Flink 中将数据写入 HDFS 并生成多种格式的 ORC 文件,可通过以下两种核心方案实现: --- #### **方案一:使用 `StreamingFileSink` + 自定义 `BulkWriter` (推荐)** 这是最灵活的方式,通过自定义 ORC 格式的写入器实现多格式输出。 ```java import org.apache.flink.orc.writer.OrcBulkWriterFactory; import org.apache.orc.TypeDescription; // 1. 定义不同格式的 ORC 类型描述 TypeDescription format1Schema = TypeDescription.fromString("struct<id:int,name:string>"); TypeDescription format2Schema = TypeDescription.fromString("struct<id:int,value:double,timestamp:bigint>"); // 2. 创建多个 BulkWriterFactory BulkWriterFactory<RowData> writerFactory1 = new OrcBulkWriterFactory<>( new RowDataVectorizer(format1Schema), Properties.builder() .setCompressionStrategy(CompressionStrategy.SNAPPY) // 格式1配置 .build(), new Configuration() ); BulkWriterFactory<RowData> writerFactory2 = new OrcBulkWriterFactory<>( new RowDataVectorizer(format2Schema), Properties.builder() .setCompressionStrategy(CompressionStrategy.ZLIB) // 格式2配置 .build(), new Configuration() ); // 3. 创建多路输出 Sink OutputFileConfig config = OutputFileConfig.builder().build(); StreamingFileSink<RowData> sink1 = StreamingFileSink .forBulkFormat(new Path("hdfs:///output/format1"), writerFactory1) .withBucketCheckInterval(1000) .withOutputFileConfig(config) .build(); StreamingFileSink<RowData> sink2 = StreamingFileSink .forBulkFormat(new Path("hdfs:///output/format2"), writerFactory2) .withBucketCheckInterval(1000) .withOutputFileConfig(config) .build(); // 4. 数据流分路输出 DataStream<RowData> input = ...; // 输入流 input.addSink(sink1).name("ORC-Sink-Format1"); input.addSink(sink2).name("ORC-Sink-Format2"); ``` **关键配置说明**: 1. **格式差异化**:通过不同 `TypeDescription` 定义数据结构 2. **压缩策略**:使用 `CompressionStrategy` 指定不同压缩算法 - `SNAPPY`:高速压缩 - `ZLIB`:高压缩率 - `NONE`:无压缩 3. **文件滚动策略**:通过 `.withBucketCheckInterval()` 控制文件生成频率 4. **HDFS 路径**:不同格式写入独立目录 --- #### **方案二:通过 Flink Table API + Hive Catalog** 适合已集成 Hive 的环境,利用 Hive 表属性控制 ORC 格式。 ```sql -- 创建格式1的Hive表 CREATE TABLE format1_table ( id INT, name STRING ) STORED AS ORC TBLPROPERTIES ( 'orc.compress' = 'SNAPPY', 'orc.create.index' = 'true' ) LOCATION 'hdfs:///output/format1'; -- 创建格式2的Hive表 CREATE TABLE format2_table ( id INT, value DOUBLE, timestamp BIGINT ) STORED AS ORC TBLPROPERTIES ( 'orc.compress' = 'ZLIB', 'orc.bloom.filter.columns' = 'id' ) LOCATION 'hdfs:///output/format2'; -- Flink SQL 双路写入 INSERT INTO format1_table SELECT id, name FROM source_table; INSERT INTO format2_table SELECT id, value, event_time FROM source_table; ``` **表属性说明**: | 属性 | 可选值 | 作用 | |----------------------------|-------------------|------------------------| | `orc.compress` | `SNAPPY`,`ZLIB` | 压缩算法 | | `orc.bloom.filter.columns` | 列名(逗号分隔) | 布隆过滤器加速查询 | | `orc.row.index.stride` | 整数(默认10000) | 行索引间隔 | --- #### **调优建议** 1. **并行度设置**: ```java .setParallelism(4) // 与 HDFS DataNode 数量对齐 ``` 2. **Checkpoint 对齐**: ```java env.enableCheckpointing(60_000); // 1分钟触发文件滚动 ``` 3. **小文件合并**: ```sql ALTER TABLE format1_table CONCATENATE; ``` --- #### **验证输出** 使用 HDFS 命令检查生成的文件: ```bash hdfs dfs -ls hdfs:///output/format1 hdfs dfs -text /output/format1/part-0-0 | head # 查看ORC头信息 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值