hbase analyse timerange retour ancienne version
J'ai une question à propos de hbase scan en utilisant timerange.
J'ai créer un "test" de la table,il a une famille " cf " et une version , après j'ai mis 4 lignes de données dans cette table, et le scan de la table en utilisant timerange, cependant, je reçois une ancienne version de ligne à l'intérieur de la timerange.
par exemple:
create 'test',{NAME=>'cf',VERSIONS=>1}
put 'test','row1','cf:u','value1'
put 'test','row2','cf:u','value2'
put 'test','row3','cf:u','value3'
put 'test','row3','cf:u','value4'
puis-je analyser ce tableau,voici le résultat:
hbase(main):008:0> scan 'test'
ROW COLUMN+CELL
row1 column=cf:u, timestamp=1340259691771, value=value1
row2 column=cf:u, timestamp=1340259696975, value=value2
row3 column=cf:u, timestamp=1340259704569, value=value4
il le droit,row3 avoir la version la plus récente.
cependant,Si j'utilise le scanner avec timerange j'obtiens ceci:
hbase(main):010:0> scan 'test',{TIMERANGE=>[1340259691771,1340259704569]}
ROW COLUMN+CELL
row1 column=cf:u, timestamp=1340259691771, value=value1
row2 column=cf:u, timestamp=1340259696975, value=value2
row3 column=cf:u, timestamp=1340259701085, value=value3
il de retour row3 ancienne version, mais ce tableau j'ai mis la version égale à 1
si j'augmente maxtimestamp ,j'obtiens :
hbase(main):011:0> scan 'test',{TIMERANGE=>[1340259691771,1340259704570]}
ROW COLUMN+CELL
row1 column=cf:u, timestamp=1340259691771, value=value1
row2 column=cf:u, timestamp=1340259696975, value=value2
row3 column=cf:u, timestamp=1340259704569, value=value4
3 ligne(s) dans 0.0330 secondes
C'est bon,je peux le comprendre.
Ce que je veux, c'est le scan d'un tableau à l'intérieur d'un timerange,il retourne uniquement la nouvelle version, je sais qu'il est un TimestampsFilter, cependant que le filtre seulement le support d'horodatage ,pas de plage horaire.
Est-il possible de l'analyse d'un tableau dans un timerange et ne reviennent plus récente version?
J'essaie d'écrire ma propre timerangefilter,voici mon code.
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.util.ArrayList;
import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.filter.FilterBase;
import org.apache.hadoop.hbase.filter.ParseFilter;
import com.google.common.base.Preconditions;
public class TimeRangeFilter extends FilterBase {
private long minTimeStamp = Long.MIN_VALUE;
private long maxTimeStamp = Long.MAX_VALUE;
public TimeRangeFilter(long minTimeStamp, long maxTimeStamp) {
Preconditions.checkArgument(maxTimeStamp >= minTimeStamp, "max timestamp %s must be big than min timestamp %s", maxTimeStamp, minTimeStamp);
this.maxTimeStamp = maxTimeStamp;
this.minTimeStamp = minTimeStamp;
}
@Override
public ReturnCode filterKeyValue(KeyValue v) {
if (v.getTimestamp() >= minTimeStamp && v.getTimestamp() <= maxTimeStamp) {
return ReturnCode.INCLUDE;
} else if (v.getTimestamp() < minTimeStamp) {
//The remaining versions of this column are guaranteed
//to be lesser than all of the other values.
return ReturnCode.NEXT_COL;
}
return ReturnCode.SKIP;
}
public static Filter createFilterFromArguments(ArrayList<byte[]> filterArguments) {
long minTime, maxTime;
if (filterArguments.size() < 2)
return null;
minTime = ParseFilter.convertByteArrayToLong(filterArguments.get(0));
maxTime = ParseFilter.convertByteArrayToLong(filterArguments.get(1));
return new TimeRangeFilter(minTime, maxTime);
}
@Override
public void write(DataOutput out) throws IOException {
//TODO Auto-generated method stub
out.writeLong(minTimeStamp);
out.writeLong(maxTimeStamp);
}
@Override
public void readFields(DataInput in) throws IOException {
//TODO Auto-generated method stub
this.minTimeStamp = in.readLong();
this.maxTimeStamp = in.readLong();
}
}
- Je ajouter ce pot dans hbase HBASE_CLASSPATH dans hbase-env.sh cependant,j'obtiens l'erreur suivante:
org.apache.hadoop.hbase.client.ScannerCallable@a9255c, java.io.IOException: serveur IPC incapables de lire les paramètres d'appel: Erreur dans readFields
OriginalL'auteur dape | 2012-06-21
Vous devez vous connecter pour publier un commentaire.
Dape,
Lorsque vous définissez le max que les versions 1 et ont plus d'une entrée pour une cellule, Hbase pierres tombales anciennes cellules et reçoit et analyse ne peut pas les voir, sauf si bien sûr vous indiquer une fourchette d'horodatage qui est admissible à une seule cellule. Le tombstone cellules ne sont supprimés après un Major_compact est exécuté sur la table, ce qui est quand les anciennes cellules serait cesser d'apparaître.
Pour avoir toujours les dernières cellules à partir d'une analyse tout ce que vous devez faire est d'utiliser la méthode ci-dessous -
OriginalL'auteur sulabhc
vous avez besoin de copier les pots à tous les serveurs de région, et de modifier HBASE_CLASSPATH dans hbase-env.sh sur les serveurs de région en conséquence
vous pouvez spécifier timerange et MaxVersions sur Scanner pour obtenir des anciennes versions à l'intérieur de l'intervalle de temps
OriginalL'auteur Sola Yang
Je pense que c'est exactement le même problème que j'ai rencontré ici: HBase retours d'anciennes valeurs, même avec max versions = 1
Il s'avère être un bug dans hbase.
Voir: https://issues.apache.org/jira/browse/HBASE-10102
OriginalL'auteur Niels Basjes