前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >kubernetes 中 kafka 和 zookeeper 有状态集群服务部署实践 (一)

kubernetes 中 kafka 和 zookeeper 有状态集群服务部署实践 (一)

原创
作者头像
腾讯云容器服务团队
修改于 2017-09-07 03:09:49
修改于 2017-09-07 03:09:49
20K00
代码可运行
举报
运行总次数:0
代码可运行

引言

Kafka和zookeeper是在两种典型的有状态的集群服务。首先kafka和zookeeper都需要存储盘来保存有状态信息,其次kafka和zookeeper每一个实例都需要有对应的实例Id(Kafka需要broker.id,zookeeper需要my.id)来作为集群内部每个成员的标识,集群内节点之间进行内部通信时需要用到这些标识。

对于这类服务的部署,需要解决两个大的问题,一个是状态保存,另一个是集群管理(多服务实例管理)。kubernetes中提的StatefulSet(1.5版本之前称为Petset)方便了有状态集群服务在上的部署和管理。具体来说是通过Init Container来做集群的初始化工 作,用 Headless Service来维持集群成员的稳定关系,用Persistent Volume和Persistent Volume Claim提供网络存储来持久化数据,从而支持有状态集群服务的部署。

本文将尝试根据社区提供的StatefulSet方案,对kafka和zookeeper服务进行部署。具体的部署过程包括以下几个部署: (1) Persistent Volume 存储的创建

(2) StatefulSet(Petset)资源的创建

(3) headless服务的创建

Persistent Volume存储的创建

PersistentVolume(PV)是集群之中的一块网络存储。跟 Node 一样,也是集群的资源,并且不属于特定的namespace。PV 跟 Volume (卷) 类似,不过会有独立于 Pod 的生命周期。

在有状态服务创建之前,需要先创建对应的PV存储。为了便于环境的搭建,本文PV存储的后端采用NFS。NFS服务的容器化部署,可以参考腾讯云容器服务帮助文档-搭建nfs服务器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl get service
NAME         CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
kubernetes   172.16.255.1     <none>        443/TCP                      56m
nfsserver0   172.16.255.44    <none>        20048/TCP,111/TCP,2049/TCP   40m
nfsserver1   172.16.255.6     <none>        2049/TCP,20048/TCP,111/TCP   29m
nfsserver2   172.16.255.131   <none>        2049/TCP,20048/TCP,111/TCP   14m
nfsserver3   172.16.255.231   <none>        2049/TCP,20048/TCP,111/TCP   10m
nfsserver4   172.16.255.12    <none>        2049/TCP,20048/TCP,111/TCP   7m
nfsserver5   172.16.255.223   <none>        2049/TCP,20048/TCP,111/TCP   4m

基于NFS的PV创建示例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  apiVersion: v1
  kind: PersistentVolume
  metadata:
    name: pv0001
    annotations:
        volume.beta.kubernetes.io/storage-class: "anything"
  spec:
    capacity:
      storage: 50Gi
    accessModes:
      - ReadWriteMany
    persistentVolumeReclaimPolicy: Recycle
    nfs:
      path: /exports
      server: 172.16.255.44

其中172.16.255.44为对应的nfs服务的IP。对应创建多个PV,zookeeper服务和kafka服务各3个。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl get pv
NAME      CAPACITY   ACCESSMODES   RECLAIMPOLICY  STATUS     CLAIM   REASON  AGE
pv0001    50Gi       RWO           Recycle        Available                   5m
pv0002    50Gi       RWO           Recycle        Available                   5m
pv0003    50Gi       RWO           Recycle        Available                   5m
pv0004    50Gi       RWO           Recycle        Available                   2m
pv0005    50Gi       RWO           Recycle        Available                   2m
pv0006    50Gi       RWO           Recycle        Available                   2m

上面通过手动的方式创建了一个NFS Volume,这在管理很多Volume的时候很方便。kubernetes还提供了StorageClass来动态创建PV,可以大大节省了管理员的时间。作者在这里就不做对应的测试了。

zookeeper中StatefulSet(Petset)资源和headless服务的创建

StatefulSet是为了解决有状态服务的问题(对应Deployments和ReplicaSets是为无状态服务而设计),其应用场景包括

  • 稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现
  • 稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service(即没有Cluster IP的Service)来实现
  • 有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依序进行(即从0到N-1,在下一个Pod运行之前所有之前的Pod必须都是Running和Ready状态),基于init containers来实现
  • 有序收缩,有序删除(即从N-1到0)

在创建好对应的PV后,需要创建对应的StatefulSet(Petset)资源。由于本文使用的kubernetes为1.4.6版本,所以示例中采用的名称仍然为Petset。具体的创建zookeeper的Statefulset(Petset)的示例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# A headless service to create DNS records
apiVersion: v1
kind: Service
metadata:
  annotations:
    service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
  name: zk
  labels:
    app: zk
spec:
  ports:
  - port: 2888
    name: peer
  - port: 3888
    name: leader-election
  # *.zk.default.svc.cluster.local
  clusterIP: None
  selector:
    app: zk
---
apiVersion: apps/v1alpha1
kind: PetSet
metadata:
  name: zoo
spec:
  serviceName: "zk"
  replicas: 3
  template:
    metadata:
      labels:
        app: zk
      annotations:
        pod.alpha.kubernetes.io/initialized: "true"
        pod.alpha.kubernetes.io/init-containers: '[
            {
                "name": "install",
                "image": "gcr.io/google_containers/zookeeper-install:0.1",
                "imagePullPolicy": "Always",
                "args": ["--version=3.5.0-alpha", "--install-into=/opt", "--work-dir=/work-dir"],
                "volumeMounts": [
                    {
                        "name": "opt",
                        "mountPath": "/opt/"
                    },
                    {
                        "name": "workdir",
                        "mountPath": "/work-dir"
                    }
                ]
            },
            {
                "name": "bootstrap",
                "image": "java:openjdk-8-jre",
                "command": ["/work-dir/peer-finder"],
                "args": ["-on-start=\"/work-dir/on-start.sh\"", "-service=zk"],
                "env": [
                  {
                      "name": "POD_NAMESPACE",
                      "valueFrom": {
                          "fieldRef": {
                              "apiVersion": "v1",
                              "fieldPath": "metadata.namespace"
                          }
                      }
                   }
                ],
                "volumeMounts": [
                    {
                        "name": "opt",
                        "mountPath": "/opt/"
                    },
                    {
                        "name": "workdir",
                        "mountPath": "/work-dir"
                    },
                    {
                        "name": "datadir",
                        "mountPath": "/tmp/zookeeper"
                    }
                ]
            }
        ]'
    spec:
      containers:
      - name: zk
        image: java:openjdk-8-jre
        ports:
        - containerPort: 2888
          name: peer
        - containerPort: 3888
          name: leader-election
        command:
        - /opt/zookeeper/bin/zkServer.sh
        args:
        - start-foreground
        readinessProbe:
          exec:
            command:
            - sh
            - -c
            - "/opt/zookeeper/bin/zkCli.sh ls /"
          initialDelaySeconds: 15
          timeoutSeconds: 5
        volumeMounts:
        - name: datadir
          mountPath: /tmp/zookeeper
        - name: opt
          mountPath: /opt/
      volumes:
      - name: opt
        emptyDir: {}
      - name: workdir
        emptyDir: {}
  volumeClaimTemplates:
  - metadata:
      name: datadir
      annotations:
        volume.beta.kubernetes.io/storage-class: anything
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 25Gi

描述文件中包括以下几个重要部分: (1) init-containers容器初始化环境信息和对应的配置文件信息

(2) zookeeper容器通过zkServer.sh启动

(3) 通过/opt/zookeeper/bin/zkCli.sh ls /进行健康检测

(4) volumeClaimTemplates声明对应的Persistent Volume Claim

(5) 创建对应的Headless Service

创建过程中查看具体的资源信息:

创建zookeeper服务

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl create -f zookeeper-petset.yaml
service "zk" created
petset "zoo" created

查看服务实例状态(从服务状态中可以看出,服务实例依次启动)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl get po --watch-only
zoo-0     1/1       Running   0          1m
zoo-1     0/1       Pending   0         0s
zoo-1     0/1       Pending   0         0s
zoo-1     0/1       Init:0/2   0         0s
zoo-1     0/1       Init:0/2   0         6s
zoo-1     0/1       Init:1/2   0         25s
zoo-1     0/1       Init:1/2   0         26s
zoo-1     0/1       PodInitializing   0         29s
zoo-1     0/1       Running   0         30s
zoo-1     1/1       Running   0         51s
zoo-2     0/1       Pending   0         0s
zoo-2     0/1       Pending   0         0s
zoo-2     0/1       Init:0/2   0         0s
zoo-2     0/1       Init:0/2   0         6s
zoo-2     0/1       Init:1/2   0         33s
zoo-2     0/1       Init:1/2   0         34s
zoo-2     0/1       PodInitializing   0         37s
zoo-2     0/1       Running   0         38s
zoo-2     1/1       Running   0         1m

查看Persistent Volume Claim (PVC)信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl get pvc
NAME            STATUS    VOLUME    CAPACITY   ACCESSMODES   AGE
datadir-zoo-0   Bound     pv0004    50Gi       RWO           10m
datadir-zoo-1   Bound     pv0001    50Gi       RWO           10m
datadir-zoo-2   Bound     pv0003    50Gi       RWO           10m

查看Persistent Volume (PV)信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl get pv
NAME    CAPACITY ACCESSMODES RECLAIMPOLICY  STATUS    CLAIM                 REASON  AGE
pv0001  50Gi     RWO         Recycle        Bound     default/datadir-zoo-1         14h
pv0002  50Gi     RWO         Recycle        Available                               14h
pv0003  50Gi     RWO         Recycle        Bound     default/datadir-zoo-2         14h
pv0004  50Gi     RWO         Recycle        Bound     default/datadir-zoo-0         14h
pv0005  50Gi     RWO         Recycle        Available                               14h
pv0006  50Gi     RWO         Recycle        Available                               14h

查看服务信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl get service zk
NAME      CLUSTER-IP   EXTERNAL-IP   PORT(S)             AGE
zk        None         <none>        2888/TCP,3888/TCP   24m

查看Pod的状态信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl get pod -l app=zk -o wide 
NAME      READY     STATUS    RESTARTS   AGE       IP           NODE
zoo-0     1/1       Running   0          26m       172.16.0.5   10.0.0.33
zoo-1     1/1       Running   0          24m       172.16.2.4   10.0.0.40
zoo-2     1/1       Running   0          23m       172.16.0.6   10.0.0.33

查看dns中的域名信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$  dig @172.16.0.3 zk.default.svc.cluster.local
;; ANSWER SECTION:
zk.default.svc.cluster.local. 30 IN    A    172.16.0.5
zk.default.svc.cluster.local. 30 IN    A    172.16.0.6
zk.default.svc.cluster.local. 30 IN    A    172.16.2.4

$  dig @172.16.0.3 zoo-0.zk.default.svc.cluster.local
;; ANSWER SECTION:
zoo-0.zk.default.svc.cluster.local. 30 IN A    172.16.0.5

$  dig @172.16.0.3 zoo-1.zk.default.svc.cluster.local
;; ANSWER SECTION:
zoo-1.zk.default.svc.cluster.local. 30 IN A    172.16.2.4

$  dig @172.16.0.3 zoo-2.zk.default.svc.cluster.local
;; ANSWER SECTION:
zoo-1.zk.default.svc.cluster.local. 30 IN A    172.16.2.4

查看服务实例内部状态

查看zookeeper配置信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
root@zoo-0:/opt/zookeeper/conf# cat zoo.cfg.dynamic 
server.1=zoo-0.zk.default.svc.cluster.local:2888:3888:participant;0.0.0.0:2181
server.2=zoo-1.zk.default.svc.cluster.local:2888:3888:participant;0.0.0.0:2181
server.3=zoo-2.zk.default.svc.cluster.local:2888:3888:participant;0.0.0.0:2181

root@zoo-0:/tmp/zookeeper# cat myid 
1

查看zookeeper集群状态

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
root@zoo-0:/opt/zookeeper/bin# ./zkCli.sh 

[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper]

kafka中StatefulSet(Petset)资源和headless服务的创建

在创建好zookeeper服务后,我们接下来创建kafka服务。kafka服务的创建过程和zookeeper服务类似。对应的示例文件如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
---
apiVersion: v1
kind: Service
metadata:
  name: kafka-svc
  labels:
    app: kafka
spec:
  ports:
  - port: 9093
    name: server
  clusterIP: None
  selector:
    app: kafka
---
apiVersion: apps/v1alpha1
kind: PetSet
metadata:
  name: kafka
spec:
  serviceName: kafka-svc
  replicas: 3
  template:
    metadata:
      labels:
        app: kafka
      annotations:
        pod.alpha.kubernetes.io/initialized: "true"
    spec:
      terminationGracePeriodSeconds: 0
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      serviceAccount: ""
      containers:
      - name: k8skafka
        imagePullPolicy: Always
        image: gcr.io/google_samples/k8skafka:v1
        resources:
          requests:
            memory: "1Gi"
            cpu: 500m
        ports:
        - containerPort: 9093
          name: server
        command:
        - sh
        - -c
        - "exec kafka-server-start.sh /opt/kafka/config/server.properties --override broker.id=${HOSTNAME##*-} \
          --override listeners=PLAINTEXT://:9093 \
          --override zookeeper.connect=zoo-0.zk.default.svc.cluster.local:2181,zoo-1.zk.default.svc.cluster.local:2181,zoo-2.zk.default.svc.cluster.local:2181 \
          --override log.dir=/var/lib/kafka \
          --override auto.create.topics.enable=true \
          --override auto.leader.rebalance.enable=true \
          --override background.threads=10 \
          --override compression.type=producer \
          --override delete.topic.enable=false \
          --override leader.imbalance.check.interval.seconds=300 \
          --override leader.imbalance.per.broker.percentage=10 \
          --override log.flush.interval.messages=9223372036854775807 \
          --override log.flush.offset.checkpoint.interval.ms=60000 \
          --override log.flush.scheduler.interval.ms=9223372036854775807 \
          --override log.retention.bytes=-1 \
          --override log.retention.hours=168 \
          --override log.roll.hours=168 \
          --override log.roll.jitter.hours=0 \
          --override log.segment.bytes=1073741824 \
          --override log.segment.delete.delay.ms=60000 \
          --override message.max.bytes=1000012 \
          --override min.insync.replicas=1 \
          --override num.io.threads=8 \
          --override num.network.threads=3 \
          --override num.recovery.threads.per.data.dir=1 \
          --override num.replica.fetchers=1 \
          --override offset.metadata.max.bytes=4096 \
          --override offsets.commit.required.acks=-1 \
          --override offsets.commit.timeout.ms=5000 \
          --override offsets.load.buffer.size=5242880 \
          --override offsets.retention.check.interval.ms=600000 \
          --override offsets.retention.minutes=1440 \
          --override offsets.topic.compression.codec=0 \
          --override offsets.topic.num.partitions=50 \
          --override offsets.topic.replication.factor=3 \
          --override offsets.topic.segment.bytes=104857600 \
          --override queued.max.requests=500 \
          --override quota.consumer.default=9223372036854775807 \
          --override quota.producer.default=9223372036854775807 \
          --override replica.fetch.min.bytes=1 \
          --override replica.fetch.wait.max.ms=500 \
          --override replica.high.watermark.checkpoint.interval.ms=5000 \
          --override replica.lag.time.max.ms=10000 \
          --override replica.socket.receive.buffer.bytes=65536 \
          --override replica.socket.timeout.ms=30000 \
          --override request.timeout.ms=30000 \
          --override socket.receive.buffer.bytes=102400 \
          --override socket.request.max.bytes=104857600 \
          --override socket.send.buffer.bytes=102400 \
          --override unclean.leader.election.enable=true \
          --override zookeeper.session.timeout.ms=6000 \
          --override zookeeper.set.acl=false \
          --override broker.id.generation.enable=true \
          --override connections.max.idle.ms=600000 \
          --override controlled.shutdown.enable=true \
          --override controlled.shutdown.max.retries=3 \
          --override controlled.shutdown.retry.backoff.ms=5000 \
          --override controller.socket.timeout.ms=30000 \
          --override default.replication.factor=1 \
          --override fetch.purgatory.purge.interval.requests=1000 \
          --override group.max.session.timeout.ms=300000 \
          --override group.min.session.timeout.ms=6000 \
          --override inter.broker.protocol.version=0.10.2-IV0 \
          --override log.cleaner.backoff.ms=15000 \
          --override log.cleaner.dedupe.buffer.size=134217728 \
          --override log.cleaner.delete.retention.ms=86400000 \
          --override log.cleaner.enable=true \
          --override log.cleaner.io.buffer.load.factor=0.9 \
          --override log.cleaner.io.buffer.size=524288 \
          --override log.cleaner.io.max.bytes.per.second=1.7976931348623157E308 \
          --override log.cleaner.min.cleanable.ratio=0.5 \
          --override log.cleaner.min.compaction.lag.ms=0 \
          --override log.cleaner.threads=1 \
          --override log.cleanup.policy=delete \
          --override log.index.interval.bytes=4096 \
          --override log.index.size.max.bytes=10485760 \
          --override log.message.timestamp.difference.max.ms=9223372036854775807 \
          --override log.message.timestamp.type=CreateTime \
          --override log.preallocate=false \
          --override log.retention.check.interval.ms=300000 \
          --override max.connections.per.ip=2147483647 \
          --override num.partitions=1 \
          --override producer.purgatory.purge.interval.requests=1000 \
          --override replica.fetch.backoff.ms=1000 \
          --override replica.fetch.max.bytes=1048576 \
          --override replica.fetch.response.max.bytes=10485760 \
          --override reserved.broker.max.id=1000 "
        env:
        - name: KAFKA_HEAP_OPTS
          value : "-Xmx512M -Xms512M"
        - name: KAFKA_OPTS
          value: "-Dlogging.level=INFO"
        volumeMounts:
        - name: datadir
          mountPath: /var/lib/kafka
        readinessProbe:
          exec:
           command: 
            - sh 
            - -c 
            - "/opt/kafka/bin/kafka-broker-api-versions.sh --bootstrap-server=localhost:9093"
  volumeClaimTemplates:
  - metadata:
      name: datadir
      annotations:
        volume.beta.kubernetes.io/storage-class: anything
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 50Gi

创建kafka服务

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl create -f kafka-petset.yaml
service "kafka-svc" created
petset "kafka" created

查看Pod的状态信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl get pod -l app=kafka -o wide 
NAME      READY     STATUS    RESTARTS   AGE       IP           NODE
kafka-0   1/1       Running   0          1h        172.16.0.7   10.0.0.33
kafka-1   1/1       Running   0          1h        172.16.2.5   10.0.0.40
kafka-2   1/1       Running   0          1h        172.16.1.5   10.0.0.45

其他信息的变化和zookeeper服务创建过程类似,限于篇幅关系,这里不再展示。

进行kafka集群可用性测试

创建topic测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
root@kafka-0:/opt/kafka/config# kafka-topics.sh --create \
> --topic test \
> --zookeeper zoo-0.zk.default.svc.cluster.local:2181,zoo-1.zk.default.svc.cluster.local:2181,zoo-2.zk.default.svc.cluster.local:2181 \
> --partitions 3 \
> --replication-factor 2

Created topic "test".

创建生产消费测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
root@kafka-0:/opt/kafka/config# kafka-console-consumer.sh --topic test --bootstrap-server localhost:9093

root@kafka-1:/# kafka-console-producer.sh --topic test --broker-list localhost:9093                                                             
I like kafka
hello world

#在消费者侧显示为:
I like kafka
hello world

kafka进行扩容测试

创建新的nfsserver和pv

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# kubectl get service -l qcloud-app=nfsserver
NAME        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
nfsserver   172.16.255.18   <none>        2049/TCP,20048/TCP,111/TCP   32m

# kubectl get pv  pv0007
NAME    CAPACITY  ACCESSMODES RECLAIMPOLICY   STATUS    CLAIM   REASON    AGE
pv0007  50Gi      RWO         Recycle         Available                   14s

由于创建过程在前文已经描述过,这里不再进行详述创建过程。

kafka副本数修改

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#  kubectl scale petset kafka --replicas=4
petset "kafka" scaled

#  kubectl get pod -l app=kafka -o wide 
NAME      READY     STATUS    RESTARTS   AGE       IP           NODE
kafka-0   1/1       Running   0          1h        172.16.0.7   10.0.0.33
kafka-1   1/1       Running   0          1h        172.16.2.5   10.0.0.40
kafka-2   1/1       Running   0          1h        172.16.1.5   10.0.0.45
kafka-3   1/1       Running   0          1m        172.16.0.8   10.0.0.33

总结

本文详细的介绍了基于Statefulset(PetSet)+Persistent Volume的方式,部署有状态的集群服务zookeeper和kafka。总体上看,基于Statefulset+PV的方式很好的解决了kafka和zookeeper服务需要存储盘来保存信息,同时每个实例需要特定的Id标记的问题。但目前PV的创建过程,以及Statefulset的启动过程,相对于来说还是比较复杂。另外基于StatefulSet(PetSet)的扩容和升级对于实例的变更顺序依然有比较大的依赖,kubernetes社区也在做进一步探索。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
使用PandasGUI进行探索性数据分析
Pandasgui是一个开源的python模块,它为pandas创建了一个GUI界面,我们可以在其中使用pandas的功能分析数据和使用不同的功能,以便可视化和分析数据,并执行探索性数据分析。
deephub
2020/11/02
1.1K0
使用PandasGUI进行探索性数据分析
什么是“探索性数据分析"?
在大数据时代,混乱的、无结构的、多媒体的海量数据,通过各种渠道源源不断地积累和记载着人类活动的各种痕迹。探索性数据分析可以成为了一个有效的工具。 美国约翰·怀尔德杜克(John Wilder Tukey)1977年在《探索性数据分析》(Exploratory Data Analysis)一书中第一次系统地论述了探索性数据分析。他的主要观点是:探索性数据分析(EDA)与验证性数据分析(Confirmatory Data Analysis )有所不同:前者注重于对数据进行概括性的描述,不受数据模型和科研假设的限
CDA数据分析师
2018/02/11
3.1K0
什么是“探索性数据分析"?
在Python中进行探索式数据分析(EDA)
探索性数据分析(Exploratory Data Analysis ,EDA)是对数据进行分析并得出规律的一种数据分析方法。它是一个数据试图讲述的故事。EDA是一种利用各种工具和图形技术(如柱状图、直方图等)分析数据的方法。
deephub
2020/05/09
3.3K0
在Python中进行探索式数据分析(EDA)
带你和Python与R一起玩转数据科学: 探索性数据分析(附代码)
本系列将介绍如何在现在工作中用两种最流行的开源平台玩转数据科学。先来看一看数据分析过程中的关键步骤 – 探索性数据分析。
数据派THU
2018/08/14
2.1K0
带你和Python与R一起玩转数据科学: 探索性数据分析(附代码)
独家 | 探索性文本数据分析的新手教程(Amazon案例研究)
本文利用Python对Amazon产品的反馈对数据文本进行探索性研究与分析,并给出结论。
数据派THU
2020/07/22
1.7K0
独家 | 探索性文本数据分析的新手教程(Amazon案例研究)
数据科学的原理与技巧 五、探索性数据分析
在探索性数据分析(EDA),也就是数据科学生命周期的第三步中,我们总结,展示和转换数据,以便更深入地理解它。 特别是,通过 EDA,我们发现数据中的潜在问题,并发现可用于进一步分析的趋势。
ApacheCN_飞龙
2022/12/01
6210
精通 Pandas 探索性分析:1~4 全
在本章中,我们将学习如何在 Pandas 中使用不同种类的数据集格式。 我们将学习如何使用 Pandas 导入的 CSV 文件提供的高级选项。 我们还将研究如何在 Pandas 中使用 Excel 文件,以及如何使用read_excel方法的高级选项。 我们将探讨其他一些使用流行数据格式的 Pandas 方法,例如 HTML,JSON,PKL 文件,SQL 等。
ApacheCN_飞龙
2023/04/23
29.1K0
使用决策树进行探索性数据分析
DT 在运筹学和数据科学领域非常实用,其成功的原因在于它遵循与人类决策过程类似的过程。该过程基于流程图,其中每个节点都会对给定变量进行简单的二元决策,直到我们做出最终决策。
数据STUDIO
2024/08/01
1670
使用决策树进行探索性数据分析
【优质原创】介绍一个效率爆表的探索性数据分析插件
今天给大家介绍一款十分强大的数据集探索性分析插件,D-Tale,供我们分析和了解数据集的基本情况,并且支持对数据进行进一步的可视化分析,首先我们先要安装好该模块
用户6888863
2022/06/08
4680
【优质原创】介绍一个效率爆表的探索性数据分析插件
10 个 Python 自动探索性数据分析神库!
这是「进击的Coder」的第 719 篇技术分享 来源:数据 STUDIO “ 阅读本文大概需要 7 分钟。 ” 探索性数据分析是数据科学模型开发和数据集研究的重要组成部分之一。在拿到一个新数据集时首先就需要花费大量时间进行 EDA 来研究数据集中内在的信息。自动化的 EDA Python 包可以用几行 Python 代码执行 EDA。在本文中整理了 10 个可以自动执行 EDA 并生成有关数据的见解的 Python 包,看看他们都有什么功能,能在多大程度上帮我们自动化解决 EDA 的需求。 DTale
崔庆才
2022/09/13
2K0
10 个 Python 自动探索性数据分析神库!
数据的探索性(EDA)分析
这里主要是对读取的数据有一个大致的了解,包括简单了解数据的行列信息,数据的统计特征等
mathor
2020/03/25
1.1K0
数据的探索性(EDA)分析
使用Dataprep进行自动化的探索性数据分析
数据分析帮助我们识别数据集中的模式,分析不同变量之间的相关性和关联。借助不同的可视化,我们可以确定数据是否试图讲述任何特定的故事。有不同类型的图表和绘图可用于分析和可视化数据。
deephub
2021/08/20
6320
Github项目推荐 | visdat - 数据初步探索性可视化工具
visdat - Preliminary Exploratory Visualisation of Data
AI研习社
2019/06/04
8730
Github项目推荐 | visdat - 数据初步探索性可视化工具
独家 | 用pandas-profiling做出更好的探索性数据分析(附代码)
探索性数据分析已失势,Pandas-profiling万岁!用更省力的办法完美呈现你的数据。
数据派THU
2020/07/02
7530
独家 | 用pandas-profiling做出更好的探索性数据分析(附代码)
R语言探索BRFSS数据可视化
在本实验中,我们将使用dplyr软件包探索数据,并使用ggplot2软件包对其进行可视化以进行数据可视化
拓端
2020/08/23
7800
机器学习的第一个难点,是数据探索性分析
当我们在进行机器学习领域的学习和研究时,遇到的第一个难点就是数据探索性分析(Exploratory Data Analysis)。虽然从各种文献中不难了解到数据探索性分析的重要性和一般的步骤流程,但是在面对实际问题时,往往会有不知道从哪儿下手以及不知道怎么根据分析结果来优化算法的困境。
AI科技大本营
2021/03/12
6660
机器学习的第一个难点,是数据探索性分析
用 Python 对新冠病毒做数据分析,我们得出哪些结论?
一种最初在中国城市武汉被发现的病毒,现在已经传播到世界上十几个国家,引发了前所未有的健康和经济危机。
AI研习社
2020/02/24
1.8K0
用 Python 对新冠病毒做数据分析,我们得出哪些结论?
Python数据分析之数据探索分析(EDA)
何为EDA,何谓探索性数据分析?英文名为Exploratory Data Analysis,是在你拿到数据集后,并不能预知能从数据集中找到什么,但又需要了解数据的基本情况,为了后续更好地预处理数据、特征工程乃至模型建立。因此探索性数据分析,对了解数据集、了解变量之间对相互关系以及变量与预测值之间的关系尤其重要。
数据STUDIO
2021/06/24
3.9K0
时间序列预测:探索性数据分析和特征工程的实用指南
时间序列分析是数据科学和机器学习领域最广泛的主题之一:无论是预测金融事件、能源消耗、产品销售还是股票市场趋势,这一领域一直是企业非常感兴趣的领域。
deephub
2024/05/20
2420
时间序列预测:探索性数据分析和特征工程的实用指南
B2B营销中使用Python进行探索性数据分析
该项目侧重于使用Python进行B2B营销的探索性数据分析(EDA)。将使用来自Olist的数据,Olist是一个将中小型企业与巴西顶级市场连接起来的电子商务平台。除了提供方法和代码之外,还想讨论B2B营销的基本原理以及EDA的这些见解如何帮助Olist做出更好的营销决策。GitHub上提供了所有Python代码。
代码医生工作室
2019/06/23
1.4K0
推荐阅读
相关推荐
使用PandasGUI进行探索性数据分析
更多 >
LV.0
美团点评算法实习生
目录
  • 引言
  • Persistent Volume存储的创建
  • zookeeper中StatefulSet(Petset)资源和headless服务的创建
  • 创建过程中查看具体的资源信息:
  • 查看服务实例内部状态
  • kafka中StatefulSet(Petset)资源和headless服务的创建
  • 进行kafka集群可用性测试
  • kafka进行扩容测试
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档