Avançar para a área de conteúdo

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

A primeira vez que acessar o developerWorks, um perfil será criado para você. Informações do seu perfil (tais como: nome, país / região, e empresa) estarão disponíveis ao público, que poderá acompanhar qualquer conteúdo que você publicar. Seu perfil no developerWorks pode ser atualizado a qualquer momento.

Todas as informações enviadas são seguras.

  • Fechar [x]

Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

Todas as informações enviadas são seguras.

  • Fechar [x]

Migrando os aplicativos SPADE do InfoSphere Streams para SPL, Parte 3: Migrar aplicativos SPADE com funções definidas pelo usuário

Um guia introdutório de exemplos

Kevin Erickson, Senior Software Engineer, I.B.M.
Photo of Kevin Erickson
Kevin Erickson passou a fazer parte da IBM em Rochester, MN, em 1981, como engenheiro eletricista trabalhando no desenvolvimento e teste de unidades de disco rígido. Ele contribuiu para uma grande variedade de produtos e tecnologias IBM, desde sistemas de controle de servomecanismo de eixo e atuador de disco rígido até componentes de kernel do sistema operacional do AS/400 e sucessor. Mais recentemente, Kevin trabalhou no teste de desempenho do supercomputador Roadrunner, o primeiro computador a quebrar a barreira de 1 petaflop. Em 2009, ele se transferiu para o Software Group para trabalhar com a equipe do InfoSphere Streams, primariamente em diversas funções relacionadas a testes. Ao longo de sua carreira na IBM, Kevin recebeu 14 patentes nos EUA e várias em outros países. Ele possui bacharelado em Engenharia Elétrica da Universidade de Minnesota.
Richard P. King, Senior Programmer, IBM
Richard King é membro da equipe do InfoSphere Streams há vários anos. Quando ele passou a fazer parte da IBM em 1977, trabalhou como Associate Programmer no desenvolvimento do System/38. Desde sua transferência para a Research Division da IBM no IBM Thomas J. Watson Research Center in Yorktown em 1981, ele trabalhou em uma ampla gama de projetos, incluindo o design e o desenvolvimento do que se tornou a IBM Sysplex Coupling Facility. Richard é bacharel em Engenharia Industrial e Pesquisa de Operações pela Universidade Cornell e mestre em Pesquisa de Operações e Engenharia Industrial pela Universidade Northwestern.

Resumo:  O novo recurso mais significativo da Versão 2.0 do produto IBM InfoSphere® Streams é a transformação do modelo de linguagem de programação de Stream Processing Application Declarative Engine (SPADE) para Stream Processing Language (SPL). Os usuários com aplicativos SPADE de versões anteriores precisarão migrar e portar seus aplicativos para SPL ao atualizar suas instalações para a Versão 2.0. Este tutorial é a Parte 3 de uma série com 5 partes que usa exemplos reais de SPADE para demonstrar uma série de procedimentos detalhados para migrar e portar diferentes tipos de conteúdo de aplicativos SPADE. A Parte 3 demonstra a migração de aplicativos SPADE com funções definidas pelo usuário.

Visualizar mais conteúdo nesta série

Data:  18/Jul/2011
Nível:  Intermediário

Atividade:  2895 visualizações

Atualizando a seção da biblioteca do modelo de função

Tablela 4 mostra o esqueleto da seção do arquivo function.xml que pertence à forma de função de biblioteca.


Tablela 4. Esqueleto da seção do conjunto de funções de biblioteca
Nº da linhaCódigo
42  <functionSet>
43    <!-- header file to include from within C++ code -->
44    <headerFileName>Sample.h</headerFileName>
45    <!-- functions lists the SPL prototypes of the functions implemented in this library -->
46    <functions>
47      <function>
48        <!-- use of CDATA allows easy use of <> in the prototypes -->
49        <prototype><![CDATA[ public void replaceMe() ]]></prototype>
50      </function>
51    </functions>
52    <dependencies>
53      <!-- This library can have several dependencies. Only one is used here. -->
54      <library>
55        <!-- A description for this library -->
56        <cmn:description>Sample-Functions</cmn:description>
57        <cmn:managedLibrary>
58          <!-- the name of the library for linking. Will be used as -lSample -->
59          <cmn:lib>Sample</cmn:lib>
60          <!-- Where to find the library. Relative to the current directory.
61            Will be used as -L<dir>/lib -->
62          <cmn:libPath>lib</cmn:libPath>
63          <!-- Where to find the include file. Relative to the current directory.
64            Will be used as -I<dir> -->
65          <cmn:includePath>./</cmn:includePath>
66        </cmn:managedLibrary>
67      </library>
68    </dependencies>
69  </functionSet>
70</functionModel>

Complete as seguintes etapas para modificar essa seção. Como o número de linhas muda à medida que você faz modificações, cada modificação é feita com referência aos números de linha do esqueleto original.

  1. Edite o arquivo de modelo de função function.xml para adicionar protótipos de função declarados pela compilação anterior como uma função de recebedor de chamada desconhecida.
    my_editor functions/native.function/function.xml &
    

  2. Na linha 44, substitua Sample.h por
    CalculateStateTaxLibrary.h
    

    como o <headerFileName>.
  3. Replique as linhas 47 a 50 duas vezes para alcançar três seções, que se tornam as linhas 47 a 58. Como três funções de recebedor de chamada foram identificadas como desconhecidas, você precisa criar três seções de tag <function>.
  4. Substitui a seção <prototype> para cada uma das três linhas correspondentes à linha 49 replicada da seguinte maneira:
    1. Substitua a linha 49 por
      <![CDATA[ public float32 libGetStateTaxPercentage(rstring) ]]>
      

    2. Substitua a nova linha 53 por
      <![CDATA[ public float32 libGetTotalTax(rstring, float32, int32) ]]>
      

    3. Substitua a nova linha 57 por
      <![CDATA[ public int32 libGetShipmentTrackingNumber(rstring, rstring) ]]>
      

  5. Na linha 56 (nova linha 64), substitua Sample-Functions por
    UDF-Functions
    

    como o <cmn:description>. Esse nome pode ser qualquer texto descritivo.
  6. Na linha 59 (nova linha 67), substitua Sample por
    CalculateStateTax
    

    como o <cmn:lib>.
  7. Na linha 62 (nova linha 70), substitua lib por
    ../../opt/lib
    

    como o <cmn:libPath>.
  8. Na linha 65 (nova linha 73), substitua ./ por
    ../../opt/include
    

    como o <cmn:includePath>.
  9. Salve e saia de my_editor.

Tablela 5 mostra os resultados da seção do conjunto de funções de biblioteca após todas essas modificações.


Tablela 5. Seção do conjunto de funções de biblioteca preenchida
Nº da linhaCódigo
42  <functionSet>
43    <!-- header file to include from within C++ code -->
44    <headerFileName>CalculateStateTaxLibrary.h</headerFileName>
45    <!-- functions lists the SPL prototypes of the functions implemented in this library -->
46    <functions>
47      <function>
48        <!-- use of CDATA allows easy use of <> in the prototypes -->
49        <prototype><![CDATA[ public float32
        libGetStateTaxPercentage(rstring) ]]></prototype>
50      </function>
51      <function>
52        <!-- use of CDATA allows easy use of <> in the prototypes -->
53        <prototype><![CDATA[ public float32 libGetTotalTax(rstring, float32,
        int32) ]]></prototype>
54      </function>
55      <function>
56        <!-- use of CDATA allows easy use of <> in the prototypes -->
57        <prototype><![CDATA[ public int32 libGetShipmentTrackingNumber(rstring,
        rstring) ]]></prototype>
58      </function>
59    </functions>
60    <dependencies>
61      <!-- This library can have several dependencies. Only one is used here. -->
62      <library>
63        <!-- A description for this library -->
64        <cmn:description>UDF-Functions</cmn:description>
65        <cmn:managedLibrary>
66          <!-- the name of the library for linking. Will be used as -lSample -->
67          <cmn:lib>CalculateStateTax</cmn:lib>
68          <!-- Where to find the library. Relative to the current directory.
69            Will be used as -L<dir>/lib -->
70          <cmn:libPath>../../opt/lib</cmn:libPath>
71          <!-- Where to find the include file. Relative to the current directory.
72            Will be used as -I<dir> -->
73          <cmn:includePath>../../opt/include</cmn:includePath>
74        </cmn:managedLibrary>
75      </library>
76    </dependencies>
77  </functionSet>
78</functionModel>

Como resultado dessas mudanças no arquivo function.xml, os erros da compilação anterior devem ser corrigidos. No entanto, esses erros impediram a continuação da compilação e a ocorrência de erros subsequentes devido à falta de muitas informações de modelo da função. Portanto, você precisa compilar o aplicativo novamente para determinar se há erros adicionais.

sc -T -M udf_at_work

Após a compilação, uma lista de erros parecida com a seguinte pode ser exibida. As duas primeiras mensagens indicam um erro devido à falta de um arquivo de cabeçalho enquanto as outras mensagens indicam um erro de namespace. É possível lidar com esses erros ao transferir os arquivos SPADE relacionados à implementação para SPL, conforme descreve as próximas seções.
Lista 17. Mensagem de erro

Incluído no arquivo
de src/operator/OrdersWithFinalPrice1.cpp:3:


Lista 18. Mensagem de erro
src/operator/OrdersWithFinalPrice1.h:16:37: error:
CalculateStateTaxInline.h: Esse arquivo ou diretório não existe


Lista 19. Mensagem de erro
src/operator/OrdersWithFinalPrice1.cpp: In member function
‘virtual void SPL::_Operator::OrdersWithFinalPrice1::process(const
SPL::Tuple&, uint32_t)’:


Lista 20. Mensagem de erro
src/operator/OrdersWithFinalPrice1.cpp:23: error: ‘::functions’
não foi declarado


Lista 21. Mensagem de erro
src/operator/OrdersWithFinalPrice1.cpp:23: error: ‘::functions’
não foi declarado


Lista 22. Mensagem de erro
src/operator/OrdersWithFinalPrice1.cpp:23: error: ‘::functions’
não foi declarado

5 de 10 | Anterior | Próximo

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Information Management
ArticleID=699981
TutorialTitle=Migrando os aplicativos SPADE do InfoSphere Streams para SPL, Parte 3: Migrar aplicativos SPADE com funções definidas pelo usuário
publish-date=07182011
author1-email=kjerick@us.ibm.com
author1-email-cc=
author2-email=rpk@us.ibm.com
author2-email-cc=