如何配置Flume来收听网络API请求

时间:2017-10-03 14:30:23

标签: hadoop asp.net-web-api hdfs flume flume-ng

我已经构建了一个在IIS服务器上发布的api Web应用程序,我正在尝试配置Apache Flume来监听web api并保存http请求在HDFS中的响应,这是我需要的post方法听:

    [HttpPost]
    public IEnumerable<Data> obtenerValores(arguments arg)
    {
        Random rdm = new Random();

        int ano = arg.ano;
        int rdmInt;
        decimal rdmDecimal;

        int anoActual = DateTime.Now.Year;
        int mesActual = DateTime.Now.Month;

        List<Data> ano_mes_sales = new List<Data>();

        while (ano <= anoActual)
        {
            int mes = 1;
            while ((anoActual == ano && mes <= mesActual) || (ano < anoActual && mes <= 12))
            {
                rdmInt = rdm.Next();
                rdmDecimal = (decimal)rdm.NextDouble();
                Data anoMesSales = new Data(ano, mes,(rdmInt * rdmDecimal));
                ano_mes_sales.Add(anoMesSales);

                mes++;
            }
            ano++;
        }
        return ano_mes_sales;
    }

Flume正在通过VMware虚拟机CentO运行,这是我试图配置水槽来监听该应用程序:

# Sources, channels, and sinks are defined per # agent name, in this case 'tier1'.
a1.sources  = source1
a1.channels = channel1
a1.sinks    = sink1
a1.sources.source1.interceptors = i1 i2 
a1.sources.source1.interceptors.i1.type = host
a1.sources.source1.interceptors.i1.preserveExisting = false
a1.sources.source1.interceptors.i1.hostHeader = host
a1.sources.source1.interceptors.i2.type = timestamp

# For each source, channel, and sink, set # standard properties.
a1.sources.source1.type     = org.apache.flume.source.http.HTTPSource
a1.sources.source1.bind     = transacciones.misionempresarial.com/CSharpFlume
a1.sources.source1.port     = 80

# JSONHandler is the default for the httpsource # 
a1.sources.source1.handler = org.apache.flume.source.http.JSONHandler
a1.sources.source1.channels = channel1
a1.channels.channel1.type   = memory
a1.sinks.sink1.type         = hdfs
a1.sinks.sink1.hdfs.path = /monthSales
a1.sinks.sink1.hdfs.filePrefix = event-file-prefix-
a1.sinks.sink1.hdfs.round = false
a1.sinks.sink1.channel      = channel1

# Other properties are specific to each type of # source, channel, or sink. In this case, we # specify the capacity of the memory channel.
a1.channels.channel1.capacity = 1000 

我正在使用curl发布,这是我的尝试:

curl -X POST -H 'Content-Type: application/json; charset=UTF-8' -d '[{"ano":"2010"}]' http://transacciones.misionempresarial.com/CSharpFlume/api/SourceFlume/ObtenerValores

我只收到此错误:

{"Message":"Error."}

我的问题是,这是配置水槽以收听我的网络api的http请求的正确方法,我缺少什么?

1 个答案:

答案 0 :(得分:0)

标准Flume'HTTPSource'及其默认的 function showPass(){ var x = document.getElementById("pass"); if(x.type === "password"){ x.type = "text"; }else{ x.type = "password"; } 将仅以特定的以Flume为中心的格式处理事件。

in the user manualJSONHandler source code开头的注释中都记录了该格式。

总而言之,它希望收到一个JSON对象列表,每个对象包含JSONHandler(键/值对,映射到Flume Event标头)和headers(一个简单的字符串,映射到Flume Event主体)。

以您的例子为例,如果您发送:

body

我想您会找到想要的东西。

如果您没有灵活性来更改发送的内容,则可以使用[{"headers": {}, "body": "{\"ano\":\"2010\"}"}] ,具体取决于您要进行的处理(注意。手册中没有与此有关的文档,仅适用于org.apache.flume.source.http.BLOBHandler-它们不是一回事,但是FLUME-2718中有一些注释),或者您可能需要提供自己的Flume org.apache.flume.sink.solr.morphline.BlobHandler接口实现。

旁注:HTTP Source HTTPSourceHandler选项需要主机名或IP地址。您可能只是幸运地将自己的值视为主机名,而忽略了路径。