Solutions Big Data

Les Techdays sont l’évènement informatique majeur d’Europe. Organisé par Microsoft, c’est un public de professionnel qui se retrouve pour aborder de nombreux thèmes de l’informatique moderne.
Y être speaker est une opportunité unique de transmettre ses connaissances et j’ai eu la chance de pouvoir le faire. Cette année, le thème choisi par Microsoft, « Ambient Intelligence », ne pouvait pas mieux tomber. Tout d’abord parce que l’Ambient Intelligence c’est l’IOT (Internet Of Things), soit l’internet des objets. Pouvoir interconnecter tout type de matériel, sous une pléthore de protocoles, c’est techniquement très intéressant et fonctionnellement épatant. Un exemple ? Penser à la fourniture d’électricité. Le gros problème actuel en matière de production est que nous ne savons pas stocker l’électricité (plus précisément, nous savons, mais pas pour la puissance requise pour alimenter toute une ville pendant plusieurs instants) mais juste la produire. Produire de l’électricité, outre être néfaste pour l’environnement et coûter cher, exige quand il y a par exemple un pic de consommation à emprunter de l’électivité aux pays limitrophes. Se basant sur la météo, les sociétés de production estiment les consommations éventuelles et le comportement des individus par zones. L’IOT permettra (elle le permet déjà dans certaines villes où des expérimentations sont en cours) une analyse en temps réel ou pseudo-temps réel (avec un léger décalage de temps) des consommations. Ceci exige des compteurs intelligents. Le réseau électrique ainsi obtenu porte le nom de « SmartGrid », des grilles électriques intelligentes.

Il y a plein d’autres exemples. Un réfrigérateur qui sait le moment opportun pour commander des produits, une maison qui fait monter le chauffage quand votre voiture se rapproche, des panneaux de signalisation qui changent en fonction du nombre de voitures, etc.

L’Ambient Intelligence c’est donc top. Avoir un public de plus de 200 personnes et avec mes collègues leur parler des protocoles réseau IOT c’était génial.

Zigbee, vous connaissez ? C’est un protocole à rayon faible, plutôt lent, mais à fiabilité élevée. Les appareils compatibles interagissent entre eux en prenant différents rôles, notamment Coordinator, Router ou End Device. La fréquence d’usage est 868 MHz.

Il y a aussi Z-Wave. C’est un protocole radio inventé pour la domotique à faible puissance  et bande passante; ce qui permet à des objets légers d’y participer sans y perdre trop d’énergie. Il supporte jusqu’à 232 appareils dans un rayon de 50m. La fréquence est également 868 MHz et il y a une alliance de fabricants Z-Wave.

Mais il y en a plein d’autres, des forts connus comme le Bluetooth (dont les dernières implémentations cherchent à réduire l’énergie d’usage nécessaire) ou 6LoWPAN (IPv6 Low Power Wireless Personal Area Network) dont le but est de faire un réseau personnel d’objets à base d’IPv6 (Fréquence de 900 MHz et 2.4Ghz).

L’IOT a également permis l’apparition d’un nouveau concept. On connaissait le LAN (Local Area Network), le WAN (Wide Area Network), nous avons désormais droit au PAN (Personal Area Network), un réseau personnel d’objets communicants.

Mais l’Ambient Intelligence ne se borne pas aux objets

L’ambient intelligence dévoile de façon sous-jacente une autre problématique. Celle du Big Data ! En effet, le volume de données récoltées par les objets du PAN, peut servir à différents niveaux et différentes fins. La récolte de données unitaires personnelles permet, lorsqu’elle est agrégée à l’ensemble d’une population, la détermination de tendances et comportements.

Car le BigData ne se borne pas à la collecte de données, mais bien à son analyse ! La bonne nouvelle pour ces Techdays, c’est que je suis certifié MongoDB.

Ont ainsi été abordées toutes les problématiques sous-jacentes du BigData, et elles sont nombreuses.

Tout d’abord, c’est un Buzz Word. Il est utilisé à tout va par différents éditeurs, sociétés de conseil et fabricant sans qu’on en comprenne totalement la teneur.

Le BigData est né des problématiques des acteurs majeurs de l’internet à pouvoir stocker sur des serveurs de base de données classique un nombre impressionnant d’item. Par item, j’entends lignes dans des tables SQL. L’adjonction d’index pour augmenter les performances même si elle suit une loi log-normale n’est pas suffisante, car se posent des problématiques de volumétrie (pas assez de RAM, de disque) ainsi que throughput (trop de demandes en simultanée).

Lorsqu’on rencontre un problème de performance nous avons côté IT, nous pensons souvent systématiquement à « monter le matériel ». Rajouter plus de processeurs, plus de disques, de RAM, etc.

Sauf que cela possède une limite lorsque le volume géré dépasse le Go pour atteindre le To ou Po.

La montée du matériel en puissance se nomme le sharding vertical.

Il y a pourtant une autre solution. Qui n’exige pas une machine plus puissante, mais tout simplement une autre machine pour aider la première. Ce sharding horizontal n’est possible que si les logiciels sous-jacents utilisés sont capables de gérer une typologie de répartition des informations.

C’est cela l’apport 1ert du BigData.

Hadoop, codé initialement par Yahoo est devenu un sujet top level sur Apache. Il ne s’agit pourtant initialement que d’un programme Java capable de répartir du file system sur un réseau sans pour autant être un système HA, c’est-à-dire High Availability à l’origine ; Hadoop ayant au niveau de son namenode un single point of failure ; c’est depuis contournable.

C’est ajouté sur Hadoop d’autres fonctionnalités comme Apache Hive qui perm et d’interroger ses données comme du SQL (née et utilisé p Facebook pour des besoins de recherche de données (datamining). Mire propose une console d’interrogation, Hive CLI (Commande line Interface).

Hive n’existe pas seul, il y a également Pig originellement créé par Yahoo Research permettant de créer et exécuter du Map/Reduce (opération consistant à découper une tâche en sous-ensembles d’opérations puis à consolider et réduire le tout) sur un ensemble de données (Dataset) large. Pig est concrètement un compilateur qui produit des programmes de Map/Reduce. Pig vient avec un langage pour sa plateforme, Pig latin, que l’utilisateur peut étendre grâce à des UDF (fonctions définies par l’utilisateur) codées en Jana, Python, Ruby ou Groovy.

Le Big Data c’est aussi des technologies comme Storm qui existe pour le calcul temps réel distribué supportant la montée en charge, la tolérance de pannes, s’appuyant sur un pipeline de traitement. Développé en clojure (un dérivé de Java) Storm fait ce que l’on nomme du Stream Processing, c’est-à-dire un traitement en mode flux. Il supporte le micro batching avec Trident mais son fonctionnement de base reste le Stream. Au d’niveau core, il fonctionne à base de Spouts et de Bolts, c’est-à-dire processus d’écoute, et traitements.

Il y a aussi Spark, le concurrent de Storm pour le traitement des données en mode micro-batching/flux mais ce n’est pas tout. Il y a aussi les technologies de Machine Learning comme Apache Mahaut.

Une minute. Mais où est Microsoft dans tout ça ?

Chez Microsoft, il y a l’appliance PDW(Parallel Data Warehouse) que j’ai eu l’occasion de tester chez un client. Intégré depuis dans une solution plus généralement nommée APS, Analatycal Platform System, cette solution à base de SQL Server est juste démentielle pour faire du sharding horizontale. On peut, avec  HDInsight y connecter de l’Hadoop et interroger directement à la fois les données structurées PDW et non-structurées Hadoop avec Polybase, la technologie de Microsoft pour effectuer des requêtes en mode SQL .

Il y a, côté Azure, DocumentDB pour faire du stockage en mode document comme MongoDB. DocumentDB est notamment utilisée par la solution Office 365. Il y a aussi HDInsight dont j’ai parlé précédemment et aussi Elastic Squale qui permet de faire du sharding horizontal sur les bases de données SQL Server. Il y a aussi Azure Machine Learning, solution utilisée notamment par de nombreux Xbox.

 

« Je ne comprends pas pourquoi les gens ne sont pas inquiets [pour l’intelligence artificielle] » Bill Gates

Connecter votre bracelet Fitbit à Microsoft Azure

Vous possédez un bracelet FitBit ? Alors récupérer vos données et déployez dans du MongoDB via Azure !

MongoDB ? Oui, la solution BigData. Elle est disponible dans Azure via Mongolab dans le Marketplace (je vous laisse chercher comment faire ^^). Vous récupérez une variable d’environnement nommée CUSTOMCONNSTR_MONGOLAB_URI ci-dessous.

Déployez ensuite un site web dans Azure (pour ma part, je l’ai appelé Novencia Fitness), utilisez OAUTH pour récupérer les données de FitBit. En effet, celle-ci sont stockées sur le site de l’éditeur. Il nous faut brancher leur site au notre. Ne reste plus qu’à faire la plomberie, je vous donne ici le code du contrôleur.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Fitbit;
using Fitbit.Api;
using System.Configuration;
using Fitbit.Models;
using MongoDB.Driver;

namespace NovenciaFitness.Controllers
{
public class FitbitController : Controller
{
MongoClient client = null;
MongoDatabase database = null;

public MongoDatabase MongoDBD
{
get
{
if (client == null)
{
// client = new MongoClient(connectionString);
client = new MongoClient(System.Environment.GetEnvironmentVariable(« CUSTOMCONNSTR_MONGOLAB_URI »));
var server = client.GetServer();

database = server.GetDatabase(« MongoLab-g »);
}

return database;
}
}
//
// GET: /Fitbit/

public ActionResult Index()
{
return View();
}

//
// GET: /FitbitAuth/
// Setup – prepare the user redirect to Fitbit.com to prompt them to authorize this app.
public ActionResult Authorize()
{

//make sure you’ve set these up in Web.Config under <appSettings>:
string ConsumerKey = ConfigurationManager.AppSettings[« FitbitConsumerKey »];
string ConsumerSecret = ConfigurationManager.AppSettings[« FitbitConsumerSecret »];
Fitbit.Api.Authenticator authenticator = new Fitbit.Api.Authenticator(ConsumerKey,
ConsumerSecret,
« http://api.fitbit.com/oauth/request_token »,
« http://api.fitbit.com/oauth/access_token »,
« http://api.fitbit.com/oauth/authorize »);
RequestToken token = authenticator.GetRequestToken();
Session.Add(« FitbitRequestTokenSecret », token.Secret.ToString()); //store this somehow, like in Session as we’ll need it after the Callback() action

//note: at this point the RequestToken object only has the Token and Secret properties supplied. Verifier happens later.

string authUrl = authenticator.GenerateAuthUrlFromRequestToken(token, true);
return Redirect(authUrl);
}

//Final step. Take this authorization information and use it in the app
public ActionResult Callback()
{
RequestToken token = new RequestToken();
token.Token = Request.Params[« oauth_token »];
token.Secret = Session[« FitbitRequestTokenSecret »].ToString();
token.Verifier = Request.Params[« oauth_verifier »];

string ConsumerKey = ConfigurationManager.AppSettings[« FitbitConsumerKey »];
string ConsumerSecret = ConfigurationManager.AppSettings[« FitbitConsumerSecret »];

//this is going to go back to Fitbit one last time (server to server) and get the user’s permanent auth credentials

//create the Authenticator object
Fitbit.Api.Authenticator authenticator = new Fitbit.Api.Authenticator(ConsumerKey,
ConsumerSecret,
« http://api.fitbit.com/oauth/request_token »,
« http://api.fitbit.com/oauth/access_token »,
« http://api.fitbit.com/oauth/authorize »);
//execute the Authenticator request to Fitbit
AuthCredential credential = authenticator.ProcessApprovedAuthCallback(token);

//here, we now have everything we need for the future to go back to Fitbit’s API (STORE THESE):
//  credential.AuthToken;
//  credential.AuthTokenSecret;
//  credential.UserId;

// For demo, put this in the session managed by ASP.NET
Session[« FitbitAuthToken »] = credential.AuthToken;
Session[« FitbitAuthTokenSecret »] = credential.AuthTokenSecret;
Session[« FitbitUserId »] = credential.UserId;

return RedirectToAction(« Index », « Home »);

}

public string TestTimeSeries()
{
FitbitClient client = GetFitbitClient();

var results = client.GetTimeSeries(TimeSeriesResourceType.DistanceTracker, DateTime.UtcNow.AddDays(-7), DateTime.UtcNow);

string sOutput = «  »;
foreach (var result in results.DataList)
{
sOutput += result.DateTime.ToString() +  » –  » + result.Value.ToString();
}

return sOutput;

}

public ActionResult LastWeekDistance()
{
FitbitClient client = GetFitbitClient();

TimeSeriesDataList results = client.GetTimeSeries(TimeSeriesResourceType.Distance, DateTime.UtcNow.AddDays(-7), DateTime.UtcNow);

var collection = MongoDBD.GetCollection<TimeSeriesDataList>(« timeseries »);
collection.Insert(results);

return View(results);
}

public ActionResult LastWeekSteps()
{
FitbitClient client = GetFitbitClient();

TimeSeriesDataList results = client.GetTimeSeries(TimeSeriesResourceType.Steps, DateTime.UtcNow.AddDays(-7), DateTime.UtcNow);

return View(results);

}

//example using the direct API call getting all the individual logs
public ActionResult MonthFat(string id)
{
DateTime dateStart = Convert.ToDateTime(id);

FitbitClient client = GetFitbitClient();

Fat fat = client.GetFat(dateStart, DateRangePeriod.OneMonth);

if (fat == null || fat.FatLogs == null) //succeeded but no records
{
fat = new Fat();
fat.FatLogs = new List<FatLog>();
}
return View(fat);

}

//example using the time series, one per day
public ActionResult LastYearFat()
{
FitbitClient client = GetFitbitClient();

TimeSeriesDataList fatSeries = client.GetTimeSeries(TimeSeriesResourceType.Fat, DateTime.UtcNow, DateRangePeriod.OneYear);

return View(fatSeries);

}

//example using the direct API call getting all the individual logs
public ActionResult MonthWeight(string id)
{
DateTime dateStart = Convert.ToDateTime(id);

FitbitClient client = GetFitbitClient();

Weight weight = client.GetWeight(dateStart, DateRangePeriod.OneMonth);

if (weight == null || weight.Weights == null) //succeeded but no records
{
weight = new Weight();
weight.Weights = new List<WeightLog>();
}
return View(weight);

}

//example using the time series, one per day
public ActionResult LastYearWeight()
{
FitbitClient client = GetFitbitClient();

TimeSeriesDataList weightSeries = client.GetTimeSeries(TimeSeriesResourceType.Weight, DateTime.UtcNow, DateRangePeriod.OneYear);

return View(weightSeries);

}

/// <summary>
/// This requires the Fitbit staff approval of your app before it can be called
/// </summary>
/// <returns></returns>
public string TestIntraDay()
{
FitbitClient client = new FitbitClient(ConfigurationManager.AppSettings[« FitbitConsumerKey »],
ConfigurationManager.AppSettings[« FitbitConsumerSecret »],
Session[« FitbitAuthToken »].ToString(),
Session[« FitbitAuthTokenSecret »].ToString());

IntradayData data = client.GetIntraDayTimeSeries(IntradayResourceType.Steps, new DateTime(2012, 5, 28, 11, 0, 0), new TimeSpan(1, 0, 0));

string result = «  »;

foreach (IntradayDataValues intraData in data.DataSet)
{
result += intraData.Time.ToShortTimeString() +  » –  » + intraData.Value + Environment.NewLine;
}

return result;

}

private FitbitClient GetFitbitClient()
{
FitbitClient client = new FitbitClient(ConfigurationManager.AppSettings[« FitbitConsumerKey »],
ConfigurationManager.AppSettings[« FitbitConsumerSecret »],
Session[« FitbitAuthToken »].ToString(),
Session[« FitbitAuthTokenSecret »].ToString());

return client;
}
}
}

 

dsf