Python 3.x 如何使用python将kafka消费者数据映射到Mysql
我的主机配置如下:Python 3.x 如何使用python将kafka消费者数据映射到Mysql,python-3.x,apache-spark,apache-kafka,kafka-consumer-api,spark-structured-streaming,Python 3.x,Apache Spark,Apache Kafka,Kafka Consumer Api,Spark Structured Streaming,我的主机配置如下: # To find out where the pyspark import sys from kafka import KafkaProducer,KafkaConsumer import findspark from boto3 import * import boto3 import json findspark.init() # Creating Spark Context from pyspark import SparkContext from pyspark.
# To find out where the pyspark
import sys
from kafka import KafkaProducer,KafkaConsumer
import findspark
from boto3 import *
import boto3
import json
findspark.init()
# Creating Spark Context
from pyspark import SparkContext
from pyspark.sql import SparkSession
def get_connection(self):
spark = SparkSession.builder.master("local[*]").appName("SparkByExamples.com").getOrCreate()
return spark
def json_serializer(data):
return json.dumps(data).encode("utf-8")
def read_s3():
p1 = KafkaProducer(bootstrap_servers=['broker:29092'], value_serializer=json_serializer)
s3 = boto3.resource('s3')
bucket = s3.Bucket('kakfa')
for obj in bucket.objects.all():
key = obj.key
body = obj.get()['Body'].read().decode('utf-8')
p1.send("Uber_Eats",body)
p1.flush()
def read_from_topic(self,spark):
df = spark.readStream \
.format("kafka") \
.option("kafka.bootstrap.servers", "broker:29092") \
.option("subscribe", "Uber_Eats") \
.option("startingOffsets", "earliest") \
.load()
df2 = df \
.writeStream \
.format("console") \
.start()
print(df2.awaitTermination() )
def get_consumer(self):
consumer = KafkaConsumer("Uber_Eats", group_id='group1', bootstrap_servers=
"broker:29092",value_deserializer=lambda x: json.loads(x.decode('utf-8')))
return consumer
def print_details(self,c1):
for msg in c1:
print(msg.value)
print("Dom dfe")
class Foo:
def __init__(self):
spark = get_connection(self)
read_s3()
# System.setProperty("hadoop.home.dir", "$HADOOP_HOME\winutils-master\hadoop-2.x.x")
c1 = get_consumer(spark)
print_details(self,c1)
f = Foo()
卡夫卡,
火花,
Mysql,
你在码头上吗
我的代码如下:
# To find out where the pyspark
import sys
from kafka import KafkaProducer,KafkaConsumer
import findspark
from boto3 import *
import boto3
import json
findspark.init()
# Creating Spark Context
from pyspark import SparkContext
from pyspark.sql import SparkSession
def get_connection(self):
spark = SparkSession.builder.master("local[*]").appName("SparkByExamples.com").getOrCreate()
return spark
def json_serializer(data):
return json.dumps(data).encode("utf-8")
def read_s3():
p1 = KafkaProducer(bootstrap_servers=['broker:29092'], value_serializer=json_serializer)
s3 = boto3.resource('s3')
bucket = s3.Bucket('kakfa')
for obj in bucket.objects.all():
key = obj.key
body = obj.get()['Body'].read().decode('utf-8')
p1.send("Uber_Eats",body)
p1.flush()
def read_from_topic(self,spark):
df = spark.readStream \
.format("kafka") \
.option("kafka.bootstrap.servers", "broker:29092") \
.option("subscribe", "Uber_Eats") \
.option("startingOffsets", "earliest") \
.load()
df2 = df \
.writeStream \
.format("console") \
.start()
print(df2.awaitTermination() )
def get_consumer(self):
consumer = KafkaConsumer("Uber_Eats", group_id='group1', bootstrap_servers=
"broker:29092",value_deserializer=lambda x: json.loads(x.decode('utf-8')))
return consumer
def print_details(self,c1):
for msg in c1:
print(msg.value)
print("Dom dfe")
class Foo:
def __init__(self):
spark = get_connection(self)
read_s3()
# System.setProperty("hadoop.home.dir", "$HADOOP_HOME\winutils-master\hadoop-2.x.x")
c1 = get_consumer(spark)
print_details(self,c1)
f = Foo()
以上代码的输出如下所示:
{
{
"Customer Number": "1",
"Customer Name": "Shyam",
"Restaurant Number": "2201",
"Restaurant NameOrdered": "Bawarchi",
"Number of Items": "3",
"price": "10",
"Operating Start hours": "9:00",
"Operating End hours": "23:00"
},
{
"Customer Number": "2",
"Customer Name": "Rohini",
"Restaurant Number": "2202",
"Restaurant NameOrdered": "Sarvana Bhavan",
"Number of Items": "4",
"price": "20",
"Operating Start hours": "8:00",
"Operating End hours": "20:00"
},
{
"Customer Number": "3",
"Customer Name": "Bhairav",
"Restaurant Number": "2203",
"Restaurant NameOrdered": "Taco Bell",
"Number of Items": "5",
"price": "30",
"Operating Start hours": "11:00",
"Operating End hours": "21:00"
}
}
如何将这些内容读入mysql?
i) 它是否像一个常规的json文件,读取和插入
ii)或者我们是否有任何特定于kakfa消费者“json”格式的信息
iii)我已指定值\u反序列化器=lambda x:json.loads(x.decode('utf-8'))
在json格式的代码中,这是将数据加载到mysql所必需的吗
谢谢
阿迪
它是否像一个常规的json文件,读取和插入
不知道你这是什么意思。Mysql不接受json文件
Spark有自己的JSON文件读取器,但您是在读卡夫卡的文章,所以这无关紧要
我们是否有特定于kakfa消费者“json”格式的内容
对<代码>强制转换(值为字符串)然后是各种get\u json\u对象
调用。我已经把你和这个联系起来了
我已经指定了值\u反序列化器=lambda x:json.loads(x.decode('utf-8'))
这不是火花。我不知道你为什么还有这个。其次,def get_consumer(self)
不接受或使用您传递的spark
变量,并且您没有类定义,因此不建议使用self
作为命名参数(换句话说,您的所有函数都应该在class Foo
中,但您也根本不需要类)
重要细节-您显示的文件不是有效的JSON,因此无论如何,这些方法都不会立即起作用
tl;dr-假设您确实想要使用Spark
.writeStream.format(“jdbc”).save(“jdbc:mysql/…”)
但仅在修改数据帧以匹配数据库架构之后
否则,如果您不再需要Spark,那么JSON或Kafka是一个实现细节——下载并配置Mysql python客户端,然后像普通一样插入数据——在事务、回滚、错误处理、准备好的查询等方面要小心
或者,正如多次回答和评论的那样,以及更具容错性的解决方案,忘记Python并使用Kafka Connect(Kafka bin目录中提供的脚本,无需编码)要将数据从卡夫卡发送到另一个系统或从另一个系统发送到卡夫卡,您可以使用卡夫卡连接器这里有一个链接可以帮助您启动:不,我不想使用spark streaming,我通过Kafka consumer和表单获取输出,我试图在那里输入MySQL。您也指定了这不是有效的JSON格式,您能告诉我fomrat看起来有多有效吗?我会相应地更改。那么您为什么要调用
spark=get\u connection(self)
?还是使用火花代码?把你的数据放在这里,它会告诉你出了什么问题(你最外层的括号应该是[]
,或者你需要该对象中每个值的键),除此之外(假设你的print details函数真的可以工作,但我不认为是因为其他语法问题),就像我说的,卡夫卡在这里真的不重要。制作一个简单的脚本,从JSON字符串列表开始,解析/写入mysql;一旦你能很好地工作,用你的consumerPlus替换这个列表,因为Kafka是一个实现细节,有很多其他的问题显示你到底想要什么-或者熊猫