1.Cassandra:测试Cassandra数据库,Cassandra是由Facebook开发后再开源的
//
package llf
import java.nio.ByteBuffer
import scala.collection.JavaConversions._
import scala.collection.mutable.ListBuffer
import scala.collection.immutable.Map
import org.apache.cassandra.hadoop.ConfigHelper
import org.apache.cassandra.hadoop.cql3.CqlPagingInputFormat
import org.apache.cassandra.hadoop.cql3.CqlConfigHelper
import org.apache.cassandra.hadoop.cql3.CqlOutputFormat
import org.apache.cassandra.utils.ByteBufferUtil
import org.apache.hadoop.mapreduce.Job
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.SparkContext._
/**
* Created by sendoh on 2015/4/23.
*/
//介绍了通过Spark读取Cassandra数据并进行处理
object CassandraCQLTest { //Cassandra是一套开源分布式NoSQL数据库系统。
def main(args: Array[String]): Unit ={
val conf = new SparkConf().setAppName("CassandrsCQLTest")
val sc = new SparkContext(conf)
val cHost: String = args(0) //将cHost定义为String类型,将初始化的第一个参数负值给它
val cPort: String = args(1)
val KeySpace = "retial"
val InputColumnFamily = "ordercf"
val OutputColumnFamily = "salecount"
val job = new Job()// 新建一个Hadoop job。因为Spark是没有提供直接的API访问Cassandra,但是Spark是建于Hadoop之上,
// Cassandra提供了访问Hadoop的接口所以我们需要先创建一个Hadoop的job来连接它两。
job.setInputFormatClass(classOf[CqlPagingInputFormat]) //设置input的类,这个没有什么其他可选项,这是Cassandra默认的jar包中提供的接口。
ConfigHeloper.setInputInitialAddress(job,getConfiguration(), cHost)//ConfigHelper类用来读取web.config配置的数据
//通过Cassandra提供的静态类ConfigHelper来设置相对应的一些参数。
ConfigHelper.setInputRpcPort(job.getConfiguration(), cPort)
ConfigHelper.setInputColumnFamily(job.getConfiguration(), KeySpace, InputColumnFamily)
ConfigHelper.setInputPartitioner(job.getConfiguration(), "Murmur3Partitioner")
CqlConfigHelper.setInputCQLPageRowSize(job.getConfiguration(), "3")
val query = "UPDATE " + KeySpace + "." + OutputColumnFamily + " SET sale_count = ? "
CqlConfigHelper.setOutputCql(job.getConfiguration(), query)
job.setOutputFormatClass(classOf[CqlOutputFormat])
ConfigHelper.setOutputColumnFamily(job.getConfiguration(), KeySpace, OutputColumnFamily)
ConfigHelper.setOutputInitialAddress(job.getConfiguration(), cHost)
ConfigHelper.setOutputRpcPort(job.getConfiguration(), cPort)
ConfigHelper.setOutputPartitioner(job.getConfiguration(), "Murmur3Partitioner")
//可以看到这里创建了一个RDD对象,第一个参数就是将之间我们配置好的参数,第二个就是之前提到的Cassandra提供的接口,
// 第三和第四个参数其他没有其他的可选项,这两个参数是被ColumnFamilyInputFormat所限制的。这个其实大家看SparkAPI就能了解到
val casRdd = sc.newAPIHadoopRDD(job.getConfiguration(),
classOf[CqlPagingInputFormat],
classOf[java.util.Map[String,ByteBuffer]],
classOf[java.util.Map[String,ByteBuffer]])
println("Count: " + casRdd.count)
//这里就是运行mapper方法了,就和hadoop中的mapper一个概念。需要说明的是,这里的key就是一个ByteBuffer对象,
// value就是一个SortedMap[ByteBuffer, IColumn],这两个就是之前创建RDD设置的最后两个参数
val productSaleRDD = casRdd.map {
case (key, value) => {
(ByteBufferUtil.string(value.get("prod_id")), ByteBufferUtil.toInt(value.get("quantity")))
}
}
val aggregatedRDD = productSaleRDD.reduceByKey(_ + _)
aggregatedRDD.collect().foreach {
case (productId, saleCount) => println(productId + ":" + saleCount)
}
val casoutputCF = aggregatedRDD.map {
case (productId, saleCount) => {
val outColFamKey = Map("prod_id" -> ByteBufferUtil.bytes(productId))
val outKey: java.util.Map[String, ByteBuffer] = outColFamKey
var outColFamVal = new ListBuffer[ByteBuffer]
outColFamVal += ByteBufferUtil.bytes(saleCount)
val outVal: java.util.List[ByteBuffer] = outColFamVal
(outKey, outVal)
}
}
casoutputCF.saveAsNewAPIHadoopFile(
KeySpace,
classOf[java.util.Map[String, ByteBuffer]],
classOf[java.util.List[ByteBuffer]],
classOf[CqlOutputFormat],
job.getConfiguration()
)
sc.stop()
}
}
//
//
package llf
import org.apache.hadoop.mapreduce.Job
import org.apache.spark.{SparkContext, SparkConf}
/**
* Created by sendoh on 2015/4/25.
*/
object CassandraTest {//Cassandra是一套开源分布式NoSQL数据库系统。
def main(args: Array[String]): Unit ={
val conf = new SparkConf().setAppName("CassandraTest").setMaster("local[2]")
val sc = new SparkContext(conf)
val job = new Job()// 新建一个Hadoop job。因为Spark是没有提供直接的API访问Cassandra,但是Spark是建于Hadoop之上,
// Cassandra提供了访问Hadoop的接口所以我们需要先创建一个Hadoop的job来连接它两。
job.setInputFormatClass(classOf[ColumnFamilyInputFormat]) //设置input的类,这个没有什么其他可选项,这是Cassandra默认的jar包中提供的接口。
val host: String = args(1)//将host定义为String类型,将初始化的第一个参数负值给它
val port: String = args(2)
ConfigHelper.setInputIntitalAddress(job.getConfiguration(), host)//ConfigHelper类用来读取web.config配置的数据
//通过Cassandra提供的静态类ConfigHelper来设置相对应的一些参数。
ConfigHelper.setInputRpcport(job.getConfiguration, port)
ConfigHelper.setOutputIntitalAddress(job.getConfiguration(), host)
ConfigHelper.setOutputRpcport(job.getConfiguration(), port)
ConfigHelper.setInputColumnFamily(job.getConfiguration(), "casDemo", "Words")
ConfigHelper.setOutputColumnFamily(job.getConfiguration(), "casDemo", "WordCount")
val predicate = new SlicePredicate()
val sliceRange = new SliceRange()
sliceRange.setStart(Array.empty[Byte])
sliceRange.setFinish(Array.empty[Byte])
predicate.setSlice_range(sliceRange)
ConfigHelper.setInputSlicePredicate(job.getConfiguration(), predicate)
ConfigHelper.setInputPartitioner(job.getConfiguration(), "Murmur3Partitioner")
ConfigHelper.setOutputPartitioner(job.getConfiguration(), "Murmur3Partitioner")
// Make a new Hadoop RDD
//可以看到这里创建了一个RDD对象,第一个参数就是将之间我们配置好的参数,第二个就是之前提到的Cassandra提供的接口,
// 第三和第四个参数其他没有其他的可选项,这两个参数是被ColumnFamilyInputFormat所限制的。这个其实大家看SparkAPI就能了解到
val casRdd = sc.newAPIHadoopRDD(
job.getConfiguration(),
classOf[ColumnFamilyInputFormat],
classOf[ByteBuffer],
classOf[SortedMap[ByteBuffer, IColumn]])
// Let us first get all the paragraphs from the retrieved rows
//这里就是运行mapper方法了,就和hadoop中的mapper一个概念。需要说明的是,这里的key就是一个ByteBuffer对象,
// value就是一个SortedMap[ByteBuffer, IColumn],这两个就是之前创建RDD设置的最后两个参数
val paraRdd = casRdd.map {
case (key, value) => {
ByteBufferUtil.string(value.get(ByteBufferUtil.bytes("para")).value())
}
}
// Lets get the word count in paras
val counts = paraRdd.flatMap(p => p.split(" ")).map(word => (word, 1)).reduceByKey(_ + _)
counts.collect().foreach {
case (word, count) => println(word + ":" + count)
}
counts.map {
case (word, count) => {
val colWord = new org.apache.cassandra.thrift.Column()
colWord.setName(ByteBufferUtil.bytes("word"))
colWord.setValue(ByteBufferUtil.bytes(word))
colWord.setTimestamp(System.currentTimeMillis)
val colCount = new org.apache.cassandra.thrift.Column()
colCount.setName(ByteBufferUtil.bytes("wcount"))
colCount.setValue(ByteBufferUtil.bytes(count.toLong))
colCount.setTimestamp(System.currentTimeMillis)
val outputkey = ByteBufferUtil.bytes(word + "-COUNT-" + System.currentTimeMillis)
val mutations: java.util.List[Mutation] = new Mutation() :: new Mutation() :: Nil
mutations.get(0).setColumn_or_supercolumn(new ColumnOrSuperColumn())
mutations.get(0).column_or_supercolumn.setColumn(colWord)
mutations.get(1).setColumn_or_supercolumn(new ColumnOrSuperColumn())
mutations.get(1).column_or_supercolumn.setColumn(colCount)
(outputkey, mutations)
}
}.saveAsNewAPIHadoopFile("casDemo", classOf[ByteBuffer], classOf[List[Mutation]],
classOf[ColumnFamilyOutputFormat], job.getConfiguration)
sc.stop()
}
}
///
初学spark,这两个例子我还没有完全看懂,欢迎交流,QQ:1217111493