blob: 9ac61a68bebab1333372af01ce32b58ce7929f60 [file] [log] [blame]
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Managing Connectors · Apache Pulsar</title><meta name="viewport" content="width=device-width, initial-scale=1.0"/><meta name="generator" content="Docusaurus"/><meta name="description" content="This section describes how to manage Pulsar IO connectors in a Pulsar cluster. You will learn how to:"/><meta name="docsearch:version" content="2.8.0"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="Managing Connectors · Apache Pulsar"/><meta property="og:type" content="website"/><meta property="og:url" content="https://pulsar.apache.org/"/><meta property="og:description" content="This section describes how to manage Pulsar IO connectors in a Pulsar cluster. You will learn how to:"/><meta name="twitter:card" content="summary"/><meta name="twitter:image" content="https://pulsar.apache.org/img/pulsar.svg"/><link rel="shortcut icon" href="/img/pulsar.ico"/><link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/atom-one-dark.min.css"/><link rel="alternate" type="application/atom+xml" href="https://pulsar.apache.org/blog/atom.xml" title="Apache Pulsar Blog ATOM Feed"/><link rel="alternate" type="application/rss+xml" href="https://pulsar.apache.org/blog/feed.xml" title="Apache Pulsar Blog RSS Feed"/><link rel="stylesheet" href="/css/code-blocks-buttons.css"/><script type="text/javascript" src="https://buttons.github.io/buttons.js"></script><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.0/clipboard.min.js"></script><script type="text/javascript" src="/js/custom.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/en"><img class="logo" src="/img/pulsar.svg" alt="Apache Pulsar"/></a><a href="/en/versions"><h3>2.8.0</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-internal"><li class=""><a href="/docs/en/2.8.0/getting-started-standalone" target="_self">Docs</a></li><li class=""><a href="/en/download" target="_self">Download</a></li><li class=""><a href="/docs/en/2.8.0/client-libraries" target="_self">Clients</a></li><li class=""><a href="#restapis" target="_self">REST APIs</a></li><li class=""><a href="#cli" target="_self">Cli</a></li><li class=""><a href="/blog/" target="_self">Blog</a></li><li class=""><a href="#community" target="_self">Community</a></li><li class=""><a href="#apache" target="_self">Apache</a></li><li class=""><a href="https://pulsar-next.staged.apache.org/" target="_self">New Website (Beta)</a></li><span><li><a id="languages-menu" href="#"><img class="languages-icon" src="/img/language.svg" alt="Languages icon"/>English</a><div id="languages-dropdown" class="hide"><ul id="languages-dropdown-items"><li><a href="/docs/ja/2.8.0/io-managing">日本語</a></li><li><a href="/docs/fr/2.8.0/io-managing">Français</a></li><li><a href="/docs/ko/2.8.0/io-managing">한국어</a></li><li><a href="/docs/zh-CN/2.8.0/io-managing">中文</a></li><li><a href="/docs/zh-TW/2.8.0/io-managing">繁體中文</a></li><li><a href="https://crowdin.com/project/apache-pulsar" target="_blank" rel="noreferrer noopener">Help Translate</a></li></ul></div></li><script>
const languagesMenuItem = document.getElementById("languages-menu");
const languagesDropDown = document.getElementById("languages-dropdown");
languagesMenuItem.addEventListener("click", function(event) {
event.preventDefault();
if (languagesDropDown.className == "hide") {
languagesDropDown.className = "visible";
} else {
languagesDropDown.className = "hide";
}
});
</script></span></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/pulsar/edit/master/site2/docs/io-managing.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Managing Connectors</h1></header><article><div><span><p>This section describes how to manage Pulsar IO connectors in a Pulsar cluster. You will learn how to:</p>
<ul>
<li>Deploy builtin connectors</li>
<li>Monitor and update running connectors with Pulsar Admin CLI</li>
<li>Deploy customized connectors</li>
<li>Upgrade a connector</li>
</ul>
<h2><a class="anchor" aria-hidden="true" id="using-builtin-connectors"></a><a href="#using-builtin-connectors" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Using Builtin Connectors</h2>
<p>Pulsar bundles several <a href="/docs/en/2.8.0/io-overview#working-with-connectors">builtin connectors</a> that should be used for moving data in and out
of commonly used systems such as databases, messaging systems. Getting set up to use these builtin connectors is simple. You can follow
the <a href="/docs/en/2.8.0/getting-started-standalone#installing-builtin-connectors">instructions</a> on installing builtin connectors. After setup, all
the builtin connectors will be automatically discovered by Pulsar brokers (or function-workers), so no additional installation steps are
required.</p>
<h2><a class="anchor" aria-hidden="true" id="configuring-connectors"></a><a href="#configuring-connectors" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Configuring Connectors</h2>
<p>Configuring Pulsar IO connectors is straightforward. What you need to do is to provide a yaml configuration file when your <a href="#running-connectors">run connectors</a>.
The yaml configuration file basically tells Pulsar where to locate the sources and sinks and how to connect those sources and sinks with Pulsar topics.</p>
<p>Below is an example yaml configuration file for Cassandra Sink:</p>
<pre><code class="hljs css language-shell">tenant: public
namespace: default
name: cassandra-test-sink
...
<span class="hljs-meta">#</span><span class="bash"> cassandra specific config</span>
configs:
roots: "localhost:9042"
keyspace: "pulsar_test_keyspace"
columnFamily: "pulsar_test_table"
keyname: "key"
columnName: "col"
</code></pre>
<p>The example yaml basically tells Pulsar which Cassandra cluster to connect, what is the <code>keyspace</code> and <code>columnFamily</code> to be used in Cassandra for collecting data,
and how to map a Pulsar message into Cassandra table key and columns.</p>
<p>For details, consult the documentation for <a href="/docs/en/2.8.0/io-overview#working-with-connectors">individual connectors</a>.</p>
<h2><a class="anchor" aria-hidden="true" id="running-connectors"></a><a href="#running-connectors" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Running Connectors</h2>
<p>Pulsar connectors can be managed using the <a href="/docs/en/2.8.0/reference-pulsar-admin#source"><code>source</code></a> and <a href="/docs/en/2.8.0/reference-pulsar-admin#sink"><code>sink</code></a> commands of the <a href="/docs/en/2.8.0/reference-pulsar-admin"><code>pulsar-admin</code></a> CLI tool.</p>
<h3><a class="anchor" aria-hidden="true" id="running-sources"></a><a href="#running-sources" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Running sources</h3>
<p>You can submit a source to be run in an existing Pulsar cluster using a command of this form:</p>
<pre><code class="hljs css language-bash">$ ./bin/pulsar-admin sources create --classname &lt;classname&gt; --archive &lt;jar-location&gt; --tenant &lt;tenant&gt; --namespace &lt;namespace&gt; --name &lt;<span class="hljs-built_in">source</span>-name&gt; --destination-topic-name &lt;output-topic&gt;
</code></pre>
<p>Here’s an example command:</p>
<pre><code class="hljs css language-bash">bin/pulsar-admin sources create --classname org.apache.pulsar.io.twitter.TwitterFireHose --archive ~/application.jar --tenant <span class="hljs-built_in">test</span> --namespace ns1 --name twitter-source --destination-topic-name twitter_data
</code></pre>
<p>Instead of submitting a source to run on an existing Pulsar cluster, you alternatively can run a source as a process on your local machine:</p>
<pre><code class="hljs css language-bash">bin/pulsar-admin sources localrun --classname org.apache.pulsar.io.twitter.TwitterFireHose --archive ~/application.jar --tenant <span class="hljs-built_in">test</span> --namespace ns1 --name twitter-source --destination-topic-name twitter_data
</code></pre>
<p>If you are submitting a built-in source, you don't need to specify <code>--classname</code> and <code>--archive</code>.
You can simply specify the source type <code>--source-type</code>. The command to submit a built-in source is
in following form:</p>
<pre><code class="hljs css language-bash">./bin/pulsar-admin sources create \
--tenant &lt;tenant&gt; \
--namespace &lt;namespace&gt; \
--name &lt;<span class="hljs-built_in">source</span>-name&gt; \
--destination-topic-name &lt;input-topics&gt; \
--<span class="hljs-built_in">source</span>-type &lt;<span class="hljs-built_in">source</span>-type&gt;
</code></pre>
<p>Here's an example to submit a Kafka source:</p>
<pre><code class="hljs css language-bash">./bin/pulsar-admin sources create \
--tenant <span class="hljs-built_in">test</span>-tenant \
--namespace <span class="hljs-built_in">test</span>-namespace \
--name <span class="hljs-built_in">test</span>-kafka-source \
--destination-topic-name pulsar_sink_topic \
--<span class="hljs-built_in">source</span>-type kafka
</code></pre>
<h3><a class="anchor" aria-hidden="true" id="running-sinks"></a><a href="#running-sinks" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Running Sinks</h3>
<p>You can submit a sink to be run in an existing Pulsar cluster using a command of this form:</p>
<pre><code class="hljs css language-bash">./bin/pulsar-admin sinks create --classname &lt;classname&gt; --archive &lt;jar-location&gt; --tenant <span class="hljs-built_in">test</span> --namespace &lt;namespace&gt; --name &lt;sink-name&gt; --inputs &lt;input-topics&gt;
</code></pre>
<p>Here’s an example command:</p>
<pre><code class="hljs css language-bash">./bin/pulsar-admin sinks create --classname org.apache.pulsar.io.cassandra --archive ~/application.jar --tenant <span class="hljs-built_in">test</span> --namespace ns1 --name cassandra-sink --inputs test_topic
</code></pre>
<p>Instead of submitting a sink to run on an existing Pulsar cluster, you alternatively can run a sink as a process on your local machine:</p>
<pre><code class="hljs css language-bash">./bin/pulsar-admin sinks localrun --classname org.apache.pulsar.io.cassandra --archive ~/application.jar --tenant <span class="hljs-built_in">test</span> --namespace ns1 --name cassandra-sink --inputs test_topic
</code></pre>
<p>If you are submitting a built-in sink, you don't need to specify <code>--classname</code> and <code>--archive</code>.
You can simply specify the sink type <code>--sink-type</code>. The command to submit a built-in sink is
in following form:</p>
<h4><a class="anchor" aria-hidden="true" id="note"></a><a href="#note" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Note</h4>
<blockquote>
<p>The <code>sink-type</code> parameter of the currently built-in connectors is determined by the setting of the <code>name</code> parameter specified in the pulsar-io.yaml file.</p>
</blockquote>
<pre><code class="hljs css language-bash">./bin/pulsar-admin sinks create \
--tenant &lt;tenant&gt; \
--namespace &lt;namespace&gt; \
--name &lt;sink-name&gt; \
--inputs &lt;input-topics&gt; \
--sink-type &lt;sink-type&gt;
</code></pre>
<p>Here's an example to submit a Cassandra sink:</p>
<pre><code class="hljs css language-bash">./bin/pulsar-admin sinks create \
--tenant <span class="hljs-built_in">test</span>-tenant \
--namespace <span class="hljs-built_in">test</span>-namespace \
--name <span class="hljs-built_in">test</span>-cassandra-sink \
--inputs pulsar_input_topic \
--sink-type cassandra
</code></pre>
<h2><a class="anchor" aria-hidden="true" id="monitoring-connectors"></a><a href="#monitoring-connectors" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Monitoring Connectors</h2>
<p>Since Pulsar IO connectors are running as <a href="/docs/en/2.8.0/functions-overview">Pulsar Functions</a>, so you can use <a href="/docs/en/2.8.0/reference-pulsar-admin#source"><code>functions</code></a> commands
available in the <a href="/docs/en/2.8.0/reference-pulsar-admin"><code>pulsar-admin</code></a> CLI tool.</p>
<h3><a class="anchor" aria-hidden="true" id="retrieve-connector-metadata"></a><a href="#retrieve-connector-metadata" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Retrieve Connector Metadata</h3>
<pre><code class="hljs">bin/pulsar-<span class="hljs-keyword">admin</span> <span class="hljs-keyword">functions</span> <span class="hljs-keyword">get</span> \
<span class="hljs-comment">--tenant &lt;tenant&gt; \</span>
<span class="hljs-comment">--namespace &lt;namespace&gt; \</span>
<span class="hljs-comment">--name &lt;connector-name&gt;</span>
</code></pre>
<h3><a class="anchor" aria-hidden="true" id="retrieve-connector-running-status"></a><a href="#retrieve-connector-running-status" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Retrieve Connector Running Status</h3>
<pre><code class="hljs">bin/pulsar-<span class="hljs-keyword">admin</span> <span class="hljs-keyword">functions</span> getstatus \
<span class="hljs-comment">--tenant &lt;tenant&gt; \</span>
<span class="hljs-comment">--namespace &lt;namespace&gt; \</span>
<span class="hljs-comment">--name &lt;connector-name&gt;</span>
</code></pre>
</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#using-builtin-connectors">Using Builtin Connectors</a></li><li><a href="#configuring-connectors">Configuring Connectors</a></li><li><a href="#running-connectors">Running Connectors</a><ul class="toc-headings"><li><a href="#running-sources">Running sources</a></li><li><a href="#running-sinks">Running Sinks</a></li></ul></li><li><a href="#monitoring-connectors">Monitoring Connectors</a><ul class="toc-headings"><li><a href="#retrieve-connector-metadata">Retrieve Connector Metadata</a></li><li><a href="#retrieve-connector-running-status">Retrieve Connector Running Status</a></li></ul></li></ul></nav></div><footer class="nav-footer" id="footer"><section class="copyright">Copyright © 2022 The Apache Software Foundation. All Rights Reserved. Apache, Apache Pulsar and the Apache feather logo are trademarks of The Apache Software Foundation.</section><span><script>
const community = document.querySelector("a[href='#community']").parentNode;
const communityMenu =
'<li>' +
'<a id="community-menu" href="#">Community <span style="font-size: 0.75em">&nbsp;▼</span></a>' +
'<div id="community-dropdown" class="hide">' +
'<ul id="community-dropdown-items">' +
'<li><a href="/en/contact">Contact</a></li>' +
'<li><a href="/en/contributing">Contributing</a></li>' +
'<li><a href="/en/coding-guide">Coding guide</a></li>' +
'<li><a href="/en/events">Events</a></li>' +
'<li><a href="https://twitter.com/Apache_Pulsar" target="_blank">Twitter &#x2750</a></li>' +
'<li><a href="https://github.com/apache/pulsar/wiki" target="_blank">Wiki &#x2750</a></li>' +
'<li><a href="https://github.com/apache/pulsar/issues" target="_blank">Issue tracking &#x2750</a></li>' +
'<li><a href="https://pulsar-summit.org/" target="_blank">Pulsar Summit &#x2750</a></li>' +
'<li>&nbsp;</li>' +
'<li><a href="/en/resources">Resources</a></li>' +
'<li><a href="/en/team">Team</a></li>' +
'<li><a href="/en/powered-by">Powered By</a></li>' +
'</ul>' +
'</div>' +
'</li>';
community.innerHTML = communityMenu;
const communityMenuItem = document.getElementById("community-menu");
const communityDropDown = document.getElementById("community-dropdown");
communityMenuItem.addEventListener("click", function(event) {
event.preventDefault();
if (communityDropDown.className == 'hide') {
communityDropDown.className = 'visible';
} else {
communityDropDown.className = 'hide';
}
});
</script></span></footer></div><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter-wjs'));</script></body></html>