Kylin OLAP 綜合解決方案環境部署及雙引擎切換實踐-Spark商業應用實戰
本套技術專欄是作者(秦凱新)平時工作的總結和昇華,通過從真實商業環境抽取案例進行總結和分享,並給出商業應用的調優建議和叢集環境容量規劃等內容,請持續關注本套部落格。版權宣告:禁止轉載,歡迎學習。QQ郵箱地址:[email protected],如有任何商業交流,可隨時聯絡。
0 初期運維實踐
1 [[email protected] conf]# netstat -an|grep 8050 tcp6 0 0 10.44.219.80:8050 :::* LISTEN [
[email protected] conf]# netstat -apn | grep 8088 tcp6 0 0 :::8088 :::* LISTEN 2468/java 2 此處是替換aaa.xml中的localhost,把他替換成qinkaixin Master=qinkaixin sed "s/localhost/"$Master"/g" aaa.xml > bbb.xml 3 Kubernates運維實踐: 1:進入pod: kubectl exec web-67c6b4476c-hds7q -it /bin/bash 2:檢視版本: kubectl version 3:得到node節點: kubectl get nodes 4:將一個映象執行起來 kubectl run sonarqube --image=192.168.32.131:5000/sonarqube:5.6.5 --replicas=1 --port=9000 5:得到deployment列表 kubectl get deployment 6:得到pods列表 kubectl get pods -o wide 7:刪除一下建立的物件 kubectl delete pods sonarqube-7c45b4d4bb-d8w9v 8:檢視pod日誌: kubectl logs sonarqube-7c45b4d4bb-b77q6 -f 9:進入Pod,exec命令用於到容器中執行一條命令 kubectl exec web-67c6b4476c-hds7q hostname 10:更為常用的方式則是登陸到pod中,在有條件的時候,進行故障發生時的現場確認 kubectl exec -it web-67c6b4476c-hds7q /bin/bash 11:需要看整體的全部資訊的時候 kubectl cluster-info Kubernetes master is running at https://rancher.k8s.cn/k8s/clusters/c-cc2mt KubeDNS is running at https://rancher.k8s.cn/k8s/clusters/c-cc2mt/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy 12:對service按照名字進行過濾 kubectl get service |grep nginx 13:kubectl apply 來使用檔案或者標準輸入來更改配置資訊 -->修改 kubectl apply -f nginx/nginx.yaml 14:kubectl scale 實現deployment實現擴縮容 當前副本數為3,擴容副本數 kubectl scale --current-replicas=3 --replicas=6 deployment/nginxdeployment
1 Kylin的配置(啟動StandAlone模式)
1 kylin.properties
kylin.env.hadoop-conf-dir=/usr/local/soft/install/hadoop-2.7.6/etc/hadoop/ kylin.server.query-metrics2-enabled=true kylin.metrics.reporter-query-enabled=true kylin.metrics.reporter-job-enabled=true kylin.metrics.monitor-enabled=true kylin.web.dashboard-enabled=true ##kylin.engine.spark-conf.spark.master=yarn kylin.engine.spark-conf.spark.master=spark://Master:7077 kylin.engine.spark-conf.spark.dynamicAllocation.enabled=false kylin.engine.spark-conf.spark.driver.memory=2G kylin.engine.spark-conf.spark.executor.memory=6G kylin.engine.spark-conf.spark.executor.cores=6 kylin.engine.spark-conf.spark.network.timeout=600 kylin.engine.spark-conf.spark.shuffle.service.enabled=false kylin.engine.spark.rdd-partition-cut-mb=10 kylin.engine.spark-conf.spark.yarn.archive=hdfs://Master:9000/kylin/spark/spark-libs.jar
2:建立樣本
./sample.sh 建立實驗樣本
./kylin.sh start 啟動
3: kylin 中間資料清理:
./kylin.sh org.apache.kylin.storage.hbase.util.StorageCleanupJob --delete true
2 spark 配置
1 spark-defaults.conf
spark.eventLog.enabled true
spark.eventLog.dir hdfs://Master:9000/spark-events
spark.eventLog.compress true
spark.yarn.jars=hdfs://Master:9000/sparkJars/jars/*
2 spark-env.sh
export JAVA_HOME=/usr/local/soft/install/jdk1.8.0_171
export SPARK_MASTER_IP=Master
export SPARK_WORKER_CORES=8
export SPARK_WORKER_MEMORY=7g
export SPARK_EXECUTOR_MEMORY=6g
export SPARK_MASTER_PORT=7077
export SPARK_EXECUTOR_INSTANCES=1
export SPARK_WORKER_INSTANCES=1
export SPARK_MASTER_WEBUI_PORT=8080
export HADOOP_CONF_DIR=/usr/local/soft/install/hadoop-2.7.6/etc/hadoop
export SPARK_HISTORY_OPTS="-Dspark.history.ui.port=18080 -Dspark.history.retainedApplications=50 -Dspark.history.fs.logDirectory=hdfs://Master:9000/spark-events"
3 軟連線hive-site.xml
4 拷貝Mysql jar包到jars
5 把Spark的jar包放在指定目錄,kylin要使用
jar cv0f spark-libs.jar -C $SPARK_HOME/jars/ .
hadoop fs -mkdir -p /kylin/spark/
hadoop fs -put spark-libs.jar /kylin/spark/
5:拷貝Spark的jar包放在/sparkJars/jars/中,Yarn要使用
hadoop fs -mkdir -p /sparkJars/jars/
hadoop fs -put jars/* /sparkJars/jars/
6 Spark join
hive維度表
create external table customer(
id string,
base_create_time string,
base_last_update_time string,
customer_code string,
customized_domain string,
b_full_name string,
b_title string,
b_two_domain string,
user_id string,
user_name string,
company_id string
)partitioned by (env String) row format delimited fields terminated by '|';
spark.sql("use accesslog")
spark.sql("load data inpath '/DB_warehouse/customer/' overwrite into table customer partition (env='dev')")
val left =spark.sql("select host, count(*) as total from accesslog a group by host order by total desc limit 5")
case class LeftcaseFrame(host:String,total:Long)
val leftDs=left.as[LeftcaseFrame]
去除host第一行的空格
val joinleft=leftDs.map(a => LeftcaseFrame(a.host.substring(1), a.total))
val joinright=spark.sql("select distinct * from elev")
joinleft.join(joinright,joinleft("host")===joinright("sub_domain"),"outer").show
joinleft.join(joinright,joinleft("host")===joinright("sub_domain"),"left_outer").show
Mysql聚合分析:
val jdbc =spark.read.format("jdbc") .option("url", "jdbc:mysql://192.168.1.160:3306/test").option("dbtable", "tb_customer").option("user", "root").option("password", "123").load()
7:spark的啟動
spark-shell --master spark://bd-master:7077 --total-executor-cores 40 --executor-memory 4096m --executor-cores 4
spark-shell --master yarn --executor-memory 4096m --num-executors 10 --executor-cores 4
8 spark-submit standalone叢集模式之client模式:
./bin/spark-submit --class org.apache.spark.examples.SparkPi --master spark://master:7077 --executor-memory 512m --num-executors 3 ./examples/jars/spark-examples_2.11-2.0.0.jar 100
9.local單機模式:
./bin/spark-submit --class org.apache.spark.examples.SparkPi --master local[1]
./examples/jars/spark-examples_2.11-2.0.0.jar 10
10: 打包提交應用程式
注意 引數順序:
1:class
2: 執行方式
3: jar包位置
4:輸入引數1
5:輸入引數2
6:執行記憶體
10: spark-submit除錯,此處執行的是Spark自帶Streaming的例子,採用的提交方式是這個:
./bin/spark-submit --class org.apache.spark.examples.streaming.NetworkWordCount --master spark://master:7077 --executor-memory 512m --num-executors 3 ./examples/jars/spark-examples_2.11-2.0.0.jar localhost 9999
3 hive
home:
/usr/local/soft/cdh_support/hive-1.1.0-cdh5.9.3/conf
1 配置hive-site.xml
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://Master:3306/metastore?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
2 :定義日誌路徑
mkdir -p /log_all/hive
chown admin:admin /log_all/hive
3:資料庫初始化
在mysql中hive的schema(在此之前需要建立mysql下的hive資料庫)
schematool -dbType mysql -initSchema
4:拷貝mysql的驅動
複製mysql的驅動到hive/lib下面
5 啟動
home /usr/local/soft/cdh_support/hbase-1.2.0-cdh5.9.3
hive --service metastore --presto啟動需要
$HIVE_HOME/bin/hiveserver2 & --zeeplin啟動需要
4 hbase
1:部署zookeeper,設定路徑
mkdir -p /zookeeper/dataDir
chown admin:admin /zookeeper/dataDir
2:配置 hbase-site.xml:
<property>
<name>hbase.rootdir</name>
<value>hdfs://Master:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.master</name>
<value>60000</value>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>Master,Worker1,Worker2</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/zookeeper/dataDir</value>
</property>
<property>
<name>hbase.rpc.controllerfactory.class</name>
<value>org.apache.hadoop.hbase.ipc.controller.ServerRpcControllerFactory</value>
</property>
3 建立軟連線core-site.xml 和 hdfs-site.xml
ln -s /usr/local/soft/cdh_support/hadoop-2.6.0-cdh5.9.3/etc/hadoop/core-site.xml
ln -s /usr/local/soft/cdh_support/hadoop-2.6.0-cdh5.9.3/etc/hadoop/hdfs-site.xml
4:傳送
scp -r hadoop-2.6.0-cdh5.9.3 Worker2:/usr/local/soft/cdh_support/hbase-1.2.0-cdh5.9.3
5 檢視
http://master:60010/master-status(老版本)
http://master:16010/master-status(新版本)
6 配置 hbase-env.sh
7 配置regionservers
Master
Worker1
Worker2
8 Hbase啟動服務
zkServer.sh start:注意先啟動zookeeper
$ bin/hbase-daemon.sh start master
$ bin/hbase-daemon.sh start regionserver
或者:
$ bin/start-hbase.sh
對應的停止命令:
$ bin/stop-hbase.sh
./hbase-daemon.sh start thrift
5 hadoop
1 home
/usr/local/soft/cdh_support/hadoop-2.6.0-cdh5.9.3
cd /usr/local/soft/cdh_support
2 log所在地:
mkdir -p /log_all/hadoop
3 metaData所在地:
mkdir -p /hadoop/datanode
mkdir -p /hadoop/namenode
chown admin:admin /log_all/hadoop
chown admin:admin /hadoop/datanode
chown admin:admin /hadoop/namenode
4 core-site.xml:
<property>
<name>hadoop.tmp.dir</name>
<value>/log_all/hadoop</value>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://Master:9000</value>
</property>
5 hdfs-site.xml:
<!-- 指定HDFS副本的數量 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.datanode.max.xcievers</name>
<value>8192</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/hadoop/datanode</value>
</property>
<property>
<name>dfs.namenode.datanode.registration.ip-hostname-check</name>
<value>false</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/hadoop/namenode</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
6 yarn-site.xml:
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.shuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>Master:8025</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>Master:8030</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>Master:8050</value>
</property>
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>40960</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>4096</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>10</value>
</property>
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>2.1</value>
</property>
<property>
<name>hadoop.proxyuser.admin.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.admin.groups</name>
<value>*</value>
</property>
scp -r hadoop-2.6.0-cdh5.9.3 Worker2:/usr/local/soft/cdh_support
scp -r hadoop-2.6.0-cdh5.9.3 Worker1:/usr/local/soft/cdh_support
7 hadoop - env. sh:
8 mapred-site.xml
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapred.job.tracker</name>
<value>master:54311</value>
</property>
9 啟動
hadoop namenode -format
mr-jobhistory-daemon.sh start historyserver
Hadoop均衡和安全模式 8088 50070
hadoop namenode -format
hadoop dfsadmin -safemode leave
hdfs dfsadmin -refreshNodes
start-balancer.sh
6 telnet
telnet安裝:
yum install telnet-server.x86_64 –y
rpm -qa | grep telnet
yum -y install telnet
rpm -qa | grep telnet
7 Flume
1:Socket模擬實驗:
a1.sources = r1
a1.sinks = k1
a1.channels = c1
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444
a1.sinks.k1.type = logger
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
$ bin/flume-ng agent --conf conf/ --name a1 --conf-file conf/flume-telnet.conf
-Dflume.root.logger==INFO,console
telnet localhost 44444
2:日誌動態並上傳到Hdfs監聽:
拷貝Hadoop相關jar到Flume的lib目錄下
share/hadoop/common/lib/hadoop-auth-2.5.0-cdh5.3.6.jar
share/hadoop/common/lib/commons-configuration-1.6.jar
share/hadoop/mapreduce1/lib/hadoop-hdfs-2.5.0-cdh5.3.6.jar
share/hadoop/common/hadoop-common-2.5.0-cdh5.3.6.jar
建立flume-hdfs.conf檔案
a2.sources = r2
a2.sinks = k2
a2.channels = c2
a2.sources.r2.type = exec
a2.sources.r2.command = tail -f /usr/local/soft/log_all/hive/hive.log
a2.sources.r2.shell = /bin/bash -c
a2.sinks.k2.type = hdfs
a2.sinks.k2.hdfs.path = hdfs://Master:9000/flume/%Y%m%d/%H
#上傳檔案的字首
a2.sinks.k2.hdfs.filePrefix = events-hive-
#是否按照時間滾動資料夾
a2.sinks.k2.hdfs.round = true
#多少時間單位建立一個新的資料夾
a2.sinks.k2.hdfs.roundValue = 1
#重新定義時間單位
a2.sinks.k2.hdfs.roundUnit = hour
#是否使用本地時間戳
a2.sinks.k2.hdfs.useLocalTimeStamp = true
#積攢多少個Event才flush到HDFS一次
a2.sinks.k2.hdfs.batchSize = 100
#設定檔案型別,可支援壓縮
a2.sinks.k2.hdfs.fileType = DataStream
#多久生成一個新的檔案
a2.sinks.k2.hdfs.rollInterval = 30
#設定每個檔案的滾動大小
a2.sinks.k2.hdfs.rollSize = 134217700
#檔案的滾動與Event數量無關
a2.sinks.k2.hdfs.rollCount = 0
#最小冗餘數
a2.sinks.k2.hdfs.minBlockReplicas = 1
a2.channels.c2.type = memory
a2.channels.c2.capacity = 1000
a2.channels.c2.transactionCapacity = 1000
a2.sources.r2.channels = c2
a2.sinks.k2.channel = c2
執行監控配置
$ bin/flume-ng agent --conf conf/ --name a2 --conf-file conf/flume-hdfs.conf
3.1 avro 服務端配置(flume-tailsource-avro-server):
a1.sources = r1
a1.sinks = k1
a1.channels = c1
#source
a1.sources.r1.type = avro
a1.sources.r1.bind= Master
a1.sources.r1.port= 55555
#sink
a1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
a1.sinks.k1.kafka.topic = TestTopic
a1.sinks.k1.kafka.bootstrap.servers = Master:9092,Worker1:9092,Worker2:9092
a1.sinks.k1.kafka.flumeBatchSize = 20
a1.sinks.k1.kafka.producer.acks = 1
a1.sinks.k1.kafka.producer.linger.ms = 1
#channel
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
#bind
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
3.2 avro客戶端配置(flume-tailsource-avro-client):
a2.sources = r2
a2.sinks = k2
a2.channels = c2
a2.sources.r2.type = exec
a2.sources.r2.command = tail -f /usr/local/openresty/nginx/logs/access.log
a2.sources.r2.shell = /bin/bash -c
a2.sinks.k2.type = avro
a2.sinks.k2.hostname=Master
a2.sinks.k2.port=55555
a2.channels.c2.type = memory
a2.channels.c2.capacity = 1000
a2.channels.c2.transactionCapacity = 1000
a2.sources.r2.channels = c2
a2.sinks.k2.channel = c2
#sink配置
a1.sinks.k1.type=logger
a1.sinks.k1.channel=c1
3.3 avro客戶端配置(flume-avro-client):
a2.sources = r2
a2.sinks = k2
a2.channels = c2
#source
a2.sources.r2.type = TAILDIR
a2.sources.r2.positionFile = /usr/local/soft/log_all/WAF_log/taildir_position.json
a2.sources.r2.filegroups=f1
a2.sources.r2.filegroups.f1=/usr/local/openresty/nginx/logs/access.log
a2.sources.r2.fileHeader=true
#sinks
a2.sinks.k2.type = avro
a2.sinks.k2.hostname=Master
a2.sinks.k2.port=55555
#channels
a2.channels.c2.type = memory
a2.channels.c2.capacity = 1000
a2.channels.c2.transactionCapacity = 1000
#bind
a2.sources.r2.channels = c2
a2.sinks.k2.channel = c2
3.4 測試
模擬客戶端:
bin/flume-ng avro-client -c conf -H Master -p 55555
-F /usr/local/apache-flume-1.6.0-cdh5.5.4-bin/testdata/testdata
真實客戶端啟動:
bin/flume-ng agent --conf conf --name a2 --conf-file conf/flume-avro.conf
-Dflume.root.logger=INFO,console
真實服務端啟動:
bin/flume-ng agent -c conf -f conf/flume-avro-hdfs.conf -n a2
-Dflume.root.logger=INFO,console
8 sqoop
sqoop-version
匯入使用者資訊到倉庫資料:
bin/sqoop import
--connect jdbc:mysql://192.168.1.160:3306/test
--username root
--password 123456
–-table tb_customer
--m 2
匯入使用者資訊到指定目錄:
bin/sqoop import -
-connect jdbc:mysql://192.168.1.160:3306/test
--username root
--password 123456
--target-dir /DB_warehouse/elev
--table tb_customer
--m 2
按照條件匯入電梯使用者資訊到指定目錄:
bin/sqoop import
--connect jdbc:mysql://192.168.1.160:3306/test
--username root
--password inovance321
--where "back_color!='null'"
--target-dir /DB_warehouse/elev/test
--table tb_customer
--m 1
query條件匯入電梯使用者資訊到指定目錄:
bin/sqoop import
--connect jdbc:mysql://192.168.1.160:3306/test
--username root
--password inovance321
--target-dir /DB_warehouse/elev/test9
--query 'select id, account from tb_customer WHERE address !=" " and
$CONDITIONS'
--split-by id
--fields-terminated-by '\t'
--m 1
通過以上過程,我們得知一點:$CONTITONS是linux系統的變數,在執行過程中被賦值為(1=0),雖然實際執行的這個sql很奇怪。
現在正式開始研究CONTITONS到底是什麼,所以我們先檢視官方文件。
If you want to import the results of a query in parallel, then each map task will need to execute a copy
of the query, with results partitioned by bounding conditions inferred by Sqoop. Your query must include
the token $CONDITIONS which each Sqoop process will replace with a unique condition expression.
You must also select a splitting column with --split-by.
如果你想通過並行的方式匯入結果,每個map task需要執行sql查詢語句的副本,結果會根據sqoop推測的邊界條件分割槽。query必須包含$CONDITIONS。這樣每個scoop程式都會被替換為一個獨立的條件。同時你必須指定–split-by.分割槽
For example:
$ sqoop import \
--query 'SELECT a.*, b.* FROM a JOIN b on (a.id == b.id) WHERE $CONDITIONS' \
--split-by a.id --target-dir /user/foo/joinresults
9 Zookeeper搭建:
1:zookeeper根目錄下,進行zoo.cfg配置
initLimit
ZooKeeper叢集模式下包含多個zk程序,其中一個程序為leader,餘下的程序為follower。
當follower最初與leader建立連線時,它們之間會傳輸相當多的資料,尤其是follower的資料落後leader很多。
initLimit配置follower與leader之間建立連線後進行同步的最長時間。
syncLimit
配置follower和leader之間傳送訊息,請求和應答的最大時間長度。
tickTime
tickTime則是上述兩個超時配置的基本單位,例如對於initLimit,其配置值為5,說明其超時時間為 2000ms * 5 = 10秒。
server.id=host:port1:port2
其中id為一個數字,表示zk程序的id,這個id也是dataDir目錄下myid檔案的內容。
host是該zk程序所在的IP地址,port1表示follower和leader交換訊息所使用的埠,port2表示選舉leader所使用的埠。
dataDir
其配置的含義跟單機模式下的含義類似,不同的是叢集模式下還有一個myid檔案。myid檔案的內容只有一行,
且內容只能為1 - 255之間的數字,這個數字亦即上面介紹server.id中的id,表示zk程序的id。
#傳送心跳的間隔時間,單位:毫秒
tickTime=2000
#zookeeper儲存資料的目錄
dataDir=/modules/zookeeper-3.4.5-cdh5.11.1/data
#日誌目錄
dataLogDir=/modules/zookeeper-3.4.5-cdh5.11.1/dataLog
#埠
clientPort=2181
#leader和follower初始化連線時最長能忍受多少個心跳時間的間隔數
initLimit=5
#leader和follower之間傳送訊息,請求和英達時間長度,最長不能超過多少個tickTime的時間長度
syncLimit=2
#zookeeper機器列表,server.order這裡的Order依據叢集的機器個數依次進行遞增,這裡的server1、server2、server3表示機器IP地址
server.1=server1:2888:3888
server.2=server2:2888:3888
server.3=server3:2888:3888
2:在每個dataLogDir目錄下,建立myid,順序不能錯
然後修改data目錄的下的myid 檔案中的數字,在這裡即為將server2的myid內容修改為2,將server3的myid內容修改為3。
對於不同的叢集,根據需要進行修改,與配置檔案中的order保持一致。
/zkServer.sh start
10 Kafka搭建
1:啟動kafka
nohup bin/kafka-server-start.sh config/server.properties &
2:建立主題:
bin/kafka-topics.sh --zookeeper master:2181,data1:2181,data2:2181 --topic TestTopic4 --replication-factor 1 --partitions 1 --create
3:建立生產者
bin/kafka-console-producer.sh --broker-list master:9092,data1:9092,data2:9092 --topic TestTopic4
4:建立消費者
bin/kafka-console-consumer.sh --zookeeper master:2181,data1:2181,data2:2181 --topic AdRealTimeLog --from-beginning
11 MySQL搭建
Ubuntu上安裝MySQL非常簡單隻需要幾條命令就可以完成。
1. sudo apt-get install mysql-server
2. apt-get install mysql-client
3. sudo apt-get install libmysqlclient-dev
4.安裝過程中會提示設定密碼什麼的,注意設定了不要忘了,安裝完成之後可以使用如下命令來檢查是否安裝成功:
sudo netstat -tap | grep mysql
5.通過上述命令檢查之後,如果看到有mysql 的socket處於 listen 狀態則表示安裝成功。
登陸mysql資料庫可以通過如下命令:
mysql -u root -p
6.增加允許遠端訪問的使用者或者允許現有使用者的遠端訪問,給root授予在任意主機(%)訪問任意資料庫的所有許可權。SQL語句如下:
mysql> grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;
7:把某個已存在的使用者(例如root)修改成允許遠端主機訪問,則可以使用如下SQL來完成
update user set host='%' where user='root' and host='localhost';
8.重啟資料庫
>sudo service mysql restart
10:刪除匿名使用者
delete from user where user='';
12 Phoenix部署
1:選擇hbase對應的版本,環境變數配置
2:進入到phoenix的安裝目錄,找到 “phoenix-4.8.1-HBase-1.2-server.jar” ,將這個 jar
拷貝到叢集中每個節點( 主節點也要拷貝 )的 hbase 的 lib 目錄下:
3:重新啟動 hbase
4:啟動phoenix ,進入到 phoenix 安裝目錄的 bin 下:
sqlline.py Master,Worker1,Worker2:2181
6:在Hbase shell中建一張表:
create 'test1','cf1'
put 'test1','rk0001','cf1:NAME','zhang'
7:進入Phoenix shell:
create view "test1"(user_id varchar primary key,"cf1".NAME varchar);
!describe "test1"
select * from "test1"
8: 配置Squirrel客戶端
(1)將伺服器上Phoenix安裝目錄下的phoenix-4.11.0-HBase-1.2-client.jar檔案,下載到Windows下squirrel-sql安裝目錄
的lib資料夾下,並點選squirrel-sql.bat啟動。
(2)新增新的驅動(Drivers -> New Driver),如下圖所示:
(3)在彈出的“Add Driver”視窗中,設定Driver的“Name”為:Phoenix,“Phoenix”為:jdbc:phoenix:vmserver,
其中,vmserver為你Phoenix伺服器的地址;“ClassName”為:org.apache.phoenix.jdbc.PhoenixDriver,
最終結果如下圖:
設定完成後,點選OK關閉。
(4)點選“Drivers”邊上的“Alias”選項卡,和第(2)步的新建驅動一樣新建Alias (Aliases ->
New Aliases),在彈出的視窗中,填寫Name,UserName,Password,這三項可任意填寫,在Driver選項的下拉列表中查詢我們剛新增的Phoenix驅動,然後點選“Test”按鈕測試連線,然後點選“Connect”按鈕,彈出“Connection successful”表示配置成功。結果如下圖:
點選OK按鈕,關閉彈出視窗。
(5)雙擊新建的test Alias ,然後點選“Connect”按鈕,開啟SQL命令列,在“SQL”選項卡下,即可編寫sql命令,
新建一張person表進行測試
create table person (id integer not null primary key,name varchar,age integer)
插入一條資料:
[html] view plain copy
upsert into person values (1,‘zhangsan’ ,18)
查詢資料:
[html] view plain copy
select * from person
create 'techer11','cf1','cf2'
put 'techer11','rk0001','cf1:NAME','zhang'
put 'techer11','rk0001','cf1:age',12
put 'techer11','rk0001','cf2:num',16
put 'techer11','rk0001','cf2:sex','男'
put 'techer11','rk0002','cf1:NAME','qinkaixin'
put 'techer11','rk0002','cf1:age',12
put 'techer11','rk0002','cf2:num',16
put 'techer11','rk0002','cf2:sex','男'
create view "techer11"(user_id varchar primary key,
"cf1".NAME varchar,
"cf1"."age" varchar,
"cf2"."num" varchar,
"cf2"."sex" varchar);
select * from "techer"
13 zeppelin 部署
1.部署
下載地址:
http://zeppelin.apache.org/download.html
本人使用的版本是
Zeppelin 0.7.3
Hbase 1.4.4
Phoenix 4.14.0-HBase-1.4
Hive 2.2.0
Presto 0.206
解壓zeppelin-0.7.3-bin-all.gz 到Linux中 ,更改conf目錄中的zeppelin-site.xml.template 和zeppelin-en.sh.template 分別為zeppelin-site.xml 和zeppelin-en.sh 。
zeppelin.server.port 預設是8080,是Zeppelin伺服器埠,注意:確保沒有使用與Zeppelin Web應用程式開發埠相同的埠,zeppelin的預設埠為8080,假如有埠衝突,需要更改zeppelin-site.xml中的埠號,本人配置的是8085。
zeppelin.server.ssl.port預設是8443,Zeppelin Server ssl埠(當ssl環境/屬性設定為true時使用)。
接下來配置conf目錄中的zeppelin-en.sh檔案,要配置JAVA_HOME(必配,zeppelin是由Java開發的),其他都的配上相應的檔案路徑。
在bin目錄下執行下面語句來啟動啟動zeppelin,還可以停止和重啟。
$ zeppelin-daemon.sh start
$ zeppelin-daemon.sh stop
$ zeppelin-daemon.sh restart
conf目錄的zeppelin-site.xml中的zeppelin.anonymous.allowed預設是true,預設情況下允許匿名(anonymous)使用者。
如果改為false,則使用賬號密碼登入,將/zeppelin/conf/shiro.ini.template修改為/zeppelin/conf/shiro.ini,
然後對其內容修改,如下:
在users中配置賬戶名和密碼,我配置了兩個賬戶,一個是賬戶admin,密碼admin,
一個是賬戶qinkaixin,密碼123456。
Role1,2,3表示其充當的角色,可以在後面的WebUI中設定他們的許可權。
下圖最後一行的 /**=authc 表示對任何url訪問都需要驗證。
在瀏覽器中輸入localhost:8085,頁面如下,在右上角進行登入。
可以填寫該notebook的Owners(所有者)、Readers(只讀使用者)、Writers(讀寫使用者),
這樣每一個notebook就可以歸屬於某一個具體的使用者了,避免了多使用者同時使用
zeppelin可能造成的衝突 ,我選擇了將role1 設定為只讀使用者。
1 Hbase
Zeppelin預設配置了hbase直譯器,如下圖所示。如果你配置了HBASE的環境變數,那麼hbase
interpreter預設就會讀取到你的HBASE路徑。需要注意的是,要檢視interpreter/hbase目錄下的jar包版本,
本人使用的是Hbase1.4.4版本,而預設的是1.0版本,所以可將
Zeppelin/interpreter/hbase目錄下除zeppelin-hbase-0.7.3.jar包之外的所有jar包刪除,
然後將叢集hbase安裝路徑下的lib中的所有jar包拷貝至Zeppelin/interpreter/hbase下。
接下來建立notebook啟動hbase服務,可以在預設直譯器中選擇hbase,則在notebook中就不需要指明直譯器,也可寫%hbase。
2 mysql
Zeppelin沒有mysql的直譯器,需要自己新增。在interpreters中點選create,輸入你的interpreters name,並選擇其group為jdbc。
Name Value
default.driver com.mysql.jdbc.Driver
default.url jdbc:mysql://localhost:3306/
default.user mysql_user
default.password mysql_password
新增下面的Dependencies:
Artifact Excludes
mysql:mysql-connector-java:5.1.46
3 hive
Hive與mysql一樣,同樣是需要自己配置直譯器,採用的group也是jdbc。配置如下:
Name Value
default.driver org.apache.hive.jdbc.HiveDriver
default.url jdbc:hive2://localhost:10000
default.user hive_user
default.password hive_password
新增的依賴:
Artifact Excludes
org.apache.hive:hive-jdbc:1.2.1
org.apache.hadoop:hadoop-common:2.7.6
本人的hive是2.2.0版本,採用低版本的jdbc也可以執行(版本太高可能zeppelin不支援)。
4 presto
選擇jdbc分組,配置如下,我presto的埠是9001
Name Value
default.driver com.facebook.presto.jdbc.PrestoDriver
default.url jdbc:presto://localhost:9001/hive/default
default.user user
default.password password
新增的依賴:
Artifact Excludes
com.facebook.presto:presto-jdbc:0.170
org.apache.hive:hive-jdbc:1.2.1
org.apache.hadoop:hadoop-common:2.7.6
本人的presto是0.206版本,親測使用0.206的jdbc執行不了,而0.170的可以完美執行。
5 phoenix
同上,選擇jdbc分組,配置如下
Name Value
default.driver org.apache.phoenix.jdbc.PhoenixDriver
default.url jdbc:phoenix:localhost:2181
default.user user
default.password password
新增的依賴:
Artifact Excludes
org.apache.phoenix:phoenix-core:4.14.0-HBase-1.4
14 SupetSet部署
RUN \cp -rf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
echo 'Asia/Shanghai' >/etc/timezone
RUN mkdir -p /usr/local/python3
#PYTHON copy
ADD Python-3.6.1.tgz /usr/local/python3
WORKDIR /root
#進入解壓後的目錄,編譯安裝
RUN cd /usr/local/python3/Python-3.6.1 &&\
./configure --prefix=/usr/local/python3 &&\
make && make install
#建立python3的軟鏈
RUN rm -rf /usr/bin/python3 &&\
rm -rf /usr/bin/lsb_release &&\
ln -s /usr/local/python3/bin/python3 /usr/bin/python3
#環境變數
ENV LANG='C.UTF-8' LANGUAGE='zh_CN.zh' LC_ALL='C.UTF-8'
ENV PATH=$PATH:/usr/local/python3/bin
COPY superset-entrypoint.sh /
#環境生效
RUN pip3 install --upgrade setuptools pip mysqlclient && \
pip3 install superset && \
chmod +x /superset-entrypoint.sh
#SUPERSET copy
ADD superset.tar.gz /usr/local/
#ENTRYPOINT
ENTRYPOINT ["/superset-entrypoint.sh"]
#暴露埠
EXPOSE 1000
#! /bin/bash
#複製
cp -f /usr/local/superset/config.py /usr/local/python3/lib/python3.6/site-packages/superset/
#superset後臺執行
superset runserver -d &
# 容器不退出
tail -f /dev/null
FROM ubuntu:14.04
# ssh config
RUN apt-get update && apt-get install -y openssh-server wget vim gcc make build-essential libssl-dev libffi-dev python3.5-dev python-pip libsasl2-dev libldap2-dev libsqlite3-dev libmysqlclient-dev && \
ssh-keygen -t rsa -f ~/.ssh/id_rsa -P '' && \
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys && \
apt-get clean
結語
秦凱新 與深圳