bookkeeperStarted.html 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  2. <html>
  3. <head>
  4. <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
  5. <meta content="Apache Forrest" name="Generator">
  6. <meta name="Forrest-version" content="0.9">
  7. <meta name="Forrest-skin-name" content="pelt">
  8. <title>BookKeeper Getting Started Guide</title>
  9. <link type="text/css" href="skin/basic.css" rel="stylesheet">
  10. <link media="screen" type="text/css" href="skin/screen.css" rel="stylesheet">
  11. <link media="print" type="text/css" href="skin/print.css" rel="stylesheet">
  12. <link type="text/css" href="skin/profile.css" rel="stylesheet">
  13. <script src="skin/getBlank.js" language="javascript" type="text/javascript"></script><script src="skin/getMenu.js" language="javascript" type="text/javascript"></script><script src="skin/fontsize.js" language="javascript" type="text/javascript"></script>
  14. <link rel="shortcut icon" href="images/favicon.ico">
  15. </head>
  16. <body onload="init()">
  17. <script type="text/javascript">ndeSetTextSize();</script>
  18. <div id="top">
  19. <!--+
  20. |breadtrail
  21. +-->
  22. <div class="breadtrail">
  23. <a href="http://www.apache.org/">Apache</a> &gt; <a href="http://hadoop.apache.org/">Hadoop</a> &gt; <a href="http://hadoop.apache.org/zookeeper/">ZooKeeper</a><script src="skin/breadcrumbs.js" language="JavaScript" type="text/javascript"></script>
  24. </div>
  25. <!--+
  26. |header
  27. +-->
  28. <div class="header">
  29. <!--+
  30. |start group logo
  31. +-->
  32. <div class="grouplogo">
  33. <a href="http://hadoop.apache.org/"><img class="logoImage" alt="Hadoop" src="images/hadoop-logo.jpg" title="Apache Hadoop"></a>
  34. </div>
  35. <!--+
  36. |end group logo
  37. +-->
  38. <!--+
  39. |start Project Logo
  40. +-->
  41. <div class="projectlogo">
  42. <a href="http://hadoop.apache.org/zookeeper/"><img class="logoImage" alt="ZooKeeper" src="images/zookeeper_small.gif" title="ZooKeeper: distributed coordination"></a>
  43. </div>
  44. <!--+
  45. |end Project Logo
  46. +-->
  47. <!--+
  48. |start Search
  49. +-->
  50. <div class="searchbox">
  51. <form action="http://www.google.com/search" method="get" class="roundtopsmall">
  52. <input value="hadoop.apache.org" name="sitesearch" type="hidden"><input onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" id="query" type="text" value="Search the site with google">&nbsp;
  53. <input name="Search" value="Search" type="submit">
  54. </form>
  55. </div>
  56. <!--+
  57. |end search
  58. +-->
  59. <!--+
  60. |start Tabs
  61. +-->
  62. <ul id="tabs">
  63. <li>
  64. <a class="unselected" href="http://hadoop.apache.org/zookeeper/">Project</a>
  65. </li>
  66. <li>
  67. <a class="unselected" href="http://wiki.apache.org/hadoop/ZooKeeper">Wiki</a>
  68. </li>
  69. <li class="current">
  70. <a class="selected" href="index.html">ZooKeeper 3.4 Documentation</a>
  71. </li>
  72. </ul>
  73. <!--+
  74. |end Tabs
  75. +-->
  76. </div>
  77. </div>
  78. <div id="main">
  79. <div id="publishedStrip">
  80. <!--+
  81. |start Subtabs
  82. +-->
  83. <div id="level2tabs"></div>
  84. <!--+
  85. |end Endtabs
  86. +-->
  87. <script type="text/javascript"><!--
  88. document.write("Last Published: " + document.lastModified);
  89. // --></script>
  90. </div>
  91. <!--+
  92. |breadtrail
  93. +-->
  94. <div class="breadtrail">
  95. &nbsp;
  96. </div>
  97. <!--+
  98. |start Menu, mainarea
  99. +-->
  100. <!--+
  101. |start Menu
  102. +-->
  103. <div id="menu">
  104. <div onclick="SwitchMenu('menu_1.1', 'skin/')" id="menu_1.1Title" class="menutitle">Overview</div>
  105. <div id="menu_1.1" class="menuitemgroup">
  106. <div class="menuitem">
  107. <a href="index.html">Welcome</a>
  108. </div>
  109. <div class="menuitem">
  110. <a href="zookeeperOver.html">Overview</a>
  111. </div>
  112. <div class="menuitem">
  113. <a href="zookeeperStarted.html">Getting Started</a>
  114. </div>
  115. <div class="menuitem">
  116. <a href="releasenotes.html">Release Notes</a>
  117. </div>
  118. </div>
  119. <div onclick="SwitchMenu('menu_1.2', 'skin/')" id="menu_1.2Title" class="menutitle">Developer</div>
  120. <div id="menu_1.2" class="menuitemgroup">
  121. <div class="menuitem">
  122. <a href="api/index.html">API Docs</a>
  123. </div>
  124. <div class="menuitem">
  125. <a href="zookeeperProgrammers.html">Programmer's Guide</a>
  126. </div>
  127. <div class="menuitem">
  128. <a href="javaExample.html">Java Example</a>
  129. </div>
  130. <div class="menuitem">
  131. <a href="zookeeperTutorial.html">Barrier and Queue Tutorial</a>
  132. </div>
  133. <div class="menuitem">
  134. <a href="recipes.html">Recipes</a>
  135. </div>
  136. </div>
  137. <div onclick="SwitchMenu('menu_selected_1.3', 'skin/')" id="menu_selected_1.3Title" class="menutitle" style="background-image: url('skin/images/chapter_open.gif');">BookKeeper</div>
  138. <div id="menu_selected_1.3" class="selectedmenuitemgroup" style="display: block;">
  139. <div class="menupage">
  140. <div class="menupagetitle">Getting started</div>
  141. </div>
  142. <div class="menuitem">
  143. <a href="bookkeeperOverview.html">Overview</a>
  144. </div>
  145. <div class="menuitem">
  146. <a href="bookkeeperConfig.html">Setup guide</a>
  147. </div>
  148. <div class="menuitem">
  149. <a href="bookkeeperProgrammer.html">Programmer's guide</a>
  150. </div>
  151. </div>
  152. <div onclick="SwitchMenu('menu_1.4', 'skin/')" id="menu_1.4Title" class="menutitle">Admin &amp; Ops</div>
  153. <div id="menu_1.4" class="menuitemgroup">
  154. <div class="menuitem">
  155. <a href="zookeeperAdmin.html">Administrator's Guide</a>
  156. </div>
  157. <div class="menuitem">
  158. <a href="zookeeperQuotas.html">Quota Guide</a>
  159. </div>
  160. <div class="menuitem">
  161. <a href="zookeeperJMX.html">JMX</a>
  162. </div>
  163. <div class="menuitem">
  164. <a href="zookeeperObservers.html">Observers Guide</a>
  165. </div>
  166. </div>
  167. <div onclick="SwitchMenu('menu_1.5', 'skin/')" id="menu_1.5Title" class="menutitle">Contributor</div>
  168. <div id="menu_1.5" class="menuitemgroup">
  169. <div class="menuitem">
  170. <a href="zookeeperInternals.html">ZooKeeper Internals</a>
  171. </div>
  172. </div>
  173. <div onclick="SwitchMenu('menu_1.6', 'skin/')" id="menu_1.6Title" class="menutitle">Miscellaneous</div>
  174. <div id="menu_1.6" class="menuitemgroup">
  175. <div class="menuitem">
  176. <a href="http://wiki.apache.org/hadoop/ZooKeeper">Wiki</a>
  177. </div>
  178. <div class="menuitem">
  179. <a href="http://wiki.apache.org/hadoop/ZooKeeper/FAQ">FAQ</a>
  180. </div>
  181. <div class="menuitem">
  182. <a href="http://hadoop.apache.org/zookeeper/mailing_lists.html">Mailing Lists</a>
  183. </div>
  184. </div>
  185. <div id="credit"></div>
  186. <div id="roundbottom">
  187. <img style="display: none" class="corner" height="15" width="15" alt="" src="skin/images/rc-b-l-15-1body-2menu-3menu.png"></div>
  188. <!--+
  189. |alternative credits
  190. +-->
  191. <div id="credit2"></div>
  192. </div>
  193. <!--+
  194. |end Menu
  195. +-->
  196. <!--+
  197. |start content
  198. +-->
  199. <div id="content">
  200. <div title="Portable Document Format" class="pdflink">
  201. <a class="dida" href="bookkeeperStarted.pdf"><img alt="PDF -icon" src="skin/images/pdfdoc.gif" class="skin"><br>
  202. PDF</a>
  203. </div>
  204. <h1>BookKeeper Getting Started Guide</h1>
  205. <div id="front-matter">
  206. <div id="minitoc-area">
  207. <ul class="minitoc">
  208. <li>
  209. <a href="#bk_GettingStarted">Getting Started: Setting up BookKeeper to write logs.</a>
  210. <ul class="minitoc">
  211. <li>
  212. <a href="#bk_Prerequisites">Pre-requisites</a>
  213. </li>
  214. <li>
  215. <a href="#bk_Download">Download</a>
  216. </li>
  217. <li>
  218. <a href="#bk_localBK">LocalBookKeeper</a>
  219. </li>
  220. <li>
  221. <a href="#bk_setupBookies">Setting up bookies</a>
  222. </li>
  223. <li>
  224. <a href="#bk_setupZK">Setting up ZooKeeper</a>
  225. </li>
  226. <li>
  227. <a href="#bk_example">Example</a>
  228. </li>
  229. </ul>
  230. </li>
  231. </ul>
  232. </div>
  233. </div>
  234. <a name="bk_GettingStarted"></a>
  235. <h2 class="h3">Getting Started: Setting up BookKeeper to write logs.</h2>
  236. <div class="section">
  237. <p>This document contains information to get you started quickly with
  238. BookKeeper. It is aimed primarily at developers willing to try it out, and
  239. contains simple installation instructions for a simple BookKeeper installation
  240. and a simple programming example. For further programming detail, please refer to
  241. <a href="bookkeeperProgrammer.html">BookKeeper Programmer's Guide</a>.
  242. </p>
  243. <a name="bk_Prerequisites"></a>
  244. <h3 class="h4">Pre-requisites</h3>
  245. <p>See <a href="bookkeeperConfig.html#bk_sysReq">
  246. System Requirements</a> in the Admin guide.</p>
  247. <a name="bk_Download"></a>
  248. <h3 class="h4">Download</h3>
  249. <p> BookKeeper is distributed along with ZooKeeper. To get a ZooKeeper distribution,
  250. download a recent
  251. <a href="http://hadoop.apache.org/zookeeper/releases.html">
  252. stable</a> release from one of the Apache Download
  253. Mirrors.</p>
  254. <a name="bk_localBK"></a>
  255. <h3 class="h4">LocalBookKeeper</h3>
  256. <p> Under org.apache.bookkeeper.util, you'll find a java program
  257. called LocalBookKeeper.java that sets you up to run BookKeeper on a
  258. single machine. This is far from ideal from a performance perspective,
  259. but the program is useful for both test and educational purposes.
  260. </p>
  261. <a name="bk_setupBookies"></a>
  262. <h3 class="h4">Setting up bookies</h3>
  263. <p> If you're bold and you want more than just running things locally, then
  264. you'll need to run bookies in different servers. You'll need at least three bookies
  265. to start with.
  266. </p>
  267. <p>
  268. For each bookie, we need to execute a command like the following:
  269. </p>
  270. <p>
  271. <span class="codefrag computeroutput">
  272. java -cp .:./zookeeper-&lt;version&gt;-bookkeeper.jar:./zookeeper-&lt;version&gt;.jar\
  273. :lib/slf4j-api-1.6.1.jar:lib/slf4j-log4j12-1.6.1.jar:lib/log4j-1.2.15.jar -Dlog4j.configuration=log4j.properties\
  274. org.apache.bookkeeper.proto.BookieServer 3181 127.0.0.1:2181 /path_to_log_device/\
  275. /path_to_ledger_device/
  276. </span>
  277. </p>
  278. <p> "/path_to_log_device/" and "/path_to_ledger_device/" are different paths. Also, port 3181
  279. is the port that a bookie listens on for connection requests from clients. 127.0.0.1:2181 is the hostname:port
  280. for the ZooKeeper server. In this example, the standalone ZooKeeper server is running locally on port 2181.
  281. If we had multiple ZooKeeper servers, this parameter would be a comma separated list of all the hostname:port
  282. values corresponding to them.
  283. </p>
  284. <a name="bk_setupZK"></a>
  285. <h3 class="h4">Setting up ZooKeeper</h3>
  286. <p> ZooKeeper stores metadata on behalf of BookKeeper clients and bookies. To get a minimal
  287. ZooKeeper installation to work with BookKeeper, we can set up one server running in
  288. standalone mode. Once we have the server running, we need to create a few znodes:
  289. </p>
  290. <ol>
  291. <li>
  292. <p>
  293. <span class="codefrag computeroutput">
  294. /ledgers
  295. </span>
  296. </p>
  297. </li>
  298. <li>
  299. <p>
  300. <span class="codefrag computeroutput">
  301. /ledgers/available
  302. </span>
  303. </p>
  304. </li>
  305. <li>
  306. <p> For each bookie, we add one znode such that the name of the znode is the
  307. concatenation of the machine name and the port number that the bookie is
  308. listening on. For example, if a bookie is running on bookie.foo.com an is listening
  309. on port 3181, we add a znode
  310. <span class="codefrag computeroutput">/ledgers/available/bookie.foo.com:3181</span>.
  311. </p>
  312. </li>
  313. </ol>
  314. <a name="bk_example"></a>
  315. <h3 class="h4">Example</h3>
  316. <p>
  317. In the following excerpt of code, we:
  318. </p>
  319. <ol>
  320. <li>
  321. <p>
  322. Create a ledger;
  323. </p>
  324. </li>
  325. <li>
  326. <p>
  327. Write to the ledger;
  328. </p>
  329. </li>
  330. <li>
  331. <p>
  332. Close the ledger;
  333. </p>
  334. </li>
  335. <li>
  336. <p>
  337. Open the same ledger for reading;
  338. </p>
  339. </li>
  340. <li>
  341. <p>
  342. Read from the ledger;
  343. </p>
  344. </li>
  345. <li>
  346. <p>
  347. Close the ledger again;
  348. </p>
  349. </li>
  350. </ol>
  351. <pre class="code">
  352. LedgerHandle lh = bkc.createLedger(ledgerPassword);
  353. ledgerId = lh.getId();
  354. ByteBuffer entry = ByteBuffer.allocate(4);
  355. for(int i = 0; i &lt; 10; i++){
  356. entry.putInt(i);
  357. entry.position(0);
  358. entries.add(entry.array());
  359. lh.addEntry(entry.array());
  360. }
  361. lh.close();
  362. lh = bkc.openLedger(ledgerId, ledgerPassword);
  363. Enumeration&lt;LedgerEntry&gt; ls = lh.readEntries(0, 9);
  364. int i = 0;
  365. while(ls.hasMoreElements()){
  366. ByteBuffer origbb = ByteBuffer.wrap(
  367. entries.get(i++));
  368. Integer origEntry = origbb.getInt();
  369. ByteBuffer result = ByteBuffer.wrap(
  370. ls.nextElement().getEntry());
  371. Integer retrEntry = result.getInt();
  372. }
  373. lh.close();
  374. </pre>
  375. </div>
  376. <p align="right">
  377. <font size="-2"></font>
  378. </p>
  379. </div>
  380. <!--+
  381. |end content
  382. +-->
  383. <div class="clearboth">&nbsp;</div>
  384. </div>
  385. <div id="footer">
  386. <!--+
  387. |start bottomstrip
  388. +-->
  389. <div class="lastmodified">
  390. <script type="text/javascript"><!--
  391. document.write("Last Published: " + document.lastModified);
  392. // --></script>
  393. </div>
  394. <div class="copyright">
  395. Copyright &copy;
  396. 2008 <a href="http://www.apache.org/licenses/">The Apache Software Foundation.</a>
  397. </div>
  398. <!--+
  399. |end bottomstrip
  400. +-->
  401. </div>
  402. </body>
  403. </html>