Java Spark Streaming:使用PairRDD.saveAsNewHadoopDataset函数将数据保存到HBase

Java Spark Streaming:使用PairRDD.saveAsNewHadoopDataset函数将数据保存到HBase,java,hadoop,apache-spark,hbase,spark-streaming,Java,Hadoop,Apache Spark,Hbase,Spark Streaming,我想在HBase数据库中保存一个Twitter流。我现在拥有的是用于接收和转换数据的Saprk应用程序。但我不知道如何将我的推特流保存到HBase 我发现唯一有用的是pairdd.saveAsNewAPIHadoopDataset(conf)方法。但是我应该如何使用它,我必须进行哪些配置才能将RDD数据保存到我的HBase表中 我唯一找到的是HBase客户端库,它可以通过Put对象将数据插入表中。但这不是Spark程序内部的解决方案,是不是(有必要迭代RDD中的所有项!!) 有人能举一个JAVA

我想在HBase数据库中保存一个Twitter流。我现在拥有的是用于接收和转换数据的Saprk应用程序。但我不知道如何将我的推特流保存到HBase

我发现唯一有用的是
pairdd.saveAsNewAPIHadoopDataset(conf)
方法。但是我应该如何使用它,我必须进行哪些配置才能将RDD数据保存到我的HBase表中

我唯一找到的是HBase客户端库,它可以通过Put对象将数据插入表中。但这不是Spark程序内部的解决方案,是不是(有必要迭代RDD中的所有项!!)

有人能举一个JAVA的例子吗?我的主要问题似乎是
org.apache.hadoop.conf.Configuration
实例的设置,我必须在
saveAsNewAPIHadoopDataset
中提交

下面是一段代码片段:

JavaReceiverInputDStream<Status> statusDStream = TwitterUtils.createStream(streamingCtx);

JavaPairDStream<Long, String> statusPairDStream = statusDStream.mapToPair(new PairFunction<Status, Long, String>() {
    public Tuple2<Long, String> call(Status status) throws Exception {
        return new Tuple2<Long, String> (status.getId(), status.getText());
    }
});

statusPairDStream.foreachRDD(new Function<JavaPairRDD<Long,String>, Void>() {
    public Void call(JavaPairRDD<Long, String> status) throws Exception {
        org.apache.hadoop.conf.Configuration conf = new Configuration();
        status.saveAsNewAPIHadoopDataset(conf);
        // HBase PUT here can't be correct!?
        return null;
    }
});
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.RowFactory;
import org.apache.spark.sql.types.DataTypes;
import org.apache.spark.sql.types.StructField;
import org.apache.spark.sql.types.StructType;
....


  public static void processYourMessages(final JavaRDD<YourMessage> rdd, final HiveContext sqlContext, 
                    , MyMessageUtil messageutil) throws Exception {
        final JavaRDD<Row> yourrdd = rdd.filter(msg -> messageutil.filterType(.....) // create a java rdd
        final JavaPairRDD<ImmutableBytesWritable, Put> yourrddPuts = yourrdd.mapToPair(row -> messageutil.getPuts(row));
        yourrddPuts.saveAsNewAPIHadoopDataset(conf);       
    }
JavaReceiverInputDStream statusDStream=TwitterUtils.createStream(streamingCtx);
JavaPairDStream statusPairDStream=statusDStream.mapToPair(新的PairFunction(){
公共Tuple2调用(状态)引发异常{
返回新的Tuple2(status.getId(),status.getText());
}
});
statusPairDStream.foreachRDD(新函数(){
公共Void调用(javapairdd状态)引发异常{
org.apache.hadoop.conf.Configuration conf=new Configuration();
status.saveAsNewAPIHadoopDataset(conf);
//放在这里的HBase不可能是正确的!?
返回null;
}
});

下面的代码片段可以解决您的所有查询

示例代码段:

JavaReceiverInputDStream<Status> statusDStream = TwitterUtils.createStream(streamingCtx);

JavaPairDStream<Long, String> statusPairDStream = statusDStream.mapToPair(new PairFunction<Status, Long, String>() {
    public Tuple2<Long, String> call(Status status) throws Exception {
        return new Tuple2<Long, String> (status.getId(), status.getText());
    }
});

statusPairDStream.foreachRDD(new Function<JavaPairRDD<Long,String>, Void>() {
    public Void call(JavaPairRDD<Long, String> status) throws Exception {
        org.apache.hadoop.conf.Configuration conf = new Configuration();
        status.saveAsNewAPIHadoopDataset(conf);
        // HBase PUT here can't be correct!?
        return null;
    }
});
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.RowFactory;
import org.apache.spark.sql.types.DataTypes;
import org.apache.spark.sql.types.StructField;
import org.apache.spark.sql.types.StructType;
....


  public static void processYourMessages(final JavaRDD<YourMessage> rdd, final HiveContext sqlContext, 
                    , MyMessageUtil messageutil) throws Exception {
        final JavaRDD<Row> yourrdd = rdd.filter(msg -> messageutil.filterType(.....) // create a java rdd
        final JavaPairRDD<ImmutableBytesWritable, Put> yourrddPuts = yourrdd.mapToPair(row -> messageutil.getPuts(row));
        yourrddPuts.saveAsNewAPIHadoopDataset(conf);       
    }
MyMessageUtil
getput
方法,如下所示

private Configuration conf =   HBaseConfiguration.create();
        conf.set(ZOOKEEPER_QUORUM, "comma seperated list of zookeeper quorum");
        conf.set("hbase.mapred.outputtable", "your table name");
        conf.set("mapreduce.outputformat.class", "org.apache.hadoop.hbase.mapreduce.TableOutputFormat");
public Tuple2<ImmutableBytesWritable, Put> getPuts(Row row) throws Exception {

        Put put = ..// prepare your put with all the columns you have.
        return new Tuple2<ImmutableBytesWritable, Put>(new ImmutableBytesWritable(), put);
    }
public Tuple2 getput(行)引发异常{
Put Put=..//准备包含所有列的Put。
返回新的Tuple2(newImmutableBytesWritable(),put);
}

希望这有帮助

谢谢你的解决方案,看起来不错。我会在周一尝试并给出反馈。非常感谢。如果有任何问题,请保持完美的后期编辑工作,谢谢!另一个例子可以在这里找到: