hadoop(配置文件都在$HADOOP_HOME/etc/hadoop)
- hadoop.env.sh
#export JAVA_HOME=${JAVA_HOME} export JAVA_HOME=/opt/modules/jdk1.8.0_11 #配置java_home
- core-site.xml
<configuration> <property> <name>fs.default.name</name> <value>hdfs://pyspark-1.bigload.com:8020</value> </property> </configuration>
- hdfs-site.xml
<configuration> <property> <name>dfs.namenode.name.dir</name> <value>/opt/modules/hadoop-2.6.0-cdh5.7.0/tmp/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>/opt/modules/hadoop-2.6.0-cdh5.7.0/tmp/dfs/data</value> </property> <!--副本數--> <property> <name>dfs.replication</name> <value>1</value> </property> </configuration>
- mapred-site.xml(cp mapred-site.xml.template mapred-site.xml)
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
- yarn-site.xml
<configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>
- 格式化
bin/hadoop namenode –format
- 無祕鑰登錄
ssh無祕鑰登錄 cd ~/.ssh 主節點 NameNode 1)生成一對公鑰與祕鑰 ssh-keygen -t rsa 2)拷貝公鑰到各個機器上 ssh-copy-id pyspark-1.bigload.com ssh-copy-id localhost ssh-copy-id 0.0.0.0
- 啓動hdfs
sbin/start-dfs.sh
- 遊覽器查看(http://pyspark-1.bigload.com:50070),傳個文件
bin/hadoop dfs -mkdir -p /test bin/hadoop fs -put README.txt /test
- 啓動yarn
sbin/start-yarn.sh
- 遊覽器查看(http://pyspark-1.bigload.com:8088/)
maven
- 解壓
tar -zxf apache-maven-3.3.9-bin.tar.gz -C /opt/modules/
- 建立local/repo文件夾,並且修改config/settings.xml
創建local/repo文件夾 mkdir -p local/repo settings.xml <localRepository>/opt/modules/apache-maven-3.3.9/local/repo</localRepository> 並添加鏡像: <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror>
python
yum源(阿里雲)http://www.cnblogs.com/lin1/p/5607121.html
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel gcc
tar -zxf Python-3.6.9.tgz
cd Python-3.6.9
./configure --prefix=/opt/modules/python3/
cd /opt/modules/python3
make && make install
spark
解壓
修改爲對應的版本(dev/make-distribution.sh)
初始
VERSION=$("$MVN" help:evaluate -Dexpression=project.version $@ 2>/dev/null | grep -v "INFO" | tail -n 1)
SCALA_VERSION=$("$MVN" help:evaluate -Dexpression=scala.binary.version $@ 2>/dev/null\
| grep -v "INFO"\
| tail -n 1)
SPARK_HADOOP_VERSION=$("$MVN" help:evaluate -Dexpression=hadoop.version $@ 2>/dev/null\
| grep -v "INFO"\
| tail -n 1)
SPARK_HIVE=$("$MVN" help:evaluate -Dexpression=project.activeProfiles -pl sql/hive $@ 2>/dev/null\
| grep -v "INFO"\
| fgrep --count "<id>hive</id>";\
# Reset exit status to 0, otherwise the script stops here if the last grep finds nothing\
# because we use "set -o pipefail"
echo -n)
替換爲下面對應的參數值
VERSION=2.4.4
SCALA_VERSION=2.11.12
SPARK_HADOOP_VERSION=2.6.0-cdh5.7.0
SPARK_HIVE=1e.spark pom.xml 添加 cdh reponsitory
<repository>
<id>cloudera</id>
<url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>如果不添加會出現如下錯誤信息:
Failed to execute goal on project spark-launcher_2.11: Could not resolve dependencies for project org.apache.spark:spark-launcher_2.11:jar:2.1.0: Could not find artifact org.apache.hadoop:hadoop-client:jar:2.5.0-cdh5.3.6[ERROR] After correcting the problems, you can resume the build with the command
[ERROR] mvn <goals> -rf :spark-launcher_2.11
-rf :spark-launcher_2.11
./dev/make-distribution.sh --name 2.6.0-cdh5.7.0 --tgz -Pyarn -Phadoop-2.6 -Phive -Phive-thriftserver -Dhadoop.version=2.6.0-cdh5.7.0
編譯時間會有些長,會生成一個spark-2.4.4-bin-2.6.0-cdh5.7.0.tgz
tar -zxf spark-2.4.4-bin-2.6.0-cdh5.7.0.tgz -C /opt/modules
隨後進入編譯後的文件夾
cd /opt/modules/spark-2.4.4-bin-2.6.0-cdh5.7.0
可以用bin/spark-shell測試一下
配置SPARK默認使用 PYTHON3
在 bin/pyspark 文件中添加 export PYSPARK_PYTHON=python3
(這裏最好也把PYSPARK_PYTHON加入環境變量,省的之後出錯,我就是之後用pyspark運行腳本的時候報錯了,才發現,python/pyspark/裏還需要改pyspark_python的,所以加入環境變量沒毛病)
http://www.bubuko.com/infodetail-2294107.html
源碼:https://github.com/apache/spark
spark core核心rdd
什麼是rdd,彈性分佈式數據集(Resilient Distributed Dataset )
1)rdd是一個抽象類
2)帶泛型的,可以支持多種類型:String,User,Person
rdd特性
不可變
分區
並行計算的
1.A list of partitions RDD是一個由多個partition(某個節點裏的某一片連續的數據)組成的的list;將數據加載爲RDD時,一般會遵循數據的本地性(一般一個hdfs裏的block會加載爲一個partition)。 2.A function for computing each split 一個函數計算每一個分片,RDD的每個partition上面都會有function,也就是函數應用,其作用是實現RDD之間partition的轉換。 3.A list of dependencies on other RDDs RDD會記錄它的依賴 ,依賴還具體分爲寬依賴和窄依賴,但並不是所有的RDD都有依賴。爲了容錯(重算,cache,checkpoint),也就是說在內存中的RDD操作時出錯或丟失會進行重算。 rdd1==>rdd2==>rdd3==>rdd4 rdd2=f1(rdd1) rdd3=f2(rdd2) rdd4=f3(rdd3)
4.Optionally,a Partitioner for Key-value RDDs 可選項,如果RDD裏面存的數據是key-value形式,則可以傳遞一個自定義的Partitioner進行重新分區,例如這裏自定義的Partitioner是基於key進行分區,那則會將不同RDD裏面的相同key的數據放到同一個partition裏面 5.Optionally, a list of preferred locations to compute each split on 最優的位置去計算,也就是數據的本地性。(數據在哪優先吧作業調度到數據所在的節點進行計算:移動數據不如移動計算) |
圖解rdd
sparkcontext & sparkconf
Spark程序必須做的第一件事是創建一個SparkContext對象,該對象告訴Spark如何訪問集羣。要創建一個,SparkContext
您首先需要構建一個SparkConf對象,其中包含有關您的應用程序的信息。
conf = SparkConf().setAppName(appName).setMaster(master)
sc = SparkContext(conf=conf)
該appName
參數是您的應用程序顯示在集羣UI上的名稱。 master
是Spark,Mesos或YARN羣集URL或特殊的“本地”字符串,以本地模式運行。實際上,當在集羣上運行時,您將不希望master
在程序中進行硬編碼,而是在其中啓動應用程序spark-submit
並在其中接收。但是,對於本地測試和單元測試,您可以傳遞“ local”以在內部運行Spark。
rdd創建方式
1.並行集合
>>> data=[1,2,3,4,5]
>>> distData=sc.parallelize(data)
>>> distData
ParallelCollectionRDD[0] at parallelize at PythonRDD.scala:195
>>> data
[1, 2, 3, 4, 5]
>>> disData.collect()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'disData' is not defined
>>> distData.collect()
[1, 2, 3, 4, 5]
>>> distData.reduce(lambda a,b:a+b)
15
2.外部數據集
PySpark可以從Hadoop支持的任何存儲源創建分佈式數據集,包括您的本地文件系統,HDFS,Cassandra,HBase,Amazon S3等。Spark支持文本文件,SequenceFiles和任何其他Hadoop InputFormat。
可以使用
SparkContext
的textFile
方法創建文本文件RDD 。此方法需要一個URI的文件(本地路徑的機器上,或一個hdfs://
,s3a://
等URI),並讀取其作爲行的集合。這是一個示例調用:
>>> distFile = sc.textFile("data.txt")
一旦創建,
distFile
就可以通過數據集操作對其進行操作。例如,我們可以使用map
和reduce
操作將所有行的大小相加,如下所示:distFile.map(lambda s: len(s)).reduce(lambda a, b: a + b)
。關於使用Spark讀取文件的一些注意事項:
如果在本地文件系統上使用路徑,則還必須在工作節點上的相同路徑上訪問該文件。將文件複製到所有工作服務器,或者使用網絡安裝的共享文件系統。
Spark的所有基於文件的輸入方法(包括
textFile
)都支持在目錄,壓縮文件和通配符上運行。例如,你可以使用textFile("/my/directory")
,textFile("/my/directory/*.txt")
和textFile("/my/directory/*.gz")
。該
textFile
方法還採用可選的第二個參數來控制文件的分區數。默認情況下,Spark爲文件的每個塊創建一個分區(HDFS中的塊默認爲128MB),但是您也可以通過傳遞更大的值來請求更大數量的分區。請注意,分區不能少於塊。除文本文件外,Spark的Python API還支持其他幾種數據格式:
SparkContext.wholeTextFiles
使您可以讀取包含多個小文本文件的目錄,並將每個小文本文件作爲(文件名,內容)對返回。與相比textFile
,會在每個文件的每一行返回一條記錄。
RDD.saveAsPickleFile
並SparkContext.pickleFile
支持以包含醃製Python對象的簡單格式保存RDD。批處理用於鹹菜序列化,默認批處理大小爲10。SequenceFile和Hadoop輸入/輸出格式
請注意,此功能當前已標記
Experimental
,僅供高級用戶使用。將來可能會替換爲基於Spark SQL的讀/寫支持,在這種情況下,Spark SQL是首選方法。
sc.textFile("file:///opt/datas/README.md").collect()
sc.textFile("hdfs://pyspark-1.bigload.com/hadoop/README.md").collect()
spark應用程序開發及運行
我是把一切環境都是裝載了虛擬機上,發現在Windows還需要再做一次環境絕望之餘看見了能遠程連接,換上自己的虛擬機的ip就行了,反正是怎麼省事怎麼來,日後要是出現問題了再改吧,感謝分享
Windows上的PyCharm 遠程連接調試pyspark
from pyspark import SparkConf,SparkContext
#創建sparkconf:設置的是spark相關的參數信息
conf=SparkConf().setMaster("local[2]").setAppName("spark0301")
#創建sparkcontext
sc=SparkContext(conf=conf)
#業務邏輯
data=[1,3,44,5]
distData=sc.parallelize(data)
print(distData.collect())
sc.stop()
後來發現map的時候出錯了,報了一些name ‘memoryview’ is not defined,看日誌中間還用到了python2.6的一些函數,我明明指定了要python3啊,後來發現還需要配一個PYSPARK_PYTHON
在我係統中python正好指向的是python2.6,所以將pyspark_python添加的環境變量
vi ~/.bash_profile
添加
export PYSPARK_PYTHON=/opt/modules/python3/bin/python3
保存退出
source ~/.bash_profile
Hive安裝
1.解壓安裝 http://archive.cloudera.com/cdh5/cdh/5/hive-1.1.0-cdh5.7.0.tar.gz
2.修改conf目錄下的hive-env.sh.template文件名稱
$ mv hive-env.sh.template hive-env.sh
3.配置hive-env.sh文件中的HADOOP_HOME
4.配置hive-env.sh文件中的HIVE_CONF_DIR
5.啓動HDFS服務
6.在HDFS上創建Hive的目錄
$ bin/hdfs dfs -mkdir -p /user/hive/warehouse
$ bin/hdfs dfs -chmod g+w /user/hive/warehouse
啓動hive服務
$ bin/hive