{"id":701,"date":"2022-02-12T01:34:27","date_gmt":"2022-02-12T01:34:27","guid":{"rendered":"https:\/\/adrianotanaka.com.br\/?p=701"},"modified":"2022-03-11T19:17:43","modified_gmt":"2022-03-11T19:17:43","slug":"goldengate-escrevendo-dados-no-oci-streaming","status":"publish","type":"post","link":"https:\/\/adrianotanaka.com.br\/index.php\/2022\/02\/12\/goldengate-escrevendo-dados-no-oci-streaming\/","title":{"rendered":"GoldenGate &#8211; Escrevendo dados no OCI Streaming"},"content":{"rendered":"\n<p>O OCI Streaming (ou OSS) \u00e9 um servi\u00e7o de stream de eventos comp\u00e1tivel com o Apache Kafka 100% gerenciado pela Oracle, nesse artigo demonstro como extrair dados de um banco Oracle (usando o GoldenGate) e escrever nele usando o GoldenGate for bigdata.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"nossa-arquitetura\">Nossa arquitetura<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"196\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/02\/image-1024x196.png\" alt=\"\" class=\"wp-image-703\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/02\/image-1024x196.png 1024w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/02\/image-300x57.png 300w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/02\/image-768x147.png 768w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/02\/image.png 1047w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"extract-pump\">Extract\/pump<\/h2>\n\n\n\n<p>Nosso extract\/pump vai ser bem simples, aqui estou usando o par\u00e2metro RMTTHOST para enviar o trail que \u00e9 gerado pela extra\u00e7\u00e3o para o servidor do Bigdata e extraindo todas as tabelas do schema HR:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">EXTRACT pumposs\nRMTHOST IP_BIGDATA, MGRPORT 9013\nRMTTRAIL \/u02\/trails\/t1\nPASSTHRU\nTABLE ORCL19_PDB1.HR.*;<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"oss\">OSS<\/h2>\n\n\n\n<p>Antes de configurarmos nosso replicat, precisamos criar e parametrizar nosso OSS.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"499\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/02\/image-1-1024x499.png\" alt=\"\" class=\"wp-image-707\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/02\/image-1-1024x499.png 1024w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/02\/image-1-300x146.png 300w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/02\/image-1-768x374.png 768w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/02\/image-1.png 1091w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Analytics &amp; AI -&gt; Streaming<\/figcaption><\/figure>\n\n\n\n<p>O primeiro passo \u00e9 criar o Stream Pool, que serve para agrupar nossos Streams (t\u00f3picos do Kafka), aqui temos a op\u00e7\u00e3o de criar um Stream p\u00fablico ou Privado, para nosso exemplo vamos na modalidade p\u00fablica e  precisamos ir em Advanced e marcar a op\u00e7\u00e3o <strong>Auto Create Topics<\/strong> (sen\u00e3o para cada tabela voc\u00ea vai precisar criar o Stream na m\u00e3o).<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"891\" height=\"648\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/02\/image-2.png\" alt=\"\" class=\"wp-image-710\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/02\/image-2.png 891w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/02\/image-2-300x218.png 300w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/02\/image-2-768x559.png 768w\" sizes=\"auto, (max-width: 891px) 100vw, 891px\" \/><\/figure>\n\n\n\n<p>Depois que ele for criado, precisamos pegar as informa\u00e7\u00f5es de login dentro dele (se voc\u00ea marcar a segunda op\u00e7\u00e3o View Kafka settings ele j\u00e1 vai te direcionar para a p\u00e1gina) que fica no <strong>Stream Pool -&gt; Kafka connection Settings<\/strong>:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"270\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/02\/image-3-1024x270.png\" alt=\"\" class=\"wp-image-711\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/02\/image-3-1024x270.png 1024w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/02\/image-3-300x79.png 300w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/02\/image-3-768x203.png 768w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/02\/image-3-1536x405.png 1536w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/02\/image-3.png 1576w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>O seu usu\u00e1rio \u00e9 essa string gigante mesmo que termina com o ocid do Stream Pool.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"configurando-o-goldengate-for-big-data\">Configurando o GoldenGate for Big Data<\/h2>\n\n\n\n<p>Nesse exemplo estou usando o GoldenGate for Big Data do Marketplace na vers\u00e3o 21c, antigamente para cada conector do BigData, voc\u00ea precisava fazer o download manualmente e apontar nos arquivos de par\u00e2metro, como o pai do GoldenGate (Carbonera) me indicou, uma das novidades dessa vers\u00e3o \u00e9 a presen\u00e7a de scripts que fazem esse download de forma autom\u00e1tica.<\/p>\n\n\n\n<p>Sendo assim, depois da VM criada, voc\u00ea precisa acessa-la via SSH e dentro do diret\u00f3rio <em>\/u01\/app\/ogg\/opt\/DependencyDownloader\/<\/em> e executar o script kafka.sh passando a vers\u00e3o desejada :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">-bash-4.2$ .\/kafka.sh 3.1.0<\/pre>\n\n\n\n<p>Caso queira ver as vers\u00f5es dispon\u00edveis basta entrar nesse link: <a href=\"https:\/\/search.maven.org\/artifact\/org.apache.kafka\/kafka-clients\">https:\/\/search.maven.org\/artifact\/org.apache.kafka\/kafka-clients<\/a><\/p>\n\n\n\n<p>\u00c9 importante anotar o diret\u00f3rio onde o download foi feito (caso voc\u00ea altere o padr\u00e3o) pois precisamos aponta-lo em nossa configura\u00e7\u00e3o.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"replicat\">Replicat<\/h2>\n\n\n\n<p>O nosso replicat \u00e9 dividido em 3 arquivos, um que \u00e9 o replicat propriamente dito, um que parametriza o Kafka e outro com as credenciais, aqui tentei manter todos com o nome bem parecido, a configura\u00e7\u00e3o pode ser feita via interface gr\u00e1fica (no Receiver Service) ou criando os arquivos manualmente:<\/p>\n\n\n\n<p>oss.prm<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">REPLICAT oss\nTARGETDB LIBFILE libggjava.so SET property=\/u02\/deployments\/Marketplace\/etc\/conf\/ogg\/OSS.properties\nMAP ORCL19_PDB1.HR.*, TARGET *.*;<\/pre>\n\n\n\n<p>Perceba que no .prm apontamos um arquivo de propriedades que cont\u00e9m a parametriza\u00e7\u00e3o do Kafka:<\/p>\n\n\n\n<p>OSS.properties<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># Properties file for Replicat oss\n#Kafka Handler Template\ngg.handlerlist=kafkahandler\ngg.handler.kafkahandler.type=kafka\n#TODO: Set the name of the Kafka producer properties file.\ngg.handler.kafkahandler.kafkaProducerConfigFile=oss_producer.properties\n#TODO: Set the template for resolving the topic name.\ngg.handler.kafkahandler.topicMappingTemplate=${fullyQualifiedTableName}\ngg.handler.kafkahandler.keyMappingTemplate=${primaryKeys}\ngg.handler.kafkahandler.mode=op\ngg.handler.kafkahandler.format=json\ngg.handler.kafkahandler.format.metaColumnsTemplate=${objectname[table]},${optype[op_type]},${timestamp[op_ts]},${currenttimestamp[current_ts]},${position[pos]}\n#TODO: Set the location of the Kafka client libraries.\ngg.classpath=dirprm\/:\/u01\/app\/ogg\/opt\/DependencyDownloader\/dependencies\/kafka_3.1.0\/*\njvm.bootoptions=-Xmx512m -Xms32m<\/pre>\n\n\n\n<p>Aqui precisamos ajustar tr\u00eas parametros:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>gg.handler.kafkahandler.kafkaProducerConfigFile = arquivo com as credenciais do OSS<\/li><li>gg.handler.kafkahandler.topicMappingTemplate = Como ele vai criar\/identificar os t\u00f3picos<\/li><li>gg.classpath = Localiza\u00e7\u00e3o das bibliotecas que fizemos o download com o kafka.sh<\/li><\/ul>\n\n\n\n<p>Os outros par\u00e2metros controlam coisas como formato de escrita, quais colunas v\u00e3o ser escritas e por ai vai, caso queira customizar alguma coisa, aqui: <a rel=\"noreferrer noopener\" href=\"https:\/\/docs.oracle.com\/en\/middleware\/goldengate\/big-data\/21.1\/gadbd\/using-kafka-handler.html#GUID-E43DB743-4A2A-4C2F-97E8-50BB22CACCE3\" target=\"_blank\">https:\/\/docs.oracle.com\/en\/middleware\/goldengate\/big-data\/21.1\/gadbd\/using-kafka-handler.html#GUID-E43DB743-4A2A-4C2F-97E8-50BB22CACCE3<\/a> voc\u00ea tem a documenta\u00e7\u00e3o deles.<\/p>\n\n\n\n<p>Agora precisamos montar nosso arquivo de credenciais com os dados que pegamos l\u00e1 no Stream Pool, um ponto importante \u00e9 que o seu password \u00e9 um Auth Token que pode ser gerado na p\u00e1gina de gerenciamento seu usu\u00e1rio do lado esquerdo, lembre de copia-lo para um lugar seguro pois ele s\u00f3 \u00e9 exibido na cria\u00e7\u00e3o do Token.<\/p>\n\n\n\n<p>oss_producer.properties<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">bootstrap.servers=cell-1.streaming.us-ashburn-1.oci.oraclecloud.com:9092\nsecurity.protocol=SASL_SSL\nsasl.mechanism=PLAIN\nvalue.serializer=org.apache.kafka.common.serialization.ByteArraySerializer\nkey.serializer=org.apache.kafka.common.serialization.ByteArraySerializer\nsasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username=\"bXXXXX\" password=\"XXXX\";\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"testando\">Testando<\/h2>\n\n\n\n<p>Insert na tabela HR.GG4BIG:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"318\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/02\/image-4-1024x318.png\" alt=\"\" class=\"wp-image-718\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/02\/image-4-1024x318.png 1024w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/02\/image-4-300x93.png 300w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/02\/image-4-768x238.png 768w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/02\/image-4-1536x477.png 1536w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/02\/image-4.png 1546w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Mensagens no OSS<\/p>\n\n\n\n<p>Como marcamos a op\u00e7\u00e3o de cria\u00e7\u00e3o autom\u00e1tica de t\u00f3picos, o replicat j\u00e1 consegue criar sozinho:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"940\" height=\"82\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/02\/image-6.png\" alt=\"\" class=\"wp-image-721\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/02\/image-6.png 940w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/02\/image-6-300x26.png 300w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/02\/image-6-768x67.png 768w\" sizes=\"auto, (max-width: 940px) 100vw, 940px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>E j\u00e1 podemos ver nossas mensagens(que nesse caso foi o insert) chegando:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"940\" height=\"422\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/02\/image-5.png\" alt=\"\" class=\"wp-image-719\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/02\/image-5.png 940w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/02\/image-5-300x135.png 300w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/02\/image-5-768x345.png 768w\" sizes=\"auto, (max-width: 940px) 100vw, 940px\" \/><\/figure>\n\n\n\n<p>Exemplo de mensagem<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">{\"op_type\":\"I\",\"op_ts\":\"2022-02-12 01:30:44.003338\",\"csn\":\"83673974\",\"after\":{\"ID\":84}}<\/pre>\n\n\n\n<p>Nela temos o tipo de opera\u00e7\u00e3o (I), e o valor, caso fa\u00e7amos um update:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">{\"op_type\":\"U\",\"op_ts\":\"2022-02-12 01:33:25.015390\",\"csn\":\"83677632\",\"before\":{\"ID\":93},\"after\":{\"ID\":1}}<\/pre>\n\n\n\n<p>Temos o tipo U com o valor anterior e o novo, tudo isso pode ser controlado pelo par\u00e2metro  gg.handler.kafkahandler.format.metaColumnsTemplate<\/p>\n","protected":false},"excerpt":{"rendered":"<p>O OCI Streaming (ou OSS) \u00e9 um servi\u00e7o de stream de eventos comp\u00e1tivel com o Apache Kafka 100% gerenciado pela Oracle, nesse artigo demonstro como extrair dados de um banco Oracle (usando o GoldenGate) e escrever nele usando o GoldenGate for bigdata. Nossa arquitetura Extract\/pump Nosso extract\/pump vai ser bem simples, aqui estou usando o [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":703,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"material-hide-sections":[],"footnotes":""},"categories":[8,6,1],"tags":[],"class_list":["post-701","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-oci","category-oracle","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/posts\/701","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/comments?post=701"}],"version-history":[{"count":17,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/posts\/701\/revisions"}],"predecessor-version":[{"id":770,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/posts\/701\/revisions\/770"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/media\/703"}],"wp:attachment":[{"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/media?parent=701"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/categories?post=701"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/tags?post=701"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}