spark实战(一)——eclipse环境下Spark Streaming+Kafka+Hbase

1 篇文章 0 订阅
1 篇文章 0 订阅

 

目录

前言

一、环境设置

1. pom文件引入依赖库

2. eclipse配置spark、hbase访问地址

二、Spark Streaming读取kafka中数据

 

三、Spark Streaming写Hbase

 

总结


前言

应用场景:日志数据使用flume收集后发送给Kafka,需要将这些流式日志数据实时写入到Hbase中,使用Spark Streaming进行流式数据处理达到近似实时的效果。

一、环境设置

1. pom文件引入依赖库

我使用的spark版本2.X,hbase版本1.3,pom文件添加如下依赖

<!-- spark -->
<dependency>
	<groupId>org.apache.spark</groupId>
	<artifactId>spark-core_2.11</artifactId>
	<version>2.2.0</version>
	<scope>provided</scope>
</dependency>
<!-- spark-streaming -->
<dependency>
	<groupId>org.apache.spark</groupId>
	<artifactId>spark-streaming_2.11</artifactId>
	<version>2.2.0</version>
	<scope>provided</scope>
</dependency>
<!-- spark-streaming-kafka-0-10 -->
<dependency>
	<groupId>org.apache.spark</groupId>
	<artifactId>spark-streaming-kafka-0-10_2.11</artifactId>
	<version>2.2.0</version>
</dependency>
<!-- hbase -->
<dependency>
	<groupId>org.apache.hbase</groupId>
	<artifactId>hbase-client</artifactId>
	<version>1.3.1</version>
</dependency>
<dependency>
	<groupId>org.apache.hbase</groupId>
	<artifactId>hbase-server</artifactId>
	<version>1.3.1</version>
</dependency>

这里<version>*</version>里的版本号指的是使用的spark、hbase的版本,而不是依赖库的版本。 

2. eclipse配置spark、hbase访问地址

eclipse工程目录如下图:

在src目录同层建立一个普通的文件夹,如上图的dataCenterAnalysisConf,用于放置各种配置文件。将集群上hdfs-site.xml、hbase-site.xml、core-site.xml等配置文件复制出来,放到该文件夹,然后将该文件夹添加到项目的构建路径中,这样在代码中就不需要写hdfs、hbase、hive等的访问地址了,程序在eclipse里运行时会自动找到这些配置文件并获取访问地址(记得修改本机hosts文件)。当打jar包时,由于该文件夹不在src下面,所以不会打进jar包,将jar提交到集群运行时,程序会在集群安装的hadoop、hbase环境中找这些配置文件。

二、Spark Streaming读取kafka中数据

public class KafkaReceiver {
	public static void main(String[] args) {
		// 获取配置文件路径.在eclipse里运行时user.dir返回src根目录位置,当以jar运行时user.dir返回jar所在的位置,配置文件放到jar同层
		String jarPath = System.getProperty("user.dir");
		Properties config = FileUtils.loadOutsideConfig(jarPath + "/dataCenterAnalysisConf/config.properties");

		// 切分窗口,单位为秒
        //int threshold = Integer.valueOf(config.getProperty("adjoint.time"));
        //int coNumber = Integer.valueOf(config.getProperty("adjoint.coNumber"));

		// 构建SparkStreaming上下文
		SparkConf conf = new SparkConf().setAppName("ReadKafka")
				.setMaster("local");//提交到集群时记得注释掉

		JavaStreamingContext jsc = new JavaStreamingContext(conf, Durations.seconds(5));

//		jsc.checkpoint("hdfs://hadoop02:9000/ck-2018-24-004");

		// 构建kafka参数map
		Map<String, Object> kafkaParams = new HashMap<>();
        //网上有一种参数叫metadata.broker.list,这是旧参数已被淘汰,改为bootstrap.servers
		kafkaParams.put("bootstrap.servers", config.getProperty("kafka.servers"));
		kafkaParams.put("group.id", "lq-consumer-group");
		// 指定从latest(最新)还是smallest(最早)处开始读取数据
        //kafkaParams.put("auto.offset.reset", "latest");
		// 如果true,consumer定期地往zookeeper写入每个分区的offset
		kafkaParams.put("enable.auto.commit", false);
		//指定kafka输出key、value的数据类型及编码格式(默认为字符串类型编码格式为uft-8)
		kafkaParams.put("key.deserializer", StringDeserializer.class);
		kafkaParams.put("value.deserializer", StringDeserializer.class);

		// kafka topic set
		String topics = config.getProperty("kafka.topics");
		Set<String> topicsSet = new HashSet<>(Arrays.asList(topics.split(",")));

		try {
			// 获取kafka的数据
			JavaInputDStream<ConsumerRecord<String, String>> stream = KafkaUtils.createDirectStream(jsc,
					LocationStrategies.PreferConsistent(),
					ConsumerStrategies.<String, String>Subscribe(topicsSet, kafkaParams));

			JavaDStream<String> flatMap = stream.flatMap(new FlatMapFunction<ConsumerRecord<String, String>, String>() {

				@Override
				public Iterator<String> call(ConsumerRecord<String, String> line) throws Exception {
					List<String> list = new ArrayList<>();
					// 处理kafka的每条数据
					System.out.print("***************************" + line.value() + "***************************");
					list.add(line.value() + "23333");
					return list.iterator();
				}
			});
			
			flatMap.print();

			jsc.start();
			jsc.awaitTermination();
			jsc.close();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

config.properties文件中添加kafka地址和topic名称

三、Spark Streaming写Hbase

 

代码如下(示例):

data = pd.read_csv( 'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv') print(data.head()) 

该处使用的url网络请求的数据。


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
spark streaming 是基于 spark 引擎的实时数据处理框架,可以通过集成 kafka 来进行数据流的处理。然而,在使用 spark streaming 进行 kafka 数据流处理时,可能会遇到一些坑。 首先,要注意 spark streamingkafka 版本的兼容性。不同版本的 spark streamingkafka 可能存在一些不兼容的问题,所以在选择版本时要特别留意。建议使用相同版本的 spark streamingkafka,以避免兼容性问题。 其次,要注意 spark streaming 的并行度设置。默认情况下,spark streaming 的并行度是根据 kafka 分区数来决定的,可以通过设置 spark streaming 的参数来调整并行度。如果并行度设置得过高,可能会导致任务处理过慢,甚至出现 OOM 的情况;而设置得过低,则可能无法充分利用集群资源。因此,需要根据实际情况进行合理的并行度设置。 另外,要注意 spark streamingkafka 的性能调优。可以通过调整 spark streaming 缓冲区的大小、批处理时间间隔、kafka 的参数等来提高性能。同时,还可以使用 spark streaming 的 checkpoint 机制来保证数据的一致性和容错性。但是,使用 checkpoint 机制可能会对性能产生一定的影响,所以需要权衡利弊。 最后,要注意处理 kafka 的消息丢失和重复消费的问题。由于网络或其他原因,可能会导致 kafka 的消息丢失;而 spark streaming 在处理数据时可能会出现重试导致消息重复消费的情况。可以通过配置合适的参数来解决这些问题,例如设置 KafkaUtils.createDirectStream 方法的参数 enable.auto.commit,并设置适当的自动提交间隔。 总之,在使用 spark streaming 进行 kafka 数据流处理时,需要留意版本兼容性、并行度设置、性能调优和消息丢失重复消费等问题,以免踩坑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值