Interrogation de HBase à l'aide de Spark

Pour plus d'informations et d'exemples, reportez-vous à HBase Exemple d'utilisation du connecteur Spark HBase.
  1. Fournissez à l'utilisateur Spark l'opération CRUD dans HBase à l'aide de l'utilisateur "hbase" :
    sudo -u hbase bash
    kinit -kt /etc/security/keytabs/hbase.headless.keytab <Spark-user>  
    hbase shell
    grant 'spark', 'RWXCA'
    exit
  2. Connectez-vous à Ranger.
  3. Sélectionnez le service HBase.
  4. Ajoutez ou mettez à jour une stratégie pour accorder à l'utilisateur Spark l'accès "créer, lire, écrire, exécuter".
  5. Connectez-vous avec un compte utilisateur Spark et créez une table dans HBase :
    sudo su spark  
    (kinit with spark if required)
    hbase shell
    hbase(main):001:0> create 'person', 'p', 'c'
  6. Démarrez spark-shell :
    spark-shell --jars
          /usr/lib/hbase/hbase-spark.jar,/usr/lib/hbase/hbase-spark-protocol-shaded.jar,/usr/lib/hbase/*
          --files /etc/hbase/conf/hbase-site.xml --conf
          spark.driver.extraClassPath=/etc/hbase/conf
  7. Insérez et lisez des données à l'aide de spark-shell :
    • Insertion de données :
      val sql = spark.sqlContext
       
      import java.sql.Date
       
      case class Person(name: String,
      email: String,
      birthDate: Date,
      height: Float)
       
      var personDS = Seq(
      Person("alice", "alice@alice.com", Date.valueOf("2000-01-01"), 4.5f),
      Person("bob", "bob@bob.com", Date.valueOf("2001-10-17"), 5.1f)
      ).toDS
       
      personDS.write.format("org.apache.hadoop.hbase.spark")
      .option("hbase.columns.mapping",
      "name STRING :key, email STRING c:email, " +
      "birthDate DATE p:birthDate, height FLOAT p:height")
      .option("hbase.table", "person")
      .option("hbase.spark.use.hbasecontext", false)
      .save()

      Résultats :

      shell> scan 'person'
      ROW       COLUMN+CELL
       alice    column=c:email, timestamp=1568723598292, value=alice@alice.com
       alice    column=p:birthDate, timestamp=1568723598292, value=\x00\x00\x00\xDCl\x87 \x00
       alice    column=p:height, timestamp=1568723598292, value=@\x90\x00\x00
       bob      column=c:email, timestamp=1568723598521, value=bob@bob.com
       bob      column=p:birthDate, timestamp=1568723598521, value=\x00\x00\x00\xE9\x99u\x95\x80
       bob      column=p:height, timestamp=1568723598521, value=@\xA333
      2 row(s)
    • Lecture de données :
      val sql = spark.sqlContext
      
      val df = sql.read.format("org.apache.hadoop.hbase.spark")
       .option("hbase.columns.mapping",
         "name STRING :key, email STRING c:email, " +
           "birthDate DATE p:birthDate, height FLOAT p:height")
       .option("hbase.table", "person")
       .option("hbase.spark.use.hbasecontext", false)
       .load()
      df.createOrReplaceTempView("personView")
      
      val results = sql.sql("SELECT * FROM personView WHERE name = 'alice'")
      results.show()