flink 1.8
从文件系统读取
Flink内置了对以下文件系统的支持:
Filesystem |
Scheme |
Notes |
Hadoop Distributed File System (HDFS) |
hdfs:// |
支持所有HDFS版本 |
Amazon S3 |
s3:// |
通过Hadoop文件系统实现的支持(参见下面) |
MapR file system |
maprfs:// |
用户必须手动将所需的jar文件放在lib/ dir中 |
Alluxio |
alluxio:// |
通过Hadoop文件系统实现的支持(参见下面) |
使用Hadoop文件系统实现
Apache Flink允许用户使用任何实现org.apache.hadoop.fs.FileSystem接口。有Hadoop FileSystem 实现:
要使用带有Flink的Hadoop文件系统,请确保满足以下几点:
Amazon S3
请参阅 Deployment & Operations - Deployment - AWS - S3: Simple Storage Service以获取可用的S3文件系统的实现,其配置和所需的库。
Alluxio
要获得Alluxio支持,请在core-site.xml文件中添加以下配置:
fs.alluxio.impl
alluxio.hadoop.FileSystem
使用Hadoop的Input / OutputFormat打包器连接到其他系统
Apache Flink允许用户使用许多不同的系统作为数据源source或接收器sink。该系统具有非常好的扩展性。与Apache Hadoop类似,Flink也有所谓的InputFormats和OutputFormats的概念。
这些inputformat的一个实现是HadoopInputFormat。这是一个包装器,允许用户使用Flink的所有现有Hadoop输入格式。
本节展示一些将Flink连接到其他系统的示例。在Flink中阅读关于Hadoop兼容性的更多信息Read more about Hadoop compatibility in Flink.。
Flink对Avro格式的支持
Flink对Apache Avro提供了广泛的内置支持。这样可以使用Flink轻松读取Avro文件。此外,Flink的序列化框架能够处理从Avro模式schemas生成的类。确保将Flink Avro依赖jar配置到pom.xml文件中。
org.apache.flink
flink-avro
1.8.0
为了从Avro文件中读取数据,必须指定AvroInputFormat。
Example:
AvroInputFormat users = new AvroInputFormat(in, User.class);
DataSet usersDS = env.createInput(users);
请注意,这User是Avro生成的POJO。Flink还允许执行这些POJO的基于字符串的Keys选择。例如:
usersDS.groupBy("name")
请注意,使用GenericData.RecordFlink也可以使用该类型,但不建议使用。由于记录包含完整的模式schemas,因此其数据密集,因此可能使用起来很慢。
Flink的POJO字段选择也适用于Avro生成的POJO。但是,只有在将字段类型正确写入生成的类时才可以使用。如果字段是类型Object,则不能将该字段用作连接或分组键key。像这样在Avro中指定一个字段{"name": "type_double_test", "type": "double"}可以工作正常,但是将一个字段指定成一个;联合类型UNION-type ({"name": "type_double_test", "type": ["double"]}),它将会生成一个 Object类型的字段。请注意:指定为空类型({"name": "type_double_test", "type": ["null", "double"]},)是可以的。
访问Microsoft Azure表存储
注意:此示例适用于Flink 0.6之后的版本
此示例使用HadoopInputFormat打包器,并使用现有的Hadoop输入来格式实现访问Azure的表存储Azure’s Table Storage。
git clone https://github.com/mooso/azure-tables-hadoop.git
cd azure-tables-hadoop
mvn clean install
使用快速入门demo设置新的Flink项目:
curl https://flink.apache.org/q/quickstart.sh | bash
将以下依赖项(在本
org.apache.flink
flink-hadoop-compatibility_2.11
1.8.0
com.microsoft.hadoop
microsoft-hadoop-azure
0.0.4
flink-hadoop-compatibility是一个Flink jar包,提供Hadoop输入格式打包器。 microsoft-hadoop-azure将我们之前构建的项目添加到我们的项目中。
现在,项目已经准备好,可以开始编写代码了。我们建议将项目导入IDE,如Eclipse或IntelliJ。(作为Maven项目导入)浏览Job.java文件中的代码。这是一个空骨架Flink的工程。
将以下代码粘贴到其中:
import java.util.Map;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.java.DataSet;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.hadoopcompatibility.mapreduce.HadoopInputFormat;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import com.microsoft.hadoop.azure.AzureTableConfiguration;
import com.microsoft.hadoop.azure.AzureTableInputFormat;
import com.microsoft.hadoop.azure.WritableEntity;
import com.microsoft.windowsazure.storage.table.EntityProperty;
public class AzureTableExample {
public static void main(String[] args) throws Exception {
// set up the execution environment
final ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
// create a AzureTableInputFormat, using a Hadoop input format wrapper
HadoopInputFormat hdIf = new HadoopInputFormat(new AzureTableInputFormat(), Text.class, WritableEntity.class, new Job());
// set the Account URI, something like: https://apacheflink.table.core.windows.net
hdIf.getConfiguration().set(AzureTableConfiguration.Keys.ACCOUNT_URI.getKey(), "TODO");
// set the secret storage key here
hdIf.getConfiguration().set(AzureTableConfiguration.Keys.STORAGE_KEY.getKey(), "TODO");
// set the table name here
hdIf.getConfiguration().set(AzureTableConfiguration.Keys.TABLE_NAME.getKey(), "TODO");
DataSet> input = env.createInput(hdIf);
// a little example how to use the data in a mapper.
DataSet fin = input.map(new MapFunction, String>() {
@Override
public String map(Tuple2 arg0) throws Exception {
System.err.println("--------------------------------\nKey = "+arg0.f0);
WritableEntity we = arg0.f1;
for(Map.Entry prop : we.getProperties().entrySet()) {
System.err.println("key="+prop.getKey() + " ; value (asString)="+prop.getValue().getValueAsString());
}
return arg0.f0.toString();
}
});
// emit result (this works only locally)
fin.print();
// execute program
env.execute("Azure Example");
}
}
该示例显示了如何访问Azure表并将数据转换为Flink DataSet(更具体地说,是集合的类型DataSet
Access MongoDB
这个GitHub存储库记录了如何将MongoDB与Apache Flink一起使用(从0.7-incubating开始)。
This GitHub repository documents how to use MongoDB with Apache Flink (starting from 0.7-incubating).
https://ci.apache.org/projects/flink/flink-docs-release-1.8/dev/batch/connectors.html