[JAVA] Compter la fréquence d'apparition des mots dans une phrase par traitement de flux (Apache Apex)

De Comptage de la fréquence d'occurrence des mots dans les phrases par traitement de flux \ (Apache Apex ) \ -Modèle de phrase mauvais

Ancienne histoire

Webinar: Building Your First Apache Apex Application - YouTube

Les choses nécessaires

environnement

OS

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.1 LTS"

Java

$ java -version
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-8u131-b11-0ubuntu1.16.04.2-b11)
OpenJDK 64-Bit Server VM (build 25.131-b11, mixed mode)
$ javac -version
javac 1.8.0_131

git

$ git version
git version 2.7.4

Maven

$ mvn --version
Apache Maven 3.3.9
Maven home: /usr/share/maven
Java version: 1.8.0_131, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-8-openjdk-amd64/jre
Default locale: en_US, platform encoding: ISO-8859-1
OS name: "linux", version: "4.4.0-57-generic", arch: "amd64", family: "unix"

Hadoop

$ hadoop version
Hadoop 2.8.0
Subversion https://git-wip-us.apache.org/repos/asf/hadoop.git -r 91f2b7a13d1e97be65db92ddabc627cc29ac0009
Compiled by jdu on 2017-03-17T04:12Z
Compiled with protoc 2.5.0
From source with checksum 60125541c2b3e266cbf3becc5bda666
This command was run using /usr/local/hadoop/share/hadoop/common/hadoop-common-2.8.0.jar

git clone

Tout d'abord, clonez le référentiel requis. Il y en a trois à utiliser: ʻapex-core, ʻapex-malhar et DataTorrent / examples. Créez un répertoire ʻapex` chez vous et travaillez-y.

~


$ mkdir apex
$ cd apex

~/apex


$ git clone [email protected]:apache/apex-core.git
$ git clone [email protected]:apache/apex-malhar.git
$ git clone [email protected]:DataTorrent/examples.git

Installation Apex

Construisez et installez ʻapex-core et ʻapex-malhar sur maven. Ignorez l'exécution du test avec -DskipTests et il se terminera (légèrement) plus rapidement. Cela prend du temps, alors attendez un peu: café:

~/apex


$ ls              
apex-core   apex-malhar examples
$ cd apex-core

~/apex/apex-core


$ mvn clean install -DskipTests

~/apex


$ cd apex-malhar

~/apex/apex-malhar


$ mvn clean install -DskipTests

Outil pratique

Préparez les outils pendant que vous attendez la fin de la construction. Il y a un script appelé ʻaliasesdansDataTorrent / examples`, donc chargez-le et rendez-le utilisable.

~/apex


$ source examples/tutorials/topnwords/scripts/aliases

Le contenu des «alias» est le suivant.

~/apex/examples/tutorials/topnwords/scripts/aliases


# bash aliases and functions useful for working on input and out directories
#

# input and output directories
in=/tmp/test/input-dir out=/tmp/test/output-dir

# list files in input directory
alias ls-input="hdfs dfs -ls $in"

# list files in output directory
alias ls-output="hdfs dfs -ls $out"

# clean input directory
alias clean-input="hdfs dfs -rm $in/*"

# clean output directory
alias clean-output="hdfs dfs -rm $out/*"

# convenient alias to run dtcli from code repository
alias dtcli3="$HOME/src/incubator-apex-core/engine/src/main/scripts/dtcli"

# copy local file (argument) to input directory
function put-file ( ) {
    hdfs dfs -put "$1" "$in"
}

# make local copy of output file (argument) from output directory
function get-file ( ) {
    hdfs dfs -get "$out/$1" "$1".out
}

Facilitez la copie et appelez newapp vers ~ / apex.

~/apex


$ cp examples/tutorials/topnwords/scripts/newapp .

C'est juste une commande mvn, et vous pouvez réécrire myapexapp si nécessaire.

~/apex/examples/tutorials/topnwords/scripts/newapp



#!/bin/bash
# script to create a new project
 
# change project name and archetype version as needed
name=myapexapp
version=3.3.0-incubating

mvn -B archetype:generate \
  -DarchetypeGroupId=org.apache.apex \
  -DarchetypeArtifactId=apex-app-archetype \
  -DarchetypeVersion=$version  \
  -DgroupId=com.example \
  -Dpackage=com.example.$name \
  -DartifactId=$name \
  -Dversion=1.0-SNAPSHOT

Création de projet

Exécutez newapp pour créer un projet. Lorsque Y :: apparaît, entrez-y (Tournez!).

~/apex


$ bash newapp
[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO] 
...
$ ls
apex-core   apex-malhar examples myapexapp newapp
$ cd myapexapp

Après avoir créé le projet, vérifiez le code source.

~/apex/myapexapp


$ find src -name "*.java"
src/main/java/com/example/myapexapp/Application.java
src/main/java/com/example/myapexapp/RandomNumberGenerator.java
src/test/java/com/example/myapexapp/ApplicationTest.java

Je n'ai pas besoin d'un test unitaire cette fois, alors je vais le laisser. De cette façon, si vous oubliez -DskipTests au moment de la construction, les tests ne seront pas exécutés. Cette fois, je l'ai sauvegardé dans / tmp, mais vous pouvez bien sûr le supprimer.

~/apex/myapexapp


$ mv src/test/java/com/example/myapexapp/ApplicationTest.java /tmp

Exemple de code introduit

Introduisez le code pour DataTorrent / examples. Commencez par aller dans le répertoire source.

~/apex/myapexapp


$ cd src/main/java/com/example/myapexapp

Apportez le code source de tutorial / topnwords. Sort la fréquence d'occurrence de chaque mot dans la phrase d'entrée. Les détails sont omis.

$ ls   
Application.java           RandomNumberGenerator.java
$ ls ~/apex/examples/tutorials/topnwords/webinar/
ApplicationWordCount.java      WCPair.java                    WordReader.java
FileWordCount.java             WindowWordCount.java           properties-SortedWordCount.xml
LineReader.java                WordCountWriter.java
$ cp ~/apex/examples/tutorials/topnwords/webinar/*.java .
$ ls
Application.java           LineReader.java            WindowWordCount.java
ApplicationWordCount.java  RandomNumberGenerator.java WordCountWriter.java
FileWordCount.java         WCPair.java                WordReader.java

Nous avons également besoin d'un fichier de propriétés, donc copiez-le également dans resources.

$ cd ../../../../resources/META-INF 
$ cp ~/apex/examples/tutorials/topnwords/webinar/properties-SortedWordCount.xml .
$ ls
properties-SortedWordCount.xml properties.xml

Créer une application

Accédez au répertoire supérieur de l'application et créez. Après la construction, myapexapp-1.0-SNAPSHOT.apa est créé dans le répertoire target.

$ cd ~/apex/myapexapp

~/apex/myapexapp


$ mvn clean package -DskipTests
$ ls target 
antrun                     generated-resources        maven-archiver             site
archive-tmp                generated-sources          maven-status               test-classes
classes                    generated-test-sources     myapexapp-1.0-SNAPSHOT.apa
deps                       javadoc-bundle-options     myapexapp-1.0-SNAPSHOT.jar

Lancer l'application

Utilisez les outils CLI Apex (https://apex.apache.org/docs/apex/apex_cli/#apex-cli-commands) pour exécuter l'application générée. Il est sous ʻapex-core, alors lancez-le dans le répertoire myapexapp`.

~/apex/myapexapp


$ ../apex-core/engine/src/main/scripts/apex 
Apex CLI 3.7.0-SNAPSHOT 02.06.2017 @ 09:02:30 JST rev: 22feeed branch: master
apex> 

Tapez ensuite launch target / myapexapp-1.0-SNAPSHOT.apa pour l'exécuter. Il vous sera demandé si vous souhaitez exécuter MyFirstApplication ou SortedWordCount, donc si vous sélectionnez 2, l'application fonctionnera et ʻappId` sera émis.

apex> launch target/myapexapp-1.0-SNAPSHOT.apa
  1. MyFirstApplication
  2. SortedWordCount
Choose application: 2
{"appId": "application_1496704660177_0001"}
apex (application_1496704660177_0001) > 

Contrôle de fonctionnement

Tout d'abord, créez un répertoire d'entrée / sortie avec hdfs dfs.

$ hdfs dfs -mkdir -p /tmp/test/input-dir
$ hdfs dfs -mkdir -p /tmp/test/output-dir

Il n'y a encore rien à ce stade.

$ ls-input
...Rien ne s'affiche
$ ls-output
...Rien ne s'affiche

Mettez un fichier texte dans le répertoire d'entrée en utilisant put-file défini dans ʻaliaces. Cette fois, j'ai créé une phrase en anglais sur https://www.dummytextgenerator.com et l'ai enregistrée sous le nom dummy.txt`.

$ ls -lh ~/*.txt
/home/user/dummy.txt
$ put-file ~/dummy.txt

Si vous faites ls-input, vous trouverez le même fichier texte qu'auparavant.

$ ls-input
Found 1 items
-rw-r--r--   1 vagrant supergroup      15167 2017-06-06 04:34 /tmp/test/input-dir/dummy.txt

Lorsque vous faites ls-output, le fichier de sortie est créé, alors vérifiez le contenu.

$ ls-output
Found 1 items
-rwxrwxrwx   1 vagrant supergroup       3028 2017-06-06 04:34 /tmp/test/output-dir/dummy.txt
$ hdfs dfs -cat /tmp/test/output-dir/dummy.txt | head
t : 75
you : 43
re : 29
sixth : 22
seasons : 22
creature : 22
every : 22
moved : 20
together : 20
subdue : 20

La fréquence d'apparition des mots était sortie correctement!

Recommended Posts

Compter la fréquence d'apparition des mots dans une phrase par traitement de flux (Apache Apex)
Comptage de la fréquence d'apparition des mots dans les phrases par traitement de flux (Apache Apex) Partie 2 Codage
Un programme qui compte le nombre de mots dans une liste
Ordre de traitement dans le programme
Nommer et appeler explicitement des méthodes de classe parent dans Ruby
Spécialiste de la sécurité de l'automne 2017 J'ai vérifié la fréquence des mots qui apparaissaient le matin 2
Mesurer la taille d'un dossier avec Java
[Java] Informations entières des caractères du fichier texte acquises par la méthode read ()
Ecrire un test en mettant en œuvre l'histoire de M. Nabeats dans le monde avec du rubis
Une revue du code utilisé par les rails débutants
Format de la sortie du journal par Tomcat lui-même dans Tomcat 8
À propos du problème de blocage dans le traitement parallèle dans la version 4.0 de gem'sprockets
Traitement d'image: structure de base de l'image lue par le programme
À propos de l'ajout de variables dans le traitement itératif dans l'instruction while
Traitement de branche avec la valeur de retour de RestTemplate et le code d'état de ResponseEntity dans Spring Boot