So far I have worked with MARC21 files in a standalone manner. Now it is time to run MARC analysis in Apache Spark. Here I describe only the first steps, the tool is not ready to run all the analysis which is possible with the standalone manner.
If we the source of the Spark analysis is a file, Spark reads the file in a line-by-line manner. Unual MARC21 files
are big files with thousands or million records in one line. The record separator character is not a line ending character,
but the (in hexadecimal notation)
1d character. The MARC validation tool so far accepts one or more file names as input.
In a Spark context we have to do two steps:
- change MARC files that they contain each record in a separate line
- change code to accept binary string instead of file name
The first step can be done with one line of Bash code:
sed 's/\x1d/\x1d\n/g' marc.mrc > marc-line-separated.mrc
If you have several files, put it into a loop:
FILE=*.mrc for IN in $FILE; do OUT=$(echo $IN | sed 's/.mrc/-line-separated.mrc/') sed 's/\x1d/\x1d\n/g' $IN > $OUT done
I don’t describle the process of the second step, it took an hour or two to adapt the code to work in Spark environment. From the user’s perspect the important thing is to know how to run it.
Running in a local file system
1) Make sure
HADOOP_CONF_DIR is not set. If it is set Spark would like to communicate with Hadoop File System,
and it is not running, the whole process will stop.
if it returns anything else than an empty line, unset it:
2) Run analysis!
spark-submit \ --class de.gwdg.metadataqa.marc.cli.spark.ParallelValidator \ --master local[*] \ target/metadata-qa-marc-0.2-SNAPSHOT-jar-with-dependencies.jar \ --format "tab-separated" \ --fileName output \ --marcVersion MARC21 \ /path/to/\*-line-separated.mrc \
This command has two parts: the first 3 arguments are for Apache Spark, they are the class to run, the number of cores include in the process (* means all), and the jar file which contains the application. The rest are the standard arguments of the MARC analyzer application.
It is important to escape asteriks with the backslash character (
\*), this guarantees, that the shell will
not substitutes that line with the names of all the files matches the pattern.
3) Retrieve output:
The output is a directory, you can extract the results into a single file with the following command:
cat output/part-* > output.csv
Running it with Hadoop
1) Upload files to Hadoop file system:
hdfs dfs -put /path/to/\*-line-separated.mrc /marc
This will upload the files into the /marc directory of Hadoop FS.
2) Make sure that
HADOOP_CONF_DIR is set (we unset it in the local file system example):
if it return empty line, it means it is not set, so set it:
3) Run analysis!
unset spark-submit \ --class de.gwdg.metadataqa.marc.cli.spark.ParallelValidator \ --master local[*] \ target/metadata-qa-marc-0.2-SNAPSHOT-jar-with-dependencies.jar \ --format "tab-separated" \ --fileName hdfs://localhost:54310/output \ --marcVersion MARC21 \ hdfs://localhost:54310/marc21/*-line-separated.mrc \
4) Retrieve output:
hdfs dfs -getmerge /marc21/* output.csv