Published

03 December 2013

Sharing

Introduction

Importer les données en masse est un travail risqué et laborieux. Au-delà de l'import, il faut en effet vérifier que toutes les données ont été effectivement importées. Si ce n'est pas le cas, il faut déterminer les données non importées pour ne réimporter que celles-ci du fait des contenus très volumineux qu'on peut être amenés à traiter (plusieurs centaines de Go, voire plusieurs To).

Cet article décrit l'approche suivie par BlueXML pour importer les données dans un repository Alfresco Community ou Enterprise.

Solution

La solution repose sur l'utilisation du module bulk import. Ce module permet d'importer les contenus et les méta-données associées si nécessaires.

Dans la version Alfresco Enterprise, le module bulk import a été repris par Alfresco et propose une fonctionnalité d'import "in place" qui évite de recopier les fichiers. Celle-ci n'est pas présente dans la version Alfresco Community et les contenus sont alors importées dans Alfresco.

Implémentation

L'import se fait à l'aide des étapes suivantes :

  • import des données avec bulk_import
  • vérification :

  • calcul d'un find sur les données source

  • calcul d'un find sur les données dans Alfresco, via l'API Alfresco
  • calcul du delta entre les find

  • copie via CIFS des contenus non importés la première fois

  • vérification et copie
  • copie des derniers fichiers à la main si pas trop nombreux

La difficulté de cette implémentation est le mécanisme de calcul du find côté Alfresco car celui-ci est limité par défaut à 100000 vérifications de droits, ce qui posera problème si vous importes plus de 100000 fichiers.

Il faut obligatoirement mettre en place un tél mécanisme de vérification et de contrôle car Alfresco n'importe pas toutes les données, et refuse même d'en importer certains quel que soit le nombre de tentatives. Le contournement le plus simple est donc de copier les contenus récalitrants via CIFS à l'aide d'un rsync.

Import des données via bulk import

Le système de bulk import propose un service web pour importer les données. Après avoir indiqué quelques paramètres, il suffit de l'appeler. Pour être totalement indépendant de la connexion au serveur qui peut dans certains cas interrompre l'import, je vous suggère d'utiliser le script suivant :

#!/bin/sh

#
# LICENSE
# @copyright BlueDolmen 2013
# License Affero GPL
# Use at your own risks
#

#
# Imports content in Alfresco from filesystem through the use of bulk import system
#

LOGIN="admin"
PASSWD="admin"
HOST="localhost:8080"

getTicket () {
        curl -v "http://$HOST/alfresco/service/api/login?u=$LOGIN&pw=$PASSWD"
};

importContent () {
  TICKET="TICKET_88e8978b4973801cd309ff8440fbdee49302b130"

  PARAMS="alf_ticket=$TICKET"
  PARAMS="$PARAMS&sourceDirectory=/data/repository/initial"
  PARAMS="$PARAMS&contentStore=default"
  PARAMS="$PARAMS&targetPath=/Company%20Home/Sites/test/documentLibrary"
  PARAMS="$PARAMS&replaceExisting=false"
  PARAMS="$PARAMS&batchSize=10"
  PARAMS="$PARAMS&numThreads=10"

  #
  # Use only if using for an Alfresco Enterprise
  # -X POST "http://$HOST/alfresco/service/bulkfsimport/inplace/initiate?$PARAMS" \n

  echo curl -v
  echo         -X POST "http://$HOST/alfresco/service/bulkfsimport/initiate?$PARAMS"
  echo         -H "Content-type: text/html;charset=UTF-8"
  echo

  curl -v \
          -X POST "http://$HOST/alfresco/service/bulkfsimport/initiate?$PARAMS" \
          -H "Content-type: text/html;charset=UTF-8"
}

$*

Vérification

Il s'agit de construire 2 fichiers contenant le path absolu de chaque fichier contenu dans l'arborescence source et cible.

Arborescence source

Pour l'arborescence source, un simple find suffit à obtenir cette liste :

find /data/repository/initial > find-initial.txt

Arborescence cible

Pour l'arborescence cible, il faut écrire un script qui construit cette liste :

Comparaison des fichiers 'source' et 'cible'

On obtient finalement 2 fichiers qu'il faut comparer après les avoir nettoyés afin de n'obtenir que les fichiers réellement différents.

Copie des fichiers récalcitrants

Le delta calculé précédemment doit être copié dans Alfresco. Pour cela, il suffit de faire un rsync prenant en paramètre la liste des fichiers à copier :

rsync -avP --files-from diff.txt /mnt/alfresco/Company%20Home/tmp

tmp étant un répertoire créé dans l'entrepôt Alfresco.

Conclusion

Finalement, toutes les données sont copiées

Ressources




blog comments powered by Disqus