① spark載入hadoop本地庫的時候出現不能載入的情況要怎麼解決
Spark採用Scala語言實現,使用Scala作為應用框架。與Hadoop不同的是,Spark和Scala緊密集成,Scala像管理本地collective對象那樣管理分布式數據集。
Spark支持分布式數據集上的迭代式任務,實際上它可以在Hadoop文件系統上與Hadoop一起運行,這是由第三方集群框架Mesos實現的。Spark由加州大學伯克利分校開發,用於構建大規模、低延時的數據分析應用。
Spark集群計算架構
Spark是一種類似於Hadoop的新型集群計算框架。不同的是,Spark用於特定工作負載類型的集群計算,這種計算在多個並行操作之間重用工作數據集(如機器學習演算法)。為了優化這種類型的計算,Spark引入基於內存的集群計算,即將數據集緩存在內存中,減少訪問延遲。
Spark還引入了一個抽象概念,即彈性分布式數據集RDD(resilient distributed datasets )。RDD是一個分布在一組節點之間的只讀的對象集合。這些集合是彈性的,即能夠在部分數據集丟失的情況下重建。重建部分數據集的過程需要一種維護血統(lineage,即重建部分數據集所需的信息,說明數據是根據什麼過程產生的)的容錯機制支持。一個RDD可以是:(1)一個從文件創建的Scala對象,或(2)一個並行切片(分布在各個節點之間),或(3)從其他RDD轉換得來,或(4)改變已有RDD的持久性,如請求將已有RDD緩存在內存中。
Spark應用稱為driver,實現單個節點或一組節點上的操作。與Hadoop一樣,Spark支持單節點和多節點集群。對於多節點操作,Spark依附於Mesos集群管理器。Mesos為分布式應用提供了有效的資源共享和隔離的平台(見圖1)。這種配置允許Spark與Hadoop共用一個節點共享池。
圖1 Spark依賴於Mesos集群管理器實現資源共享和隔離
Spark編程模型
Driver在數據集上執行兩種操作:行為(action)和轉換(transformation)。action,即在數據集上執行計算,並向driver返回一個值;transformation,即從已有數據集創建新的數據集。例如,執行Rece操作(使用某個函數)、遍歷數據集(即在每個元素上執行一個函數,類似Map操作),屬於action;Map操作、Cache操作(即請求新的數據集緩存在內存中),屬於transformation。
下面我們將簡單介紹一下這兩種操作的實例。不過首先熟悉一下Scala語言。
Scala簡介
很多著名網站都使用Scala,像Twitter,LinkedIn,及Foursquare(其web應用框架叫Lift)。此外,有證據表明金融機構也對Scala的性能感興趣(例如使用EDF Trading進行衍生工具定價)。
Scala是一種多範式的編程語言,支持命令式、函數式和面向對象的編程範式。從面向對象的角度來看,Scala中的每個值都是一個對象。同理,從函數式編程的角度來看,每個函數也都是一個值。Scala還是一種靜態類型語言,其類型系統表達能力強且安全。
此外,Scala還是一種虛擬機語言,Scala編譯器生成位元組碼,使用JRE2直接在java虛擬機(JVM)上運行。這樣,Scala可以在幾乎任何支持JVM的地方運行(需要增加Scala運行時庫),並使用已有的Java庫和Java代碼。
最後,Scala是可擴展的,可以以庫的形式輕易無縫地集成到其他語言中去。
Scala實例
現在我們來看看Scala的幾個實例。Scala有自己的解釋器,可以互動式地使用它。本文不對Scala語言進行具體論述,可以參考這里。
清單1 使用解釋器快速了解一下Scala語言。啟動Scala之後,出現命令提示符,你就可以在交互模式下評估表達式和程序。創建變數有兩種方式,一是使用val創建不可變變數(稱為單一賦值的變數),二是使用var創建可變變數。如果試圖對val變數進行更改,將提示錯誤。
清單1 Scala中的變數
$ scala
Welcome to Scala version 2.8.1.final (OpenJDK Client VM, Java 1.6.0_20).
Type in expressions to have them evaluated.
Type :help for more information.
scala> val a = 1
a: Int = 1
scala> var b = 2
b: Int = 2
scala> b = b + a
b: Int = 3
scala> a = 2
<console>6: error: reassignment to val
a = 2
^
接下來,定義一個簡單的函數,計算一個Int類型的平方並返回這個值。使用def定義函數,後面緊跟函數名和參數列表。不需要指定返回值,函數本身可以推斷出返回值。注意,這與變數賦值操作類似。這里我演示了在3這個對象上執行這個函數,返回一個名為res0的結果變數(該變數是Scala解釋器自動創建的)。見清單2。
清單2 Scala中的函數
scala> def square(x: Int) = x*x
square: (x: Int)Int
scala> square(3)
res0: Int = 9
scala> square(res0)
res1: Int = 81
接著,我們看看如何在Scala中創建簡單的類(見清單3)。定義一個簡單的類Dog,接受String類型的參數(相當於構造器)。注意這里類直接接受參數,而不需要在類主體中定義這個類參數。類中只有一個列印該字元串的函數。創建一個類的實例,然後調用這個函數。注意解釋器會插入一些豎線,它們不是代碼的一部分。
清單3 Scala中的類
scala> class Dog( name: String ) {
| def bark() = println(name + " barked")
| }
defined class Dog
scala> val stubby = new Dog("Stubby")
stubby: Dog = Dog@1dd5a3d
scala> stubby.bark
Stubby barked
scala>
完成工作以後,只需要敲入:quit就可以退出Scala解釋器。
安裝Scala和Spark
首先下載和配置Scala。清單4給出了Scala的下載命令,並准備安裝。根據Spark文檔,這里使用2.8版本。
清單4 Scala安裝
$ wget http://www.scala-lang.org/downloads/distrib/files/scala-2.8.1.final.tgz
$ sudo tar xvfz scala-2.8.1.final.tgz --directory /opt/
為了使Scala可見,將以下語句添加到.bashrc文件中(假設你使用Bash):
export SCALA_HOME=/opt/scala-2.8.1.finalexport PATH=SCALAHOME/bin:PATH
然後按照清單5測試安裝。這組命令載入bashrc文件,然後快速測試了Scala解釋器。
清單5 配置並在交互模式下運行Scala
$ scala
Welcome to Scala version 2.8.1.final (OpenJDK Client VM, Java 1.6.0_20).
Type in expressions to have them evaluated.
Type :help for more information.
scala> println("Scala is installed!")
Scala is installed!
scala> :quit
$
現在可以看到Scala命令提示符了,輸入:quit退出。注意Scala在JVM上下文中執行,所以還需要JVM。我用的是Ubuntu,默認自帶了OpenJDK。
接下來,根據清單6獲取最新的Spark框架。
清單6 下載和安裝Spark框架
$ wget https://github.com/mesos/spark/tarball/0.3-scala-2.8/mesos-spark-0.3-scala-2.8-0-gc86af80.tar.gz
$ sudo tar xvfz mesos-spark-0.3-scala-2.8-0-gc86af80.tar.gz
然後,設置Spark配置文件 ./conf/spar-env.sh,添加SCALA_HOME環境變數:
export SCALA_HOME=/opt/scala-2.8.1.final
最後,使用簡單構建工具(sbt, simple build tool)更新Spark。sbt是Scala的構建工具,Spark中也使用它。在mesos-spark-c86af80子目錄下執行更新和編譯:
$ sbt/sbt update compile
注意這一步需要連接到互聯網。完成以後,按照清單7測試一下Spark。這個測試例子運行SparkPi計算pi的估計值(在單位正方形中隨機取點)。命令格式是示常式序(spark.examples.SparkPi),加上主機參數(即定義Mesos master)。本例實在localhost上運行,因為這是一個單節點集群。注意清單7執行了兩個任務,但是它們是順序執行的(任務0結束後任務1才開始)。
② java.lang.RuntimeException: Error in configuring object
1,可能是Hadoop調不到MyMapper,MyRecer造成的,試著在命令行里加了-file選項,運行的命令變成:../hadoop-0.20.0/bin/hadoop jar ../hadoop-0.20.0/contrib/streaming/hadoop-0.20.0-streaming.jar -file ./MyMapper -mapper ./MyMapper -file ./MyRecer -recer ./Recer -input doc -output test-outpu
2,解決方法,用ant編譯一下工程,然後再運行
③ 坑爹的Apache hbase 64位機裝配Snappy終於成功了怎麼解決
1.安裝基本tool
yum install gcc c++, autoconf, automake, libtool, Java 6, JAVA_HOME set, Maven 3,svn
yum Error: Cannot retrieve repository metadata (repomd.xml) for repository: xxxxx
so vim /etc/yum.repos.d/xxxxx.repo
將項[flexbox]中的enabled=1改為enabled=0
解決yum源的問題。
2.安裝Snappy
下載snappy
wget http://snappy.googlecode.com/files/snappy-1.1.1.tar.gz
然後解壓後,執行三步驟:
./configure
make
sudo make install
默認安裝路徑:/usr/local/lib下面
檢查安裝是否成功
ls /usr/local/lib/libsn*
3.安裝hadoop-snappy
3.1下載hadoop-snappy源碼
svn checkout http://hadoop-snappy.googlecode.com/svn/trunk/ hadoop-snappy
3.2.安裝hadoop-snappy
cd hadoop-snappy
mvn package
4.hadooo中部署snappy
解壓hadoop-snappy-0.0.1-SNAPSHOT.tar.gz文件,會生成hadoop-snappy-0.0.1-SNAPSHOT目錄,拷貝這個目錄下相關文件到$HADOOP_HOME/lib/native/linux-amd64-64
cp -r /hadoop-snappy-0.0.1-SNAPSHOT/lib/native/Linux-amd64-64/* $HADOOP_HOME/lib/native/Linux-amd64-64
將target目錄下的hadoop-snappy-0.0.1-SNAPSHOT.jar拷貝到$HADOOP_HOME/lib/目錄下。
修改三個文件:
hadoop-env.sh,增加內容如下:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HADOOP_HOME/lib/native/Linux-amd64-64/:/usr/local/lib/
修改core-site.xml文件,增加紅色字體部分
<property>
<name>io.compression.codecs</name>
<value>
org.apache.hadoop.io.compress.GzipCodec,
org.apache.hadoop.io.compress.DefaultCodec,
org.apache.hadoop.io.compress.BZip2Codec,
com.hadoop.compression.lzo.LzoCodec,
com.hadoop.compression.lzo.LzopCodec,
org.apache.hadoop.io.compress.SnappyCodec
</value>
</property>
5.往HBase中使用壓縮方式
當hadoop的snappy配置成功後,配置hbase就很簡單了,兩個步驟:
第一步驟復制相關jar包
cp -r $HADOOP_HOME/lib/native/Linux-amd64-64/* $HBASE_HOME/lib/native/Linux-amd64-64/*
這里需要注意下,有些版本在安裝過程中,沒有這個Linux-amd64-64這個目錄,需要手工創建下。
第二步驟配置hbase-env.sh環境變數
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HADOOP_HOME/lib/native/Linux-amd64-64/:/usr/local/lib/
export HBASE_LIBRARY_PATH=$HBASE_LIBRARY_PATH:$HBASE_HOME/lib/native/Linux-amd64-64/:/usr/local/lib/
6、重啟Hadoop、HBase 檢查安裝是否成功
cd $HBASE_HOME/bin
./hbase org.apache.hadoop.hbase.util.CompressionTest /tmp/testfile snappy
結果:Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
坑爹的Apache官網提供的是32位編譯的,在64位伺服器上會有問題。官方竟然沒有提供64位版本,要使用得自己編譯。
7.編譯hadoop2.2.0
7.1 yum install cmake zlib1g-dev pkg-config libssl-dev
7.2 安裝protobuf-2.5.0
很多博客的protobuf的安裝都是shit.不知道他們實踐過沒有,老是來去。
下載protobuf-2.5.0.tar.gz,解壓。
sudo vim /etc/profile
#protobuf
export PROTOC_HOME=/opt/protobuf-2.5.0
export PATH=$PATH:$PROTOC_HOME/src
source /etc/profile
$protoc --version
libprotoc.2.5.0
ok就這樣。根本不需要什麼configure --prefix,make,make install這么麻煩,也不成功。
7.3 下載hadoop2.2.0源碼
Download Hadoop sources.
Patch sources:
cd hadoop-2.2.0-src
wget https://issues.apache.org/jira/secure/attachment/12614482/HADOOP-10110.patch
patch -p0 < HADOOP-10110.patch
maven國外伺服器可能連不上,maven配置一下國內鏡像,在maven目錄下,conf/settings.xml,在<mirrors></mirros>里添加,原本的不要動
<mirror>
<id>nexus-osc</id>
<mirrorOf>*</mirrorOf>
<name>Nexusosc</name>
<url>http://maven.oschina.net/content/groups/public/</url>
</mirror>
同樣,在<profiles></profiles>內新添加
<profile>
<id>jdk-1.7</id>
<activation>
<jdk>1.4</jdk>
</activation>
<repositories>
<repository>
<id>nexus</id>
<name>local private nexus</name>
<url>http://maven.oschina.net/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nexus</id>
<name>local private nexus</name>
<url>http://maven.oschina.net/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
7.4 編譯mvn package -Pdist,native -DskipTests -Dtar -rf :hadoop-common
編譯完成了後,cd hadoop-2.2.0-src/hadoop-dist/target/hadoop-2.2.0
file 一下native下面的so文件
將 native/*再cp 到$hadoop_home/bin的各個data node的native/* 和native/Linux-amd64-64下。
重新運行測試,結果
④ 如何安裝hadoop本地壓縮庫
Hadoop安裝配置snappy壓縮
[一]、 實驗環境
CentOS 6.3 64位
Hadoop 2.6.0
JDK 1.7.0_75
[二]、 snappy編譯安裝
2.1、下載源碼
到官網 http://code.google.com/p/snappy/ 或者到 https://github.com/google/snappy
下載源碼,目前版本為 1.1.1。
2.2、編譯安裝
解壓 tar -zxvf snappy-1.1.1.tar.gz ,然後以 root 用戶 執行標準的三步進行編譯安裝:
/configure
make
make install
默認是安裝到 /usr/local/lib ,這時在此目錄下查看:
[hadoop@micmiu ~]$ ls -lh /usr/local/lib |grep snappy
-rw-r--r-- 1 root root 229K Mar 10 11:28 libsnappy.a
-rwxr-xr-x 1 root root 953 Mar 10 11:28 libsnappy.la
lrwxrwxrwx 1 root root 18 Mar 10 11:28 libsnappy.so ->
libsnappy.so.1.2.0
lrwxrwxrwx 1 root root 18 Mar 10 11:28 libsnappy.so.1 ->
libsnappy.so.1.2.0
-rwxr-xr-x 1 root root 145K Mar 10 11:28 libsnappy.so.1.2.0
安裝過程沒有錯誤同時能看到上面的動態庫,基本表示snappy 安裝編譯成功。
[三]、Hadoop snappy 安裝配置
3.1、hadoop 動態庫重新編譯支持snappy
hadoop動態庫編譯參考:Hadoop2.2.0源碼編譯 和 Hadoop2.x在Ubuntu系統中編譯源碼 ,只是把最後編譯的命令中增加
-Drequire.snappy :
1mvn package -Pdist,native -DskipTests -Dtar -Drequire.snappy
把重新編譯生成的hadoop動態庫替換原來的。
3.2、hadoop-snappy 下載
目前官網沒有軟體包提供,只能藉助 svn 下載源碼:
1svn checkout http://hadoop-snappy.googlecode.com/svn/trunk/
hadoop-snappy
3.3、hadoop-snappy 編譯
1mvn package [-Dsnappy.prefix=SNAPPY_INSTALLATION_DIR]
PS:如果上面 snappy安裝路徑是默認的話,即 /usr/local/lib,則此處
[-Dsnappy.prefix=SNAPPY_INSTALLATION_DIR] 可以省略,或者
-Dsnappy.prefix=/usr/local/lib
編譯成功後,把編譯後target下的 hadoop-snappy-0.0.1-SNAPSHOT.jar 復制到 $HADOOP_HOME/lib
,同時把編譯生成後的動態庫 到 $HADOOP_HOME/lib/native/ 目錄下:
1cp -r
$HADOOP-SNAPPY_CODE_HOME/target/hadoop-snappy-0.0.1-SNAPSHOT/lib/native/Linux-amd64-64
$HADOOP_HOME/lib/native/
3.4、編譯過程中常見錯誤處理
① 缺少一些第三方依賴
官方文檔中提到編譯前提需要:gcc c++, autoconf, automake, libtool, Java 6, JAVA_HOME set,
Maven 3
②錯誤信息:
[exec] libtool: link: gcc -shared
src/org/apache/hadoop/io/compress/snappy/.libs/SnappyCompressor.o
src/org/apache/hadoop/io/compress/snappy/.libs/SnappyDecompressor.o
-L/usr/local/lib -ljvm -ldl -m64 -Wl,-soname -Wl,libhadoopsnappy.so.0 -o
.libs/libhadoopsnappy.so.0.0.1
[exec] /usr/bin/ld: cannot find -ljvm
[exec] collect2: ld returned 1 exit status
[exec] make: *** [libhadoopsnappy.la] Error 1
或者
[exec] /bin/sh ./libtool --tag=CC --mode=link gcc -g -Wall -fPIC -O2 -m64
-g -O2 -version-info 0:1:0 -L/usr/local/lib -o libhadoopsna/usr/bin/ld: cannot
find -ljvm
[exec] collect2: ld returned 1 exit status
[exec] make: *** [libhadoopsnappy.la] Error 1
[exec] ppy.la -rpath /usr/local/lib
src/org/apache/hadoop/io/compress/snappy/SnappyCompressor.lo
src/org/apache/hadoop/io/compress/snappy/SnappyDecompressor.lo -ljvm -ldl
[exec] libtool: link: gcc -shared
src/org/apache/hadoop/io/compress/snappy/.libs/SnappyCompressor.o
src/org/apache/hadoop/io/compress/snappy/.libs/SnappyDecompressor.o
-L/usr/local/lib -ljvm -ldl -m64 -Wl,-soname -Wl,libhadoopsnappy.so.0 -o
.libs/libhadoopsnappy.so.0.0.1
[ant] Exiting
/home/hadoop/codes/hadoop-snappy/maven/build-compilenative.xml.
這個錯誤是因為沒有把安裝jvm的libjvm.so 鏈接到
/usr/local/lib。如果你的系統時amd64,可以執行如下命令解決這個問題:
1ln -s /usr/java/jdk1.7.0_75/jre/lib/amd64/server/libjvm.so
/usr/local/lib/
[四]、hadoop配置修改
4.1、修改 $HADOOP_HOME/etc/hadoop/hadoop-env.sh,添加:
1export
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HADOOP_HOME/lib/native/Linux-amd64-64/
4.2、修改 $HADOOP_HOME/etc/hadoop/core-site.xml:
XHTML
io.compression.codecs
org.apache.hadoop.io.compress.GzipCodec,
org.apache.hadoop.io.compress.DefaultCodec,
org.apache.hadoop.io.compress.BZip2Codec,
org.apache.hadoop.io.compress.SnappyCodec
4.3、修改 $HADOOP_HOME/etc/hadoop/mapred-site.xml 中有關壓縮屬性,測試snappy:
XHTML
maprece.map.output.compress
true
maprece.map.output.compress.codec
org.apache.hadoop.io.compress.SnappyCodec[五]、測試驗證
全部配置好後(集群中所有的節點都需要動態庫和修改配置),重啟hadoop集群環境,運行自帶的測試實例
wordcount,如果maprece過程中沒有錯誤信息即表示snappy壓縮安裝方法配置成功。
當然hadoop也提供了本地庫的測試方法 hadoop checknative :
[hadoop@micmiu ~]$ hadoop checknative
15/03/17 22:57:59 INFO bzip2.Bzip2Factory: Successfully loaded &
initialized native-bzip2 library system-native
15/03/17 22:57:59 INFO zlib.ZlibFactory: Successfully loaded &
initialized native-zlib library
Native library checking:
hadoop: true
/usr/local/share/hadoop-2.6.0/lib/native/libhadoop.so.1.0.0
zlib: true /lib64/libz.so.1
snappy: true
/usr/local/share/hadoop/lib/native/Linux-amd64-64/libsnappy.so.1
lz4: true revision:99
bzip2: true /lib64/libbz2.so.1
openssl: true /usr/lib64/libcrypto.so
⑤ 本地庫的時候出現不能載入的情況要怎麼解決
資源庫引導文件丟失所致,卸載助手,重啟後在安裝即可。
⑥ spark載入hadoop本地庫的時候出現不能載入的情況要怎麼解決
主要是jre目錄下缺少了libhadoop.so和libsnappy.so兩個文件。具體是,spark-shell依賴的是scala,scala依賴的是JAVA_HOME下的jdk,libhadoop.so和libsnappy.so兩個文件應該放到$JAVA_HOME/jre/lib/amd64下面。這兩個so:libhadoop.so和libsnappy.so。前一個so可以在HADOOP_HOME下找到,如hadoop\lib\native。第二個libsnappy.so需要下載一個snappy-1.1.0.tar.gz,然後./configure,make編譯出來,編譯成功之後在.libs文件夾下。當這兩個文件准備好後再次啟動sparkshell不會出現這個問題。
⑦ 如何使用java snappy壓縮文件
使用下面命令
tar -zcvf target.tgz source/
tar -jcvf target.tar.bz2 source/
tar打包,gzip壓縮,bzip2壓縮
man tar,man gzip,man bzip 具有例子及解釋,關於linux命令的使用情況,我最近在看一本書籍,不過是電子版的《linux就該這么學》,明年3月份即將出版,你到時可以購買一本好好看看,關於命令的參數講解得非常的詳細。
⑧ 錯誤: 找不到或無法載入主類 Djava.library.path=.usr.hadoop.hadoop-2.8.0.lib:.
最近,打算Hbase建表用snappy壓縮時,碰到一些Hadoop本地庫的問題。其實這些問題是一直存在的,只是不影響正常使用,就沒有引起重視。這次希望徹底解決以下問題:
問題一:執行start-dfs.sh時出現以下日誌
xxxx: Java HotSpot(TM) 64-Bit Server VM warning: You have loaded library /usr/local/hadoop-2.4.0/lib/native/libhadoop.so which might have disabled stack guard. The VM will try to fix the stack guard now.
xxxx: It's highly recommended that you fix the library with 'execstack -c <libfile>', or link it with '-z noexecstack'.
這是因為官網提供的版本本地庫是32位的,在64位主機環境下無法執行。需要下載hadoop源碼進行編譯(如何編譯源碼可以上網搜索),編譯成功後,找到native下的文件拷貝到${HADOOP_HOME}/lib/native目錄下即可。
問題二:執行start-dfs.sh時出現以下日誌
WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
在網上找到的所有文章中,都是說在hadoop-env.sh中加入以下兩行配置:
export HADOOP_COMMON_LIB_NATIVE_DIR=${HADOOP_HOME}/lib/native
export HADOOP_OPTS="-Djava.library.path=${HADOOP_HOME}/lib/"
但是在測試過程中,加入以上配置還是會提示告警信息,說明本地庫未載入成功。
開啟debug:
export HADOOP_ROOT_LOGGER=DEBUG,console
執行start-dfs.sh,發現以下日誌:
DEBUG util.NativeCodeLoader: Failed to load native-hadoop with error: Java.lang.UnsatisfiedLinkError: no hadoop in java.library.path
從日誌中可以看出hadoop庫不在java.library.path所配置的目錄下,應該是java.library.path配置的路徑有問題。在hadoop-env.sh中重新配置:
export HADOOP_COMMON_LIB_NATIVE_DIR=${HADOOP_HOME}/lib/native
export HADOOP_OPTS="-Djava.library.path=${HADOOP_HOME}/lib/native/"
執行start-dfs.sh,告警信息不再顯示。經測試,其實只需export HADOOP_OPTS即可解決問題。
驗證本地庫是否載入成功:hadoop checknative
15/08/18 10:31:17 INFO bzip2.Bzip2Factory: Successfully loaded & initialized native-bzip2 library system-native
15/08/18 10:31:17 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
Native library checking:
hadoop: true /usr/local/hadoop-2.4.0/lib/native/libhadoop.so.1.0.0
zlib: true /lib64/libz.so.1
snappy: true /usr/local/hadoop-2.4.0/lib/native/Linux-amd64-64/libsnappy.so.1
lz4: true revision:99
bzip2: true /lib64/libbz2.so.1
以上說明本地庫已經載入成功。
⑨ OushuDB 快速入手
快速入手
本節將通過RPM安裝物理機版本的一個Centos/Redhat 7.x單節點集群。假設我們安裝的伺服器hostname為oushu(可以通過命令:hostname 直接獲取,請將文中所有出現的oushu替換為實際的hostname)。此次部署大約需要您30分鍾時間。
安裝准備
首先使用root登錄。 查看有無avx指令:
cat /proc/cpuinfo | grep avx
安裝oushu yum源:
#Redhat/CentOS 7.0, 7.1, 7.2系統並且包含avx指令請配置以下YUM源:
wget -P /etc/yum.repos.d/ $獲取的repo url
#Redhat/CentOS 7.0, 7.1, 7.2系統但不包含avx指令請配置以下YUM源:
wget -P /etc/yum.repos.d/ $獲取的repo url
#Redhat/CentOS 7.3系統並且包含avx指令請配置以下YUM源:
wget -P /etc/yum.repos.d/ $獲取的repo url
#Redhat/CentOS 7.3系統但不包含avx指令請配置以下YUM源:
wget -P /etc/yum.repos.d/ $獲取的repo url
#Redhat/CentOS 7.4系統並且包含avx指令請配置以下YUM源:
wget -P /etc/yum.repos.d/ $獲取的repo url
#Redhat/CentOS 7.4系統但不包含avx指令請配置以下YUM源:
wget -P /etc/yum.repos.d/ $獲取的repo url
禁用selinux:
sed -i "s/^SELINUX\=enforcing/SELINUX\=disabled/g" /etc/selinux/configsetenforce 0
關閉防火牆:
systemctl stop iptablessystemctl disable iptablessystemctl stop firewalldsystemctl disable firewalld
安裝Java:
yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-develmkdir -p /usr/java//注意查看本機的java版本ln -s /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-2.b16.el7_4.x86_64 /usr/java/default
安裝HDFS
安裝HDFS並且創建其使用的目錄,這里我們假設我們的機器上有兩個數據盤,分別mount在/data1和/data2目錄,如果您有多塊盤,下面的目錄創建以及配置文件需要做相應的更改。尤其對HDFS的數據目錄以及OushuDB的臨時文件目錄位置。
#由於hadoop依賴於特定版本的snappy,請先卸載snappy確保安裝的順利進行yum -y remove snappy#安裝HDFS RPM,RPM安裝會自動創建hdfs用戶yum install -y hadoop hadoop-hdfs#在/data1上創建NameNode目錄mkdir -p /data1/hdfs/namenode#在每塊盤上創建DataNode數據目錄,並更改許可權mkdir -p /data1/hdfs/datanodechmod -R 755 /data1/hdfschown -R hdfs:hadoop /data1/hdfsmkdir -p /data2/hdfs/datanodechmod -R 755 /data2/hdfschown -R hdfs:hadoop /data2/hdfs
復制下列文件到/etc/hadoop/conf/中(遇到覆蓋提示,請輸入y,表示確認覆蓋)
http://www.oushu.com/docs/ch/_downloads//core-site.xml.
http://www.oushu.com/docs/ch/_downloads//hdfs-site.xml.
http://www.oushu.com/docs/ch/_downloads//hadoop-env.sh.
編輯/etc/hadoop/conf/core-site.xml文件中的fs.defaultFS屬性,其他系統通過這個url來訪問HDFS,註:在做format之前,請確認已經將core-site.xml中fs.defaultFS的值由oushu替換成hostname。:
<property><name>fs.defaultFS</name><value>hdfs://oushu:9000</value></property>
編輯 /etc/hadoop/conf/hadoop-env.sh,加入下面參數。這些參數配置了Java Home,Hadoop配置文件,日誌文件目錄,以及JVM選項。根據存儲的HDFS數據量大小,需要適當修改NameNode的-Xmx值。HDFS數據量越大,-Xmx值應該設的越大。
export JAVA_HOME="/usr/java/default"
export HADOOP_CONF_DIR="/etc/hadoop/conf"
export HADOOP_NAMENODE_OPTS="-Xmx6144m -XX:+UseCMSInitiatingOccupancyOnly -XX:=70"
export HADOOP_DATANODE_OPTS="-Xmx2048m -Xss256k"
export HADOOP_LOG_DIR=/var/log/hadoop/$USER
因為/etc/hadoop/conf/hdfs-site.xml中默認使用/data1和/data2兩塊盤,如果你有多塊盤,你需要更改dfs.data.dir屬性,使得HDFS用到所有盤:
<property><name>dfs.data.dir</name><value>/data1/hdfs/datanode,/data2/hdfs/datanode</value><final>true</final></property>
格式化NameNode,並啟動NameNode和DataNode。
註:在format過程中如果詢問是否要format,請輸入y,表示確認。
sudo -u -E hdfs hdfs namenode -formatsudo -u -E hdfs /usr/hdp/current/hadoop-client/sbin/hadoop-daemon.sh start namenodesudo -u -E hdfs /usr/hdp/current/hadoop-client/sbin/hadoop-daemon.sh start datanode
HDFS日誌在/var/log/hadoop/hdfs/中。如果因為配置出錯,可以查看錯誤日誌,並依據改正。
檢查hdfs是否成功運行:
su - hdfshdfs dfsadmin -reporthdfs dfs -mkdir /testnodehdfs dfs -put /usr/hdp/current/hadoop-client/sbin/hadoop-daemon.sh /testnode/hdfs dfs -ls -R /
你也可以查看HDFS web界面:http://oushu:50070/
安裝OushuDB
安裝OushuDB RPM,OushuDB RPM安裝會自動創建gpadmin用戶。
yum install -y hawq
在配置文件/etc/sysctl.conf添加內容
kernel.shmmax = 1000000000kernel.shmmni = 4096kernel.shmall = 4000000000kernel.sem = 250 512000 100 2048kernel.sysrq = 1kernel.core_uses_pid = 1kernel.msgmnb = 65536kernel.msgmax = 65536kernel.msgmni = 2048net.ipv4.tcp_syncookies = 0net.ipv4.conf.default.accept_source_route = 0net.ipv4.tcp_tw_recycle = 1net.ipv4.tcp_max_syn_backlog = 200000net.ipv4.conf.all.arp_filter = 1net.ipv4.ip_local_port_range = 10000 65535net.core.netdev_max_backlog = 200000fs.nr_open = 3000000kernel.threads-max = 798720kernel.pid_max = 798720# increase networknet.core.rmem_max=2097152net.core.wmem_max=2097152net.core.somaxconn=4096
使系統配置生效:
sysctl -p
創建OushuDB本地元數據目錄和臨時文件目錄:
#創建OushuDB本地元數據目錄,下面兩個目錄分別為master和segment使用mkdir -p /data1/hawq/masterddmkdir -p /data1/hawq/segmentdd#創建OushuDB臨時文件目錄,每塊盤需要創建一個臨時文件目錄,這樣可以讓OushuDB使用到所有盤。mkdir -p /data1/hawq/tmpchmod -R 755 /data1/hawqchown -R gpadmin:gpadmin /data1/hawqmkdir -p /data2/hawq/tmpchmod -R 755 /data2/hawqchown -R gpadmin:gpadmin /data2/hawq
在HDFS上創建OushuDB數據目錄:
sudo -u hdfs hdfs dfs -mkdir -p /hawq_defaultsudo -u hdfs hdfs dfs -chown -R gpadmin /hawq_default
編輯/usr/local/hawq/etc/slaves,去掉文件中的localhost,並加入oushu。slaves文件中存放所有slave節點的地址,每行一個節點。修改後文件為:
oushu
編輯/usr/local/hawq/etc/hawq-site.xml, 因為/usr/local/hawq/etc/hawq-site.xml中默認使用/data1和/data2兩塊盤,如果你有多塊盤,你需要更改hawq_master_temp_directory和hawq_segment_temp_directory值,用到所有盤:
<property><name>hawq_master_address_host</name><value>oushu</value><description>The host name of hawq master.</description></property><property><name>hawq_dfs_url</name><value>oushu:9000/hawq_default</value><description>URL for accessing HDFS.</description></property><property><name>magma_nodes_url</name><value>localhost:6666</value><description>urls for accessing magma.</description></property><property><name>hawq_master_directory</name><value>/data1/hawq/masterdd</value><description>The directory of hawq master.</description></property><property><name>hawq_segment_directory</name><value>/data1/hawq/segmentdd</value><description>The directory of hawq segment.</description></property><property><name>hawq_master_temp_directory</name><value>/data1/hawq/tmp,/data2/hawq/tmp</value><description>The temporary directory reserved for hawq master. Note: please DONOT add " " between directries.</description></property><property><name>hawq_segment_temp_directory</name><value>/data1/hawq/tmp,/data2/hawq/tmp</value><description>The temporary directory reserved for hawq segment. Note: please DONOT add " " between directories.</description></property>
OushuDB4.0版本新增Magma的單獨配置和啟停功能,使用magam服務時,首先創建magma node數據目錄:
# 創建mamga node數據目錄mkdir -p /data1/hawq/magma_segmentddmkdir -p /data2/hawq/magma_segmentddchown -R gpadmin:gpadmin /data1/hawqchown -R gpadmin:gpadmin /data2/hawq
然後編輯配置/usr/local/hawq/etc/magma-site.xml:
<property><name>nodes_file</name><value>slaves</value><description>The magma nodes file name at GPHOME/etc</description></property><property><name>node_data_directory</name><value>file:///data1/hawq/magma_segmentdd,file:///data2/hawq/magma_segmentdd</value><description>The data directory for magma node</description></property><property><name>node_log_directory</name><value>~/hawq-data-directory/segmentdd/pg_log</value><description>The log directory for magma node</description></property><property><name>node_address_port</name><value>6666</value><description>The port magma node listening</description></property><property><name>magma_range_number</name><value>2</value></property><property><name>magma_replica_number</name><value>3</value></property><property><name>magma_datadir_capacity</name><value>3</value></property><property><name>compact_trigger_ap_ratio_limit</name><value>0.2</value><description>The threshold of triggering compact in MAGMAAP format.</description></property><property><name>compact_trigger_tp_ratio_limit</name><value>0.5</value><description>The threshold of triggering compact in MAGMAAP catalog</description></property>
以gpadmin用戶登錄:
su - gpadmin
設置免密碼ssh:
source /usr/local/hawq/greenplum_path.shhawq ssh-exkeys -h oushu
初始化OushuDB,在詢問是否初始化時,請輸入y,表示確認初始化。
hawq init cluster //OushuDB4.0 默認不啟動magma服務
hawq init cluster --with_magma //OushuDB4.0新增,3.X版本不支持該選項
// OushuDB4.0版本新增--with_magma選項,但只有hawq init|start|stop cluster命令可以帶--with_magma選項。
OushuDB管理工具日誌在/home/gpadmin/hawqAdminLogs/中,OushuDB master日誌和segment日誌分別在/data1/hawq/masterdd/pg_log/ 和/data1/hawq/segmentdd/pg_log/中。如果因為配置出錯,可以查看錯誤日誌,並依據改正。
檢查OushuDB是否運行正常:
su - gpadminsource /usr/local/hawq/greenplum_path.shpsql -d postgresselect * from gp_segment_configuration; //確定所有節點是up狀態create table t(i int);insert into t select generate_series(1,1000);select count(*) from t;
體驗新執行器
本章節通過TPCH lineitem 表來展示新執行器的使用。
建立e_lineitem外部表用來生成TPCH lineitem 數據,
CREATE EXTERNAL WEB TABLE E_LINEITEM ( L_ORDERKEY INT8 ,L_PARTKEY INTEGER ,L_SUPPKEY INTEGER ,L_LINENUMBER INTEGER ,L_QUANTITY FLOAT ,L_EXTENDEDPRICE FLOAT ,L_DISCOUNT FLOAT ,L_TAX FLOAT ,L_RETURNFLAG VARCHAR(1) ,L_LINESTATUS VARCHAR(1) ,L_SHIPDATE TEXT ,L_COMMITDATE TEXT ,L_RECEIPTDATE TEXT ,L_SHIPINSTRUCT CHAR(25) ,L_SHIPMODE VARCHAR(10) ,L_COMMENT VARCHAR(44) )EXECUTE 'bash -c "$GPHOME/bin/dbgen -b $GPHOME/bin/dists.dss -T L -s 1 -N 6 -n $((GP_SEGMENT_ID + 1))"'on 6 format 'text' (delimiter '|');
創建ORC 表
CREATE TABLE lineitem( L_ORDERKEY INT8,L_PARTKEY INTEGER,L_SUPPKEY INTEGER,L_LINENUMBER INTEGER,L_QUANTITY FLOAT,L_EXTENDEDPRICE FLOAT,L_DISCOUNT FLOAT,L_TAX FLOAT,L_RETURNFLAG TEXT,L_LINESTATUS TEXT,L_SHIPDATE TEXT,L_COMMITDATE TEXT,L_RECEIPTDATE TEXT,L_SHIPINSTRUCT TEXT,L_SHIPMODE TEXT,L_COMMENT TEXT)WITH (APPENDONLY = true, OIDS = FALSE, ORIENTATION = orc);
插入數據
INSERT INTO lineitem SELECT * FROM e_lineitem;
從下面的例子可以看到新執行器對於性能的大幅改進。
-----獲取錶行數------postgres=# set new_executor = on;SETpostgres=# SELECT COUNT(*) FROM lineitem;count---------6001215(1 row)Time: 17.006 mspostgres=# set new_executor = off;SETpostgres=# SELECT COUNT(*) FROM lineitem;count---------6001215(1 row)Time: 213.248 ms-----TPCH 查詢 1 ------postgres=# set new_executor = on;SETpostgres=# SELECTl_returnflag,l_linestatus,sum(l_quantity)::bigint as sum_qty,sum(l_extendedprice)::bigint as sum_base_price,sum(l_extendedprice * (1 - l_discount))::bigint as sum_disc_price,sum(l_extendedprice * (1 - l_discount) * (1 + l_tax))::bigint as sum_charge,avg(l_quantity)::bigint as avg_qty,avg(l_extendedprice)::bigint as avg_price,avg(l_discount)::bigint as avg_disc,count(*) as count_orderFROMlineitemWHEREl_shipdate <= '1998-08-20'GROUP BYl_returnflag,l_linestatus;l_returnflag | l_linestatus | sum_qty | sum_base_price | sum_disc_price | sum_charge | avg_qty | avg_price | avg_disc | count_order--------------+--------------+----------+----------------+----------------+--------------+---------+-----------+----------+-------------R | F | 37719753 | 56568041381 | 53741292685 | 55889619120 | 26 | 38251 | 0 | 1478870N | F | 991417 | 1487504710 | 1413082168 | 1469649223 | 26 | 38284 | 0 | 38854A | F | 37734107 | 56586554401 | 53758257135 | 55909065223 | 26 | 38273 | 0 | 1478493N | O | 73808911 | 110700990251 | 105167436999 | 109377979031 | 26 | 38248 | 0 | 2894278(4 rows)Time: 234.376 mspostgres=# set new_executor = off;SETpostgres=# SELECTl_returnflag,l_linestatus,sum(l_quantity)::bigint as sum_qty,sum(l_extendedprice)::bigint as sum_base_price,sum(l_extendedprice * (1 - l_discount))::bigint as sum_disc_price,sum(l_extendedprice * (1 - l_discount) * (1 + l_tax))::bigint as sum_charge,avg(l_quantity)::bigint as avg_qty,avg(l_extendedprice)::bigint as avg_price,avg(l_discount)::bigint as avg_disc,count(*) as count_orderFROMlineitemWHEREl_shipdate <= '1998-08-20'GROUP BYl_returnflag,l_linestatus;l_returnflag | l_linestatus | sum_qty | sum_base_price | sum_disc_price | sum_charge | avg_qty | avg_price | avg_disc | count_order--------------+--------------+----------+----------------+----------------+--------------+---------+-----------+----------+-------------R | F | 37719753 | 56568041381 | 53741292685 | 55889619120 | 26 | 38251 | 0 | 1478870N | F | 991417 | 1487504710 | 1413082168 | 1469649223 | 26 | 38284 | 0 | 38854A | F | 37734107 | 56586554401 | 53758257135 | 55909065223 | 26 | 38273 | 0 | 1478493N | O | 73808911 | 110700990251 | 105167436999 | 109377979031 | 26 | 38248 | 0 | 2894278(4 rows)Time: 2341.147 ms