diff --git a/Dockerfile b/Dockerfile index dd94fa9..fba8575 100644 --- a/Dockerfile +++ b/Dockerfile @@ -57,8 +57,8 @@ RUN bash -c "if [ ! -f /opt/ros_hadoop/master/dist/HMB_4.bag ] ; then wget --qui java -jar "$ROSIF_JAR" -f /opt/ros_hadoop/master/dist/HMB_4.bag RUN bash -c "/start_hadoop.sh" && \ - /opt/apache/hadoop/bin/hdfs dfsadmin -report && \ /opt/apache/hadoop/bin/hdfs dfsadmin -safemode wait && \ + /opt/apache/hadoop/bin/hdfs dfsadmin -report && \ /opt/apache/hadoop/bin/hdfs dfs -mkdir /user && \ /opt/apache/hadoop/bin/hdfs dfs -mkdir /user/root && \ /opt/apache/hadoop/bin/hdfs dfs -put /opt/ros_hadoop/master/dist/HMB_4.bag && \ diff --git a/build.sbt b/build.sbt index 4949ce9..2b1582c 100644 --- a/build.sbt +++ b/build.sbt @@ -5,7 +5,7 @@ lazy val root = (project in file(".")). inThisBuild(List( organization := "org.apache.spark.input", scalaVersion := "2.11.8", - version := "0.9.5" + version := "0.9.8" )), name := "RosbagInputFormat", libraryDependencies ++= Seq( diff --git a/doc/Rosbag larger than 2 GB.ipynb b/doc/Rosbag larger than 2 GB.ipynb new file mode 100644 index 0000000..4c653ec --- /dev/null +++ b/doc/Rosbag larger than 2 GB.ipynb @@ -0,0 +1,211 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Let us have a look at a 20 GB Rosbag file\n", + "**Note** data can be found for instance at https://github.com/udacity/self-driving-car/tree/master/datasets published under MIT License.\n", + "\n", + "The file is not distributed over the Dockerfile but you can download it and put it into HDFS." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-rw-r--r-- 1 root root 20G Mar 7 15:16 /root/project/doc/el_camino_north.bag\n" + ] + } + ], + "source": [ + "%%bash\n", + "\n", + "ls -tralFh /root/project/doc/el_camino_north.bag" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Found 2 items\n", + "-rw-r--r-- 1 root supergroup 331.6 M 2018-03-06 20:50 HMB_4.bag\n", + "-rw-r--r-- 1 root supergroup 19.7 G 2018-03-07 15:28 el_camino_north.bag\n" + ] + } + ], + "source": [ + "%%bash\n", + "\n", + "# same size, no worries, just the -h (human) formating differs in rounding \n", + "hdfs dfs -ls -h" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Show that the we can read the index\n", + "\n", + "Solved the issue https://github.com/valtech/ros_hadoop/issues/6 \n", + "\n", + "The issue was due to ByteBuffer being limitted by JVM Integer size and has nothing to do with Spark or how the RosbagMapInputFormat works within Spark. It was only problematic to extract the conf index with the jar.\n", + "\n", + "Integer.MAX_SIZE is 2 GB !!" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 10 ms, sys: 0 ns, total: 10 ms\n", + "Wall time: 1.18 s\n" + ] + } + ], + "source": [ + "%%time\n", + "\n", + "out = !java -jar ../lib/rosbaginputformat.jar -f /root/project/doc/el_camino_north.bag" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-rw-r--r-- 1 root root 20G Mar 7 15:16 /root/project/doc/el_camino_north.bag\n", + "-rw-r--r-- 1 root root 62K Mar 7 15:41 /root/project/doc/el_camino_north.bag.idx.bin\n" + ] + } + ], + "source": [ + "%%bash\n", + "ls -tralFh /root/project/doc/el_camino_north.bag*" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Create the Spark Session or get an existing one" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "from pyspark import SparkContext, SparkConf\n", + "from pyspark.sql import SparkSession\n", + "\n", + "sparkConf = SparkConf()\n", + "sparkConf.setMaster(\"local[*]\")\n", + "sparkConf.setAppName(\"ros_hadoop\")\n", + "sparkConf.set(\"spark.jars\", \"../lib/protobuf-java-3.3.0.jar,../lib/rosbaginputformat.jar,../lib/scala-library-2.11.8.jar\")\n", + "\n", + "spark = SparkSession.builder.config(conf=sparkConf).getOrCreate()\n", + "sc = spark.sparkContext" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Create an RDD from the Rosbag file\n", + "**Note:** your HDFS address might differ." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "fin = sc.newAPIHadoopFile(\n", + " path = \"hdfs://127.0.0.1:9000/user/root/el_camino_north.bag\",\n", + " inputFormatClass = \"de.valtech.foss.RosbagMapInputFormat\",\n", + " keyClass = \"org.apache.hadoop.io.LongWritable\",\n", + " valueClass = \"org.apache.hadoop.io.MapWritable\",\n", + " conf = {\"RosbagInputFormat.chunkIdx\":\"/root/project/doc/el_camino_north.bag.idx.bin\"})" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "MapPartitionsRDD[2] at mapPartitions at SerDeUtil.scala:244" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fin" + ] + }, + { + "attachments": { + "image.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### On a laptop it will take some time. So please run it on a real cluster.\n", + "\n", + "![image.png](attachment:image.png)\n", + "\n", + "# Have Fun!" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.12" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/doc/Tutorial.ipynb b/doc/Tutorial.ipynb index d6a3d45..257f44c 100644 --- a/doc/Tutorial.ipynb +++ b/doc/Tutorial.ipynb @@ -12,8 +12,12 @@ "Example data can be found for instance at https://github.com/udacity/self-driving-car/tree/master/datasets published under MIT License.\n", "\n", "## Check that the rosbag file version is V2.0\n", + "The code you cloned is located in ```/opt/ros_hadoop/master``` while the latest release is in ```/opt/ros_hadoop/latest```\n", + "\n", + "../lib/rosbaginputformat.jar is a symlink to a recent version. You can replace it with the version you would like to test.\n", + "\n", "```bash\n", - "java -jar lib/rosbaginputformat_2.11-0.9.3.jar --version -f HMB_1.bag\n", + "java -jar ../lib/rosbaginputformat.jar --version -f HMB_1.bag\n", "```\n", "\n", "## Extract the index as configuration\n", @@ -24,45 +28,62 @@ }, { "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Current working directory: /opt/ros_hadoop/latest/doc\n", + "\n", + "\n", + "/opt/ros_hadoop/\n", + "├── latest\n", + "│   ├── doc\n", + "│   ├── lib\n", + "│   ├── project\n", + "│   └── src\n", + "└── master\n", + " ├── bin\n", + " ├── dist\n", + " ├── doc\n", + " ├── lib\n", + " ├── project\n", + " ├── src\n", + " └── target\n", + "\n", + "13 directories\n" + ] + } + ], "source": [ "%%bash\n", - "# assuming you start the notebook in the doc/ folder \n", - "java -jar ../lib/rosbaginputformat_2.11-0.9.3.jar -f /srv/data/HMB_4.bag" + "echo -e \"Current working directory: $(pwd)\\n\\n\"\n", + "\n", + "tree -d -L 2 /opt/ros_hadoop/" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "total 56\n", - "drwxrwxr-x 3 root root 4096 Jun 23 15:07 src/\n", - "drwxrwxr-x 2 root root 4096 Jun 23 15:07 project/\n", - "drwxrwxr-x 2 root root 4096 Jun 23 15:07 lib/\n", - "drwxrwxr-x 2 root root 4096 Jun 23 15:07 doc/\n", - "-rw-rw-r-- 1 root root 650 Jun 23 15:07 build.sbt\n", - "-rw-rw-r-- 1 root root 2776 Jun 23 15:07 README.md\n", - "-rw-rw-r-- 1 root root 638 Jun 23 15:07 NOTICE\n", - "-rw-rw-r-- 1 root root 11476 Jun 23 15:07 LICENSE\n", - "-rw-rw-r-- 1 root root 380 Jun 23 15:07 AUTHORS\n", - "-rw-rw-r-- 1 root root 63 Jun 23 15:07 .gitignore\n", - "drwxrwxr-x 6 root root 4096 Jun 23 15:07 ./\n", - "drwxr-xr-x 3 root root 4096 Jul 14 14:36 ../\n" + "min: 347674885\n", + "idxpos: 347442336 347674885\n", + "Found: 421 chunks\n", + "\n" ] } ], "source": [ "%%bash\n", - "ls -tralF /srv/data/" + "# assuming you start the notebook in the doc/ folder of master (default Dockerfile build)\n", + "java -jar ../lib/rosbaginputformat.jar -f /opt/ros_hadoop/master/dist/HMB_4.bag" ] }, { @@ -77,25 +98,50 @@ "\n", "**Note:** keep the index json file as configuration to your jobs, **do not** put small files in HDFS.\n", "\n", - "For convenience we already provide an example file (/srv/data/HMB_4.bag) in the HDFS under /user/root/\n", + "For convenience we already provide an example file (/opt/ros_hadoop/master/dist/HMB_4.bag) in the HDFS under /user/root/\n", "\n", "```bash\n", - "hdfs dfs -put /srv/data/HMB_4.bag\n", + "hdfs dfs -put /opt/ros_hadoop/master/dist/HMB_4.bag\n", "hdfs dfs -ls\n", "```\n", "\n", "## Process the ros bag file in Spark using the RosbagInputFormat\n", "\n", "![images/header.png](images/header.png)\n", + "\n", + "## Create the Spark Session or get an existing one" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from pyspark import SparkContext, SparkConf\n", + "from pyspark.sql import SparkSession\n", + "\n", + "sparkConf = SparkConf()\n", + "sparkConf.setMaster(\"local[*]\")\n", + "sparkConf.setAppName(\"ros_hadoop\")\n", + "sparkConf.set(\"spark.jars\", \"../lib/protobuf-java-3.3.0.jar,../lib/rosbaginputformat.jar,../lib/scala-library-2.11.8.jar\")\n", + "\n", + "spark = SparkSession.builder.config(conf=sparkConf).getOrCreate()\n", + "sc = spark.sparkContext" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Create an RDD from the Rosbag file\n", "**Note:** your HDFS address might differ." ] }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, + "execution_count": 2, + "metadata": {}, "outputs": [], "source": [ "fin = sc.newAPIHadoopFile(\n", @@ -103,7 +149,7 @@ " inputFormatClass = \"de.valtech.foss.RosbagMapInputFormat\",\n", " keyClass = \"org.apache.hadoop.io.LongWritable\",\n", " valueClass = \"org.apache.hadoop.io.MapWritable\",\n", - " conf = {\"RosbagInputFormat.chunkIdx\":\"/srv/data/HMB_4.bag.idx.bin\"})" + " conf = {\"RosbagInputFormat.chunkIdx\":\"/opt/ros_hadoop/master/dist/HMB_4.bag.idx.bin\"})" ] }, { @@ -120,7 +166,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -164,7 +210,7 @@ " '/vehicle/dbw_enabled']" ] }, - "execution_count": 5, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } diff --git a/lib/rosbaginputformat.jar b/lib/rosbaginputformat.jar index e16615f..e3bddc2 120000 --- a/lib/rosbaginputformat.jar +++ b/lib/rosbaginputformat.jar @@ -1 +1 @@ -rosbaginputformat_2.11-0.9.5.jar \ No newline at end of file +rosbaginputformat_2.11-0.9.8.jar \ No newline at end of file diff --git a/lib/rosbaginputformat_2.11-0.9.5.jar b/lib/rosbaginputformat_2.11-0.9.8.jar similarity index 93% rename from lib/rosbaginputformat_2.11-0.9.5.jar rename to lib/rosbaginputformat_2.11-0.9.8.jar index ad59b46..aa6f53a 100644 Binary files a/lib/rosbaginputformat_2.11-0.9.5.jar and b/lib/rosbaginputformat_2.11-0.9.8.jar differ diff --git a/src/main/scala/Main.scala b/src/main/scala/Main.scala index 57b7151..b08cc1b 100644 --- a/src/main/scala/Main.scala +++ b/src/main/scala/Main.scala @@ -74,7 +74,7 @@ ${RESET}By default will just create the protobuf idx file needed for configurati def process(): Unit = { val fin = new File(pargs("file").asInstanceOf[String]) use(new FileInputStream(fin)) { stream => { - printf("min: %s\n", Math.min(1073741824, fin.length) ) + //printf("min: %s\n", Math.min(1073741824, fin.length) ) val buffer = stream.getChannel.map(READ_ONLY, 0, Math.min(1073741824, fin.length)).order(LITTLE_ENDIAN) val p:RosbagParser = new RosbagParser(buffer) val version = p.read_version() @@ -90,12 +90,15 @@ ${RESET}By default will just create the protobuf idx file needed for configurati return } val idxpos = h.header.fields("index_pos").asInstanceOf[Long] - printf("idxpos: %s %s\n", idxpos, Math.min(1073741824, fin.length) ) + //printf("idxpos: %s %s\n", idxpos, Math.min(1073741824, fin.length) ) val b = stream.getChannel.map(READ_ONLY, idxpos, Math.min(1073741824, fin.length - idxpos)).order(LITTLE_ENDIAN) val pp:RosbagParser = new RosbagParser(b) val c = pp.read_connections(h.header, Nil) val chunk_idx = pp.read_chunk_infos(c) - println("Found: "+chunk_idx.size+" chunks\n") + Console.err.printf(s"""${RESET}${GREEN}Found: """ + + chunk_idx.size + +s""" chunks\n${RESET}It should be the same number reported by rosbag tool.\nIf you encounter any issues try reindexing your file and submit an issue. + ${RESET}\n""") val fout = new FileOutputStream(pargs("file").asInstanceOf[String] + ".idx.bin") val builder = RosbagIdx.newBuilder for(i <- chunk_idx) builder.addArray(i)